とあるセクシーなデータ分析官

を目指す渋谷で働くソーシャルゲーム分析者の卵

PDOの仕様的な問題?

先日購入したPHPプログラミングのサンプルにあった
ミニブログを作っているのですが、
DB部分だけは本とは違いPDOを使ってプログラミングしています。


そんな中、
PDOを使ってqueryを発行しまくっていたらこんなエラーが出ました

Fatal error: Call to a member function fetch() on a non-object

オブジェクトが無いって言われても…
しょうがないのでvar_dumpとかをして$pdo->queryの中身を一つ一つ見ていったらどうやら4つ目のクエリーが失敗するらしい。


3つ目と4つ目の$countResultと$blogResultを入れ替えると後の方が
必ず失敗するので、どうも4つめ臭い。

$pdo = new PDO('mysql:host=localhost; dbname=miniblog','root','');
$friendResult = $pdo->query('SELECT * FROM friend WHERE from_name = "myname"');
$insertResult = $pdo->query("INSERT INTO blog (name, contents) VALUES ('myname', '{$contents}')");
$countResult = $pdo->query("SELECT COUNT(id) AS rows FROM blog WHERE name IN ({$in_clause})");
$blogResult = $pdo->query("select * from blog");
(一部省略)


で、qyery以外でSQL文を発行できるPDOのexecメソッドなどを使ってみたが
事象は変わらず…


これはPDOの中身をリセットする必要があるなと思い対処方法がこれ

$pdo = new PDO('mysql:host=localhost; dbname=miniblog','root','');
$friendResult = $pdo->query('SELECT * FROM friend WHERE from_name = "myname"');
$insertResult = $pdo->query("INSERT INTO blog (name, contents) VALUES ('myname', '{$contents}')");
$countResult = $pdo->query("SELECT COUNT(id) AS rows FROM blog WHERE name IN ({$in_clause})");

$pdo = null;
$pdo = new PDO('mysql:host=localhost; dbname=miniblog','hoge','***');

$blogResult = $pdo->query("select * from blog");
(一部省略)

必ず失敗する4回目のqueryの前で一度リセット。
これでうまくいきました。


結局問題を解明せずに遠回りで、動くようにしたのですが、
周りに聞いてみるとPDOの仕様的な問題臭いとのこと。



とりあえずPDOのクエリーは3つまで!!




追記
fetchした後にcloseCursorしなければならないとのこと。
なのでそれぞれのqueryの後でfetchしているが
その後に付け加えてみたらオブジェクト作りなおさなくてもいけました。


参考
http://www.revulo.com/blog/20060522.html
http://jp.php.net/manual/ja/pdostatement.closecursor.php