Edited at

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

More than 1 year has passed since last update.


結論

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

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