PHP连接删除了一些字符,太疯狂了!PHP 内部错误


PHP concatenation delete some characters, it's crazzy ! PHP internal bug?

我已经使用PHP开发了好几年了。

但是今天我阻止了一个我无法解释的问题,这是一个非常简单的串联,但它的结果很糟糕(结果字符串末尾缺少字符);

这是代码:

$select = $this -> phpSqlCreator -> processSELECT2($this -> phpSqlParser -> parsed);
$from = $this -> phpSqlCreator -> processFROM2($this -> phpSqlParser -> parsed['FROM']);
$where = $this -> whereString;
$sql = $select . ' ' . $from . ' ' . $where;

当我调试这段代码时,这就是我所看到的。

$select变量包含以下字符串:

SELECT DISTINCT t.id as "t.id",t.creation_date as "t.creation_date",t.default_language_code as 
 "t.default_language_code",t.name as "t.name",t.description as "t.description",t.document_store_path as 
 "t.document_store_path",t.type as "t.type",t.left_value as "t.left_value",t.right_value as "t.right_value",t.event_id as 
 "t.event_id",t.parent_id as "t.parent_id",t2.id as "t2.id",t2.creation_date as 
 "t2.creation_date",t2.default_language_code as "t2.default_language_code",t2.name as "t2.name",t2.description 
 as "t2.description",t2.document_store_path as "t2.document_store_path",t2.type as "t2.type",t2.left_value as 
 "t2.left_value",t2.right_value as "t2.right_value",t2.event_id as "t2.event_id",t2.parent_id as "t2.parent_id"

然后,$from变量包含以下字符串:

FROM team t , (SELECT t.* FROM team t LEFT JOIN team_role tr ON (t.id = tr.team_id) WHERE 
 tr.participant_id = ? UNION SELECT t.* FROM team t LEFT JOIN team_role tr ON (t.id = tr.team_id) LEFT JOIN 
 unit_role ur ON (tr.unit_id = ur.unit_id) WHERE ur.participant_id = ?) as dt LEFT JOIN team t2 ON ("t.parent_id" = t2.id)

$where变量包含:

WHERE t.left_value < dt.left_value and t.right_value > dt.right_value and t.event_id = dt.event_id

$sql变量包含:

SELECT DISTINCT t.id as "t.id",t.creation_date as "t.creation_date",t.default_language_code as 
 "t.default_language_code",t.name as "t.name",t.description as "t.description",t.document_store_path as 
 "t.document_store_path",t.type as "t.type",t.left_value as "t.left_value",t.right_value as "t.right_value",t.event_id as 
 "t.event_id",t.parent_id as "t.parent_id",t2.id as "t2.id",t2.creation_date as 
 "t2.creation_date",t2.default_language_code as "t2.default_language_code",t2.name as "t2.name",t2.description 
 as "t2.description",t2.document_store_path as "t2.document_store_path",t2.type as "t2.type",t2.left_value as 
 "t2.left_value",t2.right_value as "t2.right_value",t2.event_id as "t2.event_id",t2.parent_id as "t2.parent_id" FROM 
 team t , (SELECT t.* FROM team t LEFT JOIN team_role tr ON (t.id = tr.team_id) WHERE tr.participant_id = ? 
 UNION SELECT t.* FROM team t LEFT JOIN team_role tr ON (t.id = tr.team_id) LEFT JOIN unit_role ur ON 
 (tr.unit_id = ur.unit_id) WHERE ur.participant_id = ?) as dt LEFT JOIN team t2 ON (

串联非常简单但不起作用,缺少$from字符串变量的末尾,也缺少$where字符串变量的完整内容。我不明白,因为代码非常简单。

此外,这种代码的平静是由一组自动单元测试执行的。这很奇怪,因为当使用 PHPUnit(所以 PHP Cli)执行代码时,串联的结果是好的(我们所有的测试都是成功的)。

只有在我们的 Web 应用程序(Windows 8 机器上的标准 Apache 2.2.22 + PHP 5.3.13 设置)中执行代码时,才会遇到这种串联问题。

你知道是什么导致了这个非常奇怪的问题吗?PHP 设置?PHP 5.3.13 版本的 PHP 错误?调试时在字符串中看不到奇怪的字符?我没看到什么明显的东西,因为我今晚太累了?

显然$sql操作限制为 1024 个字符。 要么是某个程序在下一个地址错误地存储了某些东西,要么$sql变量在某处设置了大小限制。

据我所知,在 php 中,一个字符串可以大到 2GB。php.ini配置文件中有一个memory_limit指令,但我无法想象您将其设置为 1024 字节 (1K)

嗨,

zipzip,感谢您的回复。

我终于发现串联很好,而且是我的 IDE Eclipse 没有将所有字符都显示在我的字符串中。

更多信息可以在这里找到:http://www.eclipse.org/forums/index.php/m/492856/

所以我的问题不是问题。

多谢。

巴蒂斯特