Php PDOStatement::fetch偶尔返回false,但errorInfo()为空
我对PDO有奇怪的问题。代码如下:Php PDOStatement::fetch偶尔返回false,但errorInfo()为空,php,mysql,pdo,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);
$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());
}
array(3) {
[0]=> string(5) "00000"
[1]=> NULL
[2]=> NULL
}
所以PDO的使用非常普遍。而且代码大部分时间都按预期工作。但偶尔,$result
为假。奇怪的是,PDO::errorInfo()和PDOStatement::errorInfo()都返回空数组,如下所示:
$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());
}
array(3) {
[0]=> string(5) "00000"
[1]=> NULL
[2]=> NULL
}
我怀疑MySQL连接存在一些问题,但是连接工作正常,没有抛出任何异常,MySQL服务器空闲,有足够的连接可用。MySQL或PHP日志中没有错误
所以我的问题是,如何更多地解决这个问题?我需要知道,为什么有时候fetch()会以false失败,并且errorInfo()中没有关于错误的信息。好的,我已经找到了导致这种奇怪行为的原因。我在这个MySQL服务器上有两个非常相似的数据库。我对它们都使用持久连接。不知何故,PHP的PDO有时是在选择不同数据库的情况下创建的 我永远不会想到这一点,因为在
newpdo()中代码>我有正确的数据库需要使用。但由于某种奇怪的原因,连接到了不同的数据库。它必须与使用持久连接有关,因为当我禁用使用持久连接时,一切正常
因此,我可能会问另一个问题——这次——为什么PDO在使用持久性时会连接到不同的数据库。不确定这是否会有任何区别,但可能类似于尝试{$sth->execute();}catch(PDOException$e){echo$e->getMessage();}
开始时?@NigelRen Yes,总是有一行要检索,表仍然是一样的,在大约10个请求中,1个请求失败并返回false。@icecub,正如我在问题中所说的-它根本不会引发任何异常,只是fetch()返回false。您能包括适当的prepare()
语句吗,如果您准备语句的话,我希望会有一些绑定值位。对了,很抱歉,我忘记了在PDO对象中设置PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
。它将允许错误作为异常抛出。正如你在这里看到的: