事象
$pdo->query("drop database if exists DBNAME");
$pdo->query("create database DBNAME");
$pdo->query("use DBNAME");
みたいなことをしたら
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
と言われてしまった。
原因
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
はデフォルトでtrue
になっているので、エラーメッセージが提示する修正は意味がなさそう。
よくわからないのでググったらstack overflowに書いてあった。
->query()
を->exec()
にしたら良いらしい。
たぶん、query()
はPDOStatement
を返すのでPDOStatement::closeCursor()
が実行されるまで接続されっぱなしになるっぽい…?
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
の力でわざわざ閉じなくても大丈夫なはずだと思ったけど、以下のようにquery
が二つだと動いたので三重入れ子になると厳しいっぽい。
$pdo->query("drop database if exists DBNAME");
$pdo->query("create database DBNAME");
対応
exec()
はPDOStatement
じゃなくてint
を返すので、接続が維持されないからアド。
$pdo->exec("drop database if exists DBNAME");
$pdo->exec("create database DBNAME");
$pdo->exec("use DBNAME");