【问题标题】:Why does this row only show up when running PHP on Windows and not on CentOS?为什么这一行只在 Windows 上运行 PHP 而在 CentOS 上不显示?
【发布时间】: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

【问题讨论】:

    标签: php sql sqlite


    【解决方案1】:

    你检查过两台机器的时钟是否同步了吗?

    【讨论】:

    • 是的,我很肯定这两个时钟是同步的(我已经仔细检查过)——尽管它确实不应该有任何区别,因为我正在对相同的数据运行相同的查询。
    【解决方案2】:

    想到的两种可能性:

    • CentOS 是否安装 32 位?您是否尝试读取/写入不适合 32 位 int 的时间戳?
    • 时间戳是负数吗?很久以前,我们遇到过一个问题,Debian 似乎不支持负时间戳,因此将项目从 Slackware 移出会导致各种问题。

    【讨论】:

    • 不幸的是,我不认为其中任何一个都是选项,因为问题仅在我使用 bindValue() 时才会出现,而不是当我将完全相同的值直接插入查询时。
    【解决方案3】:

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

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

    【讨论】:

    • 是的,恐怕我做到了 - 没有区别。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-28
      • 2019-10-04
      • 2011-08-02
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多