結論
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"
}
意味を考えずに使うとこうやってハマるので、ちゃんと考えて書きましょうね、、