可変サイズの変数リストを持つMySQL準備済みステートメント 質問する

可変サイズの変数リストを持つMySQL準備済みステートメント 質問する

毎回異なる数の引数を取る準備された MySQL ステートメントを PHP で記述するにはどうすればよいでしょうか。このようなクエリの例は次のとおりです。

SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)

節は実行されるたびにINの数が異なります。id

考えられる解決策は 2 つありますが、もっと良い方法があるかどうかを確認したいと思います。

考えられる解決策 1ステートメントが 100 個の変数を受け入れ、残りをテーブルに存在しないことが保証されたダミー値で埋めるようにします。100 個を超える値に対しては複数回の呼び出しを行います。

考えられる解決策2準備されたステートメントを使用しないでください。インジェクション攻撃の可能性を厳密にチェックしながらクエリを構築して実行してください。

ベストアンサー1

解決策はいくつか考えられます。

解決策の 1 つは、一時テーブルを作成することです。 in 句に含まれる各パラメータをテーブルに挿入します。 次に、一時テーブルに対して単純な結合を実行します。

別の方法としては、次のようなことをするかもしれません。

$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$parmcount=count($parms);   // = 4
$inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,?
$sql='SELECT age, name FROM people WHERE id IN (%s)';
$preparesql=sprintf($sql,$inclause);  // = example statement used in the question
$st=$dbh->prepare($preparesql);
$st->execute($parms);

最初の解決策は大きなリストに適しており、後者の解決策は小さなリストに適しているのではないかと考えていますが、証拠はありません。


@orrd を喜ばせるために、簡潔なバージョンをここに示します。

$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)',
                          implode(',',array_fill(0,count($parms),'?'))));
$st->execute($parms);

おすすめ記事