【问题标题】:Concatenated String Echos Out of Order in PHPPHP中的串联字符串回声乱序
【发布时间】:2015-02-10 04:15:05
【问题描述】:

这个短脚本有问题,过去一天让我很生气。

我正在尝试将 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

我想要的输出是这样的:

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

为什么在 $row[0] 之后连接的任何东西都被推到字符串的前面?为什么“

我怎样才能达到我想要的输出?

来自 cmets

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

【问题讨论】:

  • 我不认为它被推到了前面。其他事情正在发生,例如部分可见的损坏的 HTML。您在查看浏览器的页面源吗?您至少会在页面源代码中看到开头的&lt;iframe
  • 好吧,我想我应该补充一点,我正在服务器的命令行中执行此操作。我需要稍后使用 $foo 来针对另一个数据库表运行以删除一些行。
  • $row[0] 值是否包含回车符(没有换行符)?这将导致命令行返回到 0 位置然后覆盖该行。你可以使用trim($row[0]) 来防止这种情况发生。
  • 事实上,我认为 db 值末尾的 CR 会产生您所看到的奇怪输出。
  • 一个...的儿子,就是 trim() 解决了它。我爱你们,谢谢!

标签: php mysql echo string-concatenation


【解决方案1】:

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

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

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

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

您可以通过检查带有bin2hex() 的字符串并在末尾查找0d 来测试它,或者只是检查strlen() 是预期长度,而不是预期长度加一。

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

【讨论】:

  • 我想这更像是一个 mysql 问题,但是假设该特定 db 表中的所有值都存在 CR 是否安全?例如,假设某些值没有 CR,我不是要从我的 db 值中删除最后一个值吗?我该怎么办?
  • @BrettK。也许,也许不是。如果预计它们都是 20 个字符,您可以SELECT * FROM table WHERE LENGTH(something) &gt; 20 来识别违规者。它可能发生在输入源。
  • 哦,你在评论中添加了 - 不,trim() 不会删除最后一个字符。它只删除空白字符 - 空格、换行符、回车符、制表符。
  • 太棒了,感谢您的帮助,如果我有代表支持我会大声笑。
最近更新 更多