解決しました!PDOでexecute()を実行しようとすると“non-object”なるエラーが出る件
- 2015-03-04 (水)
- PHP/MySQL
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()”してデータの件数を取得しようとするケースは多いと思うので、注意が必要ではないかと。
この記事を参照して、同じようなエラーにぶつかった方の悩みが解決されると嬉しいです。