Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDOStatement::fetch偶尔返回false,但errorInfo()为空_Php_Mysql_Pdo - Fatal编程技术网

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

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);

我对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());
}
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
。它将允许错误作为异常抛出。正如你在这里看到的: