【发布时间】: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/…