PDOでIN句を使用しているのですが、正しく動作しません。
$stmt = $pdo->prepare('SELECT * FROM hoge where id in (?)');
$stmt->bindValue(1, '123, 456, 789');
$stmt->execute();
var_dump($stmt->fetchAll());
fetchAllを行っても複数のレコードがかえってこず、ヒットした最初の1行のレコードしか取得することができません。PDOでIN句を使用することはできないのでしょうか?
DBMSはMySQLを使用して、PHPは5.2.6を使用しています。
ちなみに
$stmt = $pdo->prepare('SELECT * FROM hoge where id in (?, ?, ?)');
$stmt->bindValue(1, 123);
$stmt->bindValue(2, 456);
$stmt->bindValue(3, 789);
$stmt->execute();
では、fetchAll で複数のレコードが返ってきます。
どうしてもpreparedで単一のIN句を使いたいのですが、何か良い方法はありますでしょうか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
もし、? にバインドする3つの値が、ユーザーの入力と無関係で、SQLインジェクションの危険がないのなら、
直接
$stmt = $pdo->query('SELECT * FROM hoge where id in (123,456,789)');
で実行すればいいと思います。
?を使って書くのは、SQLインジェクション対策です。prepareで、構文解析を行い、実行プランを立てます。この段階で、?にはスカラー値しか入らないようになっています。ユーザーが変な値をフォームから入れても、ここには構造を持たないスカラーしか入れられません。
最初の例のように、bindしても?には'123,456,789'という文字列がbindされます。
SELECT * FROM hoge where id in ('123,456,789')
本来、これはデータ型の不一致ではじく方がいいと思いますが、MySQLはSQLとしてはデータ型に寛容ですので、idが整数の123の時は、動いてしまいます。'123,456,789'を整数として評価して、123と見ます。
つまり、
SELECT * FROM hoge where id in (123)
と考えます。結果として、idが123の行が返ります。
ありがとうございました。
どうやらマニュアルにもかかれているようで、まとめてIN句に指定することができないみたいでした。
http://jp2.php.net/manual/ja/pdo.prepare.php
このことから、事前にSQLを組み立てる際に、IN句に利用する値は
IN(?, ?, ?) に展開して prepare するようにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- MySQL addcslashesの使い方について教えてください。 DBに繋げてそこから、部分一致させたいのです 1 2023/04/14 22:59
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
static constメンバ変数(配列)...
-
Boolean型配列中のTrueの有無を...
-
『名前空間』の意味を教えてく...
-
Linux バイナリ実行できない "...
-
C#の配列について
-
JavaScriptで書き出したオート...
-
Excel VBA の ChangeFileAccess
-
-(ハイフン)_(アンダーバー)の...
-
プルダウンメニューをmouseout...
-
Vb.netのグローバル変数の宣言...
-
大量データの一括変換
-
「オブジェクトが必要です。」...
-
【Jquery】changeイベント毎にa...
-
PDFファイルをWEB上で見れるよ...
-
ボタンをクリックすると数が増...
-
ASP+アクセスでのSQLコメントに...
-
VB.NETで変数の型は自作...
-
yuga.jsのカスタマイズ
-
MFCのキャプション変更
-
関数でy=g(x)のgとは何の略です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
ボタンをクリックすると数が増...
-
【正規表現】【javascript】CR...
-
【Jquery】changeイベント毎にa...
-
「オブジェクトが必要です。」...
-
Excel VBA の ChangeFileAccess
-
Vb.netのグローバル変数の宣言...
-
MFCのキャプション変更
-
onclick指定関数の引数へローカ...
-
同じ型【ハイフンと数字】だけ...
-
static constメンバ変数(配列)...
-
javascriptで文字挿入でtoggle...
-
サブウインドウから親ウインド...
-
URLの一部をコピーできるブック...
-
window.onloadでのfunction
-
Javascriptグローバル変数の値...
-
複数ファイルで使うグローバル...
-
全部のアクセスを指定したペー...
おすすめ情報