-
ID:hy9sap さんの質問

PHPにて、SQL文をプリペアドステートメントで実行する際のIN句の中身について

$names = " ’a’, ’b’, ’c’ ";
という文字列をあらかじめ用意しておいて

$sql = "SELECT hoge FROM TBL1 WHERE hoge IN (:names);";
$params = array(":name"=>$names);
$stmt = $dbh->prepare($sql);
$stmt->execute($params);

としたいのですがうまくいきません。
簡略化のためプレースホルダは1つにしてありますが、実際は複数あります。

文字列にしてあるだけだし感覚的には出来そうなのですが、無理なんですか?
ちなみにphpmyadminでSQL直打ちの

SELECT hoge FROM TBL1 where hoge IN (’a’,’b’,’c’);

ならもちろん動いてます。

みんなの回答 2 件

ID:MH/kcT さんの回答

記載間違いとは思いますが、「name」なのか「names」なのか統一したほうがよいと思います。
あとプレースホルダで置き換わる際は前後にシングルクォートが付与されてしまいますので、$namesでは前後のシングルクォートを削除しておいたほうが良いかと思います。

ID:hy9sap

nameは記載間違いでした、すいません。

$namesを
$names = " a’, ’b’, ’c ";
としてみましたが、出来ませんでした。

ID:hy9sap

型がstringsなのが問題なのでしょうか…。
もう一度
$names = " ’a’, ’b’, ’c’ ";
に戻し、
$sql = "SELECT hoge FROM TBL1 WHERE hoge IN ($names);";
としたら動きます。IN句内で文字列が扱えないわけではなさそう。

プレースホルダがどう置き換わっているのか(そのシングルクォートが付与される、など)は、どうやって確認したらいいんでしょう?
英語のページで実行される実際のSQLは見ることが出来ない的なのを見ましたが。。。

ID:MH/kcT

ttp://www.php.net/manual/ja/pdo.prepared-statements.php
上の説明の例1にあるbindParamを試してみるとかはどうでしょうか?
シングルクォートの付与は例6の間違った使用法で間接的にですが紹介されています。
あと今気付いたのですが、値にシングルクォートが入っていたらエスケープされてしまいますので、IN区で複数指定したい場合は「IN (:name1, :name2, name3)」のようにバラバラに定義しないといけないはずです。(というかそのためのプリペアドステートメントですしね)

ID:MH/kcT

ttp://mio-koduki.blogspot.jp/2012/03/phppdosql-inbind.html
ここらへんを参考に組んだら宜しいかと。

ID:hy9sap

ありがとうございます、無事できました。
プレースホルダを複数使ってると書きましたが、
全部 :name"=>$names こういう変数チックなやつにしていたので
全て?に変えることになりましたが
動的にIN(?,?,?.....)を作って以前までのプレースホルダの中身にarray(a,b,c)をarray_merge()することで繋げました。
助かりましたー。

ID:V2VNYz さんの回答

これの例5とか見てみて。

PHP: PDOStatement::execute - Manual

http://www.php.net/manual/ja/pdostatement.execute.php
ID:V2VNYz

あ。かぶったかな。

ID:MH/kcT

いや、こっちのほうがphp.netですし、上の私のコメントで紹介したサイトより良いですね。

ID:hy9sap

こちらでもありがとうございました。
参考になりました。

最終更新日:2014-02-21 (8,977 views)

関連するトピックス

ページ上部に戻る