PHP
MySQL
SQL
PDO
新人プログラマ応援

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

結論

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"
}

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