解決しました!PDOでexecute()を実行しようとすると“non-object”なるエラーが出る件

PHPでDBに接続する手段として、最近はもっぱらPDOを利用していますが、こんなエラーが出て悩まされたことがありました。

“Fatal error: Call to a member function execute() on a non-object”

このエラーをそのまま検索して、出てきた記事がこれ。

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

つまり、PDO::query()をコールしたら、closeCursor()をコールしなければいけないのだろうと理解した私は、さっそくコードを書き込んでみました。
「結果セット内の全てのデータを取得しない場合」という部分は、今の私のレベルでは正しく理解できませんでしたが。。。

ちなみに、私の書いたコードはこんな感じです。

$sql = "
SELECT SQL_CALC_FOUND_ROWS
*
FROM tbl_name;
";
$stmt = $dbh->prepare($sql);
$stmt->execute();


if ($stmt === false) {
$Array = false;
} else {
$Array = array();
while ($row = @$stmt->fetch(PDO::FETCH_ASSOC)) {
$storeArray[] = $row;
}
}

$num_query = $dbh->query("SELECT FOUND_ROWS() AS Results");
$num_rows = $num_query->fetch();
$num_query->closeCursor(); // ここに追加しました

この後に続けてPDOを実行しようとしてエラーになっていたのですが、closeCursor()を追記したところ、正常に動作してくれました。

おそらく、“SELECT SQL_CALC_FOUND_ROWS”から“SELECT FOUND_ROWS()”してデータの件数を取得しようとするケースは多いと思うので、注意が必要ではないかと。

この記事を参照して、同じようなエラーにぶつかった方の悩みが解決されると嬉しいです。