PHP字符串连接的奇怪行为

时间:2014-02-15 00:05:23

标签: php

当我发现这个奇怪的错误/功能时,我正在调试MySQL查询:

echo 'a'.'a'; // aa

echo 'a'.'<a'; // a (expecting a<a)

echo 'a'.'<a>'; // a<a>

echo 'a'.'<'; // a<

为什么PHP表现得像这样?我在SO上发现了一些类似的问题,这些问题与将HTML作为文本输出而不进行编码有关。我正在查看输出为文本,而不是HTML,而<a仍然没有出现。

我在运行PHP 5.3或5.4的两个不同的PHP环境中尝试了这一点,它们都表现得这样。

如果有帮助,这就是让我发现错误/功能的行:

$query.=' FROM links WHERE '.$results[0]['date'].'<date ';

修改: 阅读问题,人们。

我将输出视为字符串,而不是HTML。如果PHP自动解析字符串文字,那么PHP就会出现严重问题。

对于推荐&lt;的人,为什么你希望它适用于MySQL。

编辑2:忘记浏览器。

我在Windows CMD中运行它,它正在输出我上面输入的内容。如果您确信我是愚蠢的并且我没有看到<a,因为我将其视为HTML,请阅读问题,您会看到echo 'a'.'<a>';输出{{1} }。

我刚刚在http://writecodeonline.com/php/上尝试过,而a<a>正按预期显示。好像它与我的电脑有关,我正在使用WampServer 2.4。

3 个答案:

答案 0 :(得分:3)

把它放在这里,因为它在评论中会非常难看。这直接来自PHP-cli:

php > echo 'a'.'a'; // aa
aa
php > echo 'a'.'<a'; // a (expecting a<a)
a<a
php > echo 'a'.'<a>'; // a<a>
a<a>
php > echo 'a'.'<'; // a<
a<

它实际上是上面代码的剪切和粘贴,正如您所看到的,您期望的是PHP输出的确切内容。

如果你没有得到这个,那么你正在做一些不同的事情。

答案 1 :(得分:0)

尝试使用<

替换相关回音中的&lt;
echo 'a'.'&lt;a'; 

答案 2 :(得分:0)

我遇到了一个非常相似的行为,在此行为中,使用concat运算符会删除内容,顺便说一下也是从<开始。 apache错误日志显示该脚本导致了分段错误。

我无法在测试脚本中复制它,所以我发现concat操作问题不是问题的根源,而是症状。

事实证明,我们早些时候在同一脚本中通过PECL ssh2进行了操作,这导致了段错误并随后弄乱了以后发生的事情。

所以我的建议是检查错误日志并查找问题的间接原因。