PDOStatement :: fetch偶尔返回false,但errorInfo()为空

时间:2018-05-19 06:16:39

标签: php mysql pdo

我对PDO有一个奇怪的问题。代码是这样的:

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
  $sth = $dbh->prepare("SELECT ... FROM .... ");
  $sth->execute();
  $result = $sth->fetch(PDO::FETCH_ASSOC);
  if (!$result) {
    print_r($dbh->errorInfo());
    print_r($sth->errorInfo());
  }
} catch(PDOException $e) {
  print_r($e->getMessage());
}

因此它是PDO的常见用途。代码大部分时间都按预期工作。但偶尔$result是错误的。奇怪的是,PDO :: errorInfo()和PDOStatement :: errorInfo()都返回空数组,如下所示:

array(3) {
  [0]=> string(5) "00000"
  [1]=> NULL
  [2]=> NULL
}

我怀疑MySQL连接存在一些问题,但是连接工作正常,不会抛出任何异常,MySQL服务器空闲,有足够的连接可用。 MySQL或PHP日志中没有错误。

所以我的问题是,如何解决这个问题呢?我需要知道,为什么有时fetch()会失败并且错误而且errorInfo()中没有关于错误的信息

1 个答案:

答案 0 :(得分:0)

好的,我发现了造成这种奇怪行为的原因。我在MySQL服务器上有2个非常相似的数据库。我使用它们的持久连接。不知何故(???)PHP的PDO有时是在选择不同的数据库的情况下创建的。

我永远不会想到这一点,因为在new PDO();我有正确的数据库我需要使用。但由于一些奇怪的原因,连接到不同的数据库。它必须使用持久连接做一些事情,因为当我禁用使用持久连接时,一切正常。

所以我可能会问另一个问题 - 这次 - 为什么PDO在使用持久性时应该连接到不同的数据库。