【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を実行すると、発生するらしい。
- 複数の文の実行
- ストアドプロシージャの実行
- 非バッファモードでの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の実行などということですね。
コメント