为什么只在Windows上运行PHP而不是在CentOS上显示此行?

Nat*_*man 9 php sql sqlite

在过去的两个小时(接近三个小时)里,这一直困扰着我 - 它只能在一个平台上体现出来.

这是SQL表的模式:

CREATE TABLE cache ( url                 TINYTEXT,
                     data                MEDIUMTEXT,
                     retrieval_timestamp INT,
                     ttl                 INT )
Run Code Online (Sandbox Code Playgroud)

现在,我的PHP代码使用SQLite PDO驱动程序在磁盘上创建数据库文件.执行上面的SQL语句并创建表.到目前为止一切顺利 - 我的所有测试机器都成功执行了该语句.

接下来,我将数据插入表中 - 同样,所有机器都插入数据而没有错误.因为SQLite将数据库存储在一个文件中,所以我只能在SQLite数据库浏览器中打开它并验证是否插入了数据.

这是问题发生的地方:我无法在运行PHP 5.2的CentOS机器上检索数据.

这是我正在使用的PHP代码(请记住,它适用于Windows上的PHP 5.3):

$statement = $this->database->prepare('SELECT data FROM cache WHERE url = ? AND retrieval_timestamp + ttl >= ?');

$statement->bindValue(1, $url);
$statement->bindValue(2, time(), PDO::PARAM_INT);

$statement->execute();
Run Code Online (Sandbox Code Playgroud)

在CentOS机器上,上述代码执行时不会返回任何错误.但是没有返回预期的行(其他机器返回完全相同的查询),我没有得到任何东西 - 没有行.如果我SELECT data改为SELECT data, retrieval_timestamp + ttl,我实际上可以查看表达式的结果并手动将其与当前时间戳进行比较 - 并且数据确实满足条件,因此应该在结果中返回.

如果我删除该WHERE子句的第二部分,则返回预期的数据,但当然,这会破坏表的目的:)

我究竟做错了什么?


更新:它变得更奇怪 - 当我使用query而不是prepare手动指定参数时,它可以工作(在CentOS机器上).所以它看起来是准备好的语句的问题.

这是SQLite文件:http://dl.dropbox.com/u/31080052/test.sqlite
这是我正在运行的查询:

SELECT data FROM cache WHERE url = 'c' AND retrieval_timestamp + ttl >= 1326780275
Run Code Online (Sandbox Code Playgroud)

ceg*_*ult 0

或多或少是在黑暗中刺伤:您是否尝试过将问号更改为“:values”?IE:

$statement = $this->database->prepare('SELECT data FROM cache WHERE url = :url AND retrieval_timestamp + ttl >= :rval');
$statement->bindValue(":url", $url);
$statement->bindValue(":rval", time(), PDO::PARAM_INT);

$statement->execute();
Run Code Online (Sandbox Code Playgroud)