LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-09

結論

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

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1