PDOでMySQLに外部SQLファイルを流す
DROP TABLE IF EXISTS hogehoge; CREATE TABLE hogehoge ( 〜 );
みたいなhoge.sqlがあるとします。このファイルを読み込んでPDOに投げる、コマンドラインで動くphpスクリプトがあります。夏頃にFedoraCore5 + php5.1.4 + MySQL5.0.22で動かした時にはちゃんと動いたんですが、FodoraCore5 + php5.1.6. + MySQL5.0.27だと、
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.
というエラーメッセージで止まってしまいました。平たく言うと「バッファされていないクエリが残ってるから次が実行できないYo!」ということですかね。日本語の情報がサッパリ見当たらなかったのですが、
[PHPLondon-discuss] PDO / buffered query confusion
http://lists.phase.org/pipermail/phplondon-discuss/2006-June/002585.html
http://lists.phase.org/pipermail/phplondon-discuss/2006-June/002586.html
このあたりがちょうどその辺のやり取りみたいです。バッファが有効になっていないと、一度に複数のクエリを投げられない、ということらしいので、
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
てな感じに書いてみましたが、やっぱり同じ結果でした。書き方間違ってるのかな…
結局、外部SQLファイルをセミコロンで分割して、一文ずつ投げるようにして解決しました。前は確かに動いてたんだけどな…MySQLの設定とかバージョンに関係あるのかも知れませんが、今日はここまで。