【PHP】bindParamでNULLが返ってきてしまう誤った書き方

1pt   2018-11-09 11:16
IT技術情報局

結論

bindparamは右辺の値に使うこと。

修正前 $sql = "SELECT a FROM b WHERE :something = :otherthing"; $bindparams["something"] = $something; $bindparams["otherthing"] = $otherthing;

修正後 $sql = "SELECT a FROM b WHERE ${something} = :otherthing"; $bindparams["otherthing"] = $otherthing;

事象

ハマった内容

下記のようなデータの取り出し方をしたら値が返ってこなくてハマった。

実行内容 $sql = "SELECT a FROM b WHERE :something = :otherthing"; $bindparams["something"] = $something; $bindparams["otherthing"] = $otherthing; $stmt = $dbh->prepare($sql); $stmt->bindValue("something", $something, PDO::PARAM_STR); $stmt->bindValue("otherthing", $otherthing, PDO::PARAM_STR); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($result); exit; 結果 NULL 原因

SQLエラーやPHPのエラーとしては拾うことができなかったので、少し時間がかかってしまったが、ようするに両辺にbindparamを使うと上手くいかないようです。

:something = :otherthing 解決方法

そこで、あらかじめ左の値を直接入れるように書き換えるとうまくいく。
本来bindparamをするのはSQLインジェクションを防ぐためなので、右辺の値をbindparamするのが正しい。

実行内容 $sql = "SELECT a FROM b WHERE ${something} = :otherthing"; $bindparams["otherthing"] = $otherthing; $stmt = $dbh->prepare($sql); $stmt->bindValue("something", $something, PDO::PARAM_STR); $stmt->bindValue("otherthing", $otherthing, PDO::PARAM_STR); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($result); exit; 結果 array(1) { [0]=> string(4) "success" }

意味を考えずに使うとこうやってハマるので、ちゃんと考えて書きましょうね、、

Source: php

   ITアンテナトップページへ
情報処理/ITの話題が沢山。