2012-01-17 60 views
9

这一直困扰着我最后两个小时(接近三个小时) - 它只在一个平台上显现。为什么在Windows上运行PHP而不是在CentOS上只显示此行?

下面是一个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代码(并记住它工作在PHP 5.3在Windows上):

$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的机器,上面的代码执行不返回任何错误。但不是返回预期的行(其他机器以相同的查询返回)我什么也没有 - 没有行。如果我将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 

回答

0

或多或少在黑暗中刺:你尝试过改变问题的标志为“ :值“?即:

$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(); 
+0

是的,我害怕我做了 - 没有区别。 – 2012-01-17 17:53:26

0

我没有看过你连接SQLite的文件,但检查正在使用的驱动程序/扩展版本 - SQLite中添加某些功能从一个版本到下一个。请在下面的文档链接中查看有关迁移的部分。我很确定操作系统的差异不会使SQL停止工作。

http://www.sqlite.org/docs.html

1

你检查是否时钟两台机器上同步?

+0

是的,我确信这两个时钟是同步的(我已经重复检查过) - 尽管它确实不会有什么区别,因为我对相同的数据运行了相同的查询。 – 2012-01-18 21:26:13

1

两个可能性,映入脑海:

  • 是CentOS的安装32位?您是否尝试读取/写入不适合32位int的时间戳?
  • 时间戳是否定的?很久以前,我们遇到了一个问题,那就是Debian似乎不支持负面时间戳,并且因为Slackware而将一个项目从Slackware上移开,导致了各种各样的问题。
+0

不幸的是,我不认为这些都是选项,因为当我使用'bindValue()'时,问题仅表现出来,而不是直接在查询中插入完全相同的值。 – 2012-01-22 02:37:37

相关问题