PHP中的串联字符串回声无序


Concatenated String Echos Out of Order in PHP

我对这个短脚本有一个问题,这个问题在过去的一天里一直困扰着我。

我试图将mysql数据库表中的一个值连接到一个字符串中,结果输出不正常。

考虑以下代码:

$result = mysqli_query($con, "SELECT something FROM table");
while ($row = mysqli_fetch_array($result)){
    $foo ='<iframe src="http://www.website.com/embed/' . $row[0] . '%';
    echo $foo;
}

其输出结果为:

%iframe src="http://www.website.com/embed/84a42780062ce000dcb5

我想要的输出是:

<iframe src="http://www.website.com/embed/84a42780062ce000dcb5%

为什么$row[0]之后连接的任何内容都会被推到字符串的前面?为什么"<"在输出中被完全忽略?

如何实现我想要的输出?

来自评论

我应该补充一下,我是在服务器的命令行中执行此操作的。

鉴于您在服务器的命令行中看到了这个奇怪的输出,这表明存储在数据库中的数据出现了问题。特别要注意$row[0]字符串末尾的回车字符'r(十六进制0D)。

如果存在一个CR,而后面没有换行'n,则会导致控制台返回到当前行的开头。然后,它在行首打印%,覆盖<

这可以通过将数据库值封装在trim()中来解决。

$foo ='<iframe src="http://www.website.com/embed/' . trim($row[0]) . '%';

您可以通过使用bin2hex()检查字符串并在末尾查找0d来测试它,或者简单地检查strlen()是否为预期长度,而不是预期长度加1。

如果不希望出现这些回车,则应考虑修复表中或其输入源中的数据,以避免将来出现此问题。