PDO如何不返回pg_query()的行?

时间:2015-09-06 07:20:35

标签: php postgresql pdo heisenbug pg-query

我有一个带有bigserial PK的表,一个字符有不同的FK和一个bigint FK以及这些FK的唯一约束,一个字符变化NOT NULL和两个可空的smallint。

所有这些都是在运行Ubuntu 14.04.2 LTS,PHP 5.5.9和PostgreSQL 9.3的虚拟机以及分发中的所有其他软件包中运行的。

我做了

$pdo->query("SELECT * FROM table")->fetchAll(PDO::FETCH_ASSOC)

$r = pg_query($db, "SELECT * FROM table");
pg_fetch_all($r)

后者返回所有行,而前者返回除1之外的所有行。

我也尝试选择那一行,虽然pg_*()函数按预期工作,但PDO没有返回任何行。

为了使它更加奇怪,这种差异只出现在使用lighttpd 1.4.33的PHP-FPM中,而不是在shell中使用PHP CLI运行时。

怎么会这样? 有没有其他人遇到类似的情况? 我怎么能确定PDO不会再次让我失望?

我甚至尝试重新启动VM并重新启动PostgreSQL,但结果没有改变。

可悲的是,我没有对这些东西的备份,因为我必须尽快让事情工作,所以我删除了那个神秘的行并用一个新的替换它,除了PK之外的所有列都相同。

两者都正确地返回了新行。

1 个答案:

答案 0 :(得分:0)

结果证明,当PostgreSQL的索引损坏时,PostgreSQL可能会产生令人困惑和不一致的结果。

在这种情况下,只需重新创建索引并检查它是否可以解决您的问题。