【发布时间】:2012-01-17 05:53:16
【问题描述】:
过去两个(接近三个)小时一直困扰着我 - 而且它只在一个平台上表现出来。
这是一个 SQL 表的架构:
CREATE TABLE cache ( url TINYTEXT,
data MEDIUMTEXT,
retrieval_timestamp INT,
ttl INT )
现在,我的 PHP 代码使用 SQLite PDO 驱动程序在磁盘上创建一个数据库文件。执行上面的 SQL 语句并创建表。到目前为止一切顺利 - 我所有的测试机器都成功执行了该语句。
接下来,我将数据插入表中 - 再次,所有机器都正确插入数据。因为 SQLite 将数据库存储在一个文件中,所以我只能在 SQLite Database Browser 中打开它并验证数据是否已插入。
这就是问题所在:我无法在运行 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();
在 CentOS 机器上,上面的代码执行没有返回任何错误。但是,我没有返回预期的行(其他机器使用 exact 相同的查询返回),我什么也没得到 - 没有行。如果我把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
【问题讨论】: