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

Concatenated String Echos Out of Order in PHP

这个简短的脚本在过去一天一直困扰着我。

我正在尝试将 mysql 数据库 table 中的一个值连接成一个字符串,但输出是乱序的。

考虑以下代码:

$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] 字符串末尾的回车 return 字符 \r(十六进制 0D)。

如果出现 CR 后没有换行符 \n,它将导致控制台 return 到当前行的开头。然后它在行首打印 %,覆盖 <

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

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

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

如果那些回车符 return 不在此处,您应该考虑修复 table 或其输入源中的数据以避免将来出现此问题。