几年来我一直在使用 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设置?5.3.13 版本的 PHP 的 PHP 错误?调试时在字符串中看不到奇怪的字符?因为今晚太累而没有看到明显的东西?