[PHP]PDOの$stmtでエラー[Call to a member function bindParam() on boolean]の対処方法

カテゴリ: PDO

PDOを使ったDBアクセスプログラム作成時、prepare()で作成した$stmtが下記のエラーを返す場合があります。

Error: Call to a member function bindParam() on boolean


このエラーは、例えば以下のようなコードを書いた時にbindParam()の行で発生したりします。

$stmt = $dbh->prepare($sql);
$stmt->bindParam(':item_cd',$itemCode);

この理由ですが、pdoのprepare()を実行時に、SQLの構文エラーなどでprepare()が失敗したときにfalseを返すことがあるからです。bool値が保存されている$stmt変数に対して、bindParam()メソッドの呼び出しを要求したため、前述のエラーが発生しています。

解決方法の一つは、以下のようにprepareの戻り値チェックを行う必要があります。

$stmt = $dbh->prepare($sql);
if ($stmt===false) {
    // エラー処理
}

$stmt->bindParam(':item_cd',$itemCode);

ですが、関数の成功・失敗を戻り値でチェックするとチェック漏れが発生するリスクがあります。

このような場合、最近のPHPではtry/catchによる例外処理も問題なく行えるため、このようなイレギュラーな状態は例外処理として対処するほうが確実です。PDOの処理でエラーが発生した時の振る舞いはsetAttribute()メソッドで変更可能ですので、エラー時にfalseでなく例外を投げてほしい場合は下記のように設定するとスマートです。

try {
    $dbh = new \PDO(...);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':item_cd',$itemCode);

} catch (Exception $ex) {
    // エラー処理
}

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ
カテゴリ: PDO

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です