【问题标题】:PDOStatement::fetch occasionally returns false, but errorInfo() is emptyPDOStatement::fetch 偶尔返回 false,但 errorInfo() 为空
【发布时间】:2018-10-29 13:09:47
【问题描述】:

我在使用 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() 失败并返回 false 并且 errorInfo() 中没有关于错误的信息

【问题讨论】:

  • 不确定这是否会有所不同,但可能会以try { $sth->execute(); } catch(PDOException $e){ echo $e->getMessage(); } 之类的开头?
  • @NigelRen 是的,总有一行要检索,表还是一样,大约10个请求中,有1个失败,返回false。
  • @icecub 正如我在问题中所说的那样 - 它根本不会抛出任何异常,只是 fetch() 返回 false。
  • 您能否包含正确的prepare() 语句,如果您准备语句,我会希望会有某种绑定值。
  • 对,对不起,我忘了包括你需要在你的 PDO 对象中设置 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 才能工作。它将允许将错误作为异常抛出。你可以在这里阅读:stackoverflow.com/questions/46342798/…

标签: php mysql pdo


【解决方案1】:

好的,我找到了导致这种奇怪行为的原因。我在这个 MySQL 服务器上有 2 个非常相似的数据库。我与他们两个都使用持久连接。并且不知何故 (???) PHP 的 PDO 有时是在选择不同的数据库时创建的。

我从没想过会这样,因为在new PDO(); 我有我需要使用的正确数据库。但是由于某些奇怪的原因,连接到不同的数据库。它与使用持久连接有关,因为当我禁用持久连接时,一切正常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2011-10-17
    相关资源
    最近更新 更多