SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】Cannot execute queries while there are pending result sets

問題

MySQLに接続して、SQLを実行する処理をいくつか実行していると、突然こんなエラーが出ます。何が起きているのですか。

PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while there are pending result sets. Consider unsetting the previous PDOStatement or calling PDOStatement::closeCursor() in /tmp/test.php:8

答え

phpでSQLを実行したとき、

以下のような状況で、結果セットが最後まで処理されていないときに別のSQLを実行すると、発生するらしい。

本当に必要があってそうしているのであれば、エラーメッセージの通り、PDOStatement::closeCursor() を実行する。

PDOStatement を代入した変数をunset()するのでもよい。

複数のSELECTを1回で実行するなどは、結果が取得できないし、どちらかというと通常やらないので、何かがおかしい可能性もある。おかしい場合は、処理を見直す。

なお、php5、php7では、PDOで複数の文の実行ができずにエラーになるので、お目にかかるとしたらphp8になると思う。

再現方法)

<?php

$db = new pdo('mysql:host=localhost;dbname=test;', 'testuser', 'testpass');
$s1 = $db->query("select * from t; select * from t;");
$s2 = $db->query("select * from t");

マニュアルに書いてあった

PDO::query() を次にコールする前に 結果セット内の全てのデータを取得しない場合、そのコールは失敗します。 PDOStatement::closeCursor() をコールし、 次に PDO::query() をコールする前に PDOStatement オブジェクトに関連付けられたリソースを解放してください。

https://www.php.net/manual/ja/pdo.query.php

これの具体的な例が、複数のSELECTの実行などということですね。

関連するメモ

コメント