MySQL プリペアド ステートメントでの可変サイズの変数リストの処理
MySQL のプリペアド ステートメントは、動的クエリを実行する安全かつ効率的な方法を提供します。ただし、値の数が不明な IN 句など、さまざまな数の引数を含むクエリを処理する場合には問題が発生します。
解決策 1: 一時テーブルを使用する
1 つの方法は、一時テーブルを作成し、そこに必要な値を挿入することです。その後、クエリを一時テーブルに対して結合して、関連するデータを取得できます。この解決策は、大きな値のリストに適している可能性があります。
解決策 2: Implode 関数を利用する
別の手法では、implode() 関数を使用して IN 句を作成します。ダイナミックに。次の PHP コードは、次の方法を示しています。
// Define the query with a placeholder IN clause $sql = 'SELECT age, name FROM people WHERE id IN (%s)'; // Get the number of parameters in the IN clause $parmcount = count($parms); // Create a placeholder string for the IN clause (e.g., "?, ?, ?, ?") $inclause = implode(',', array_fill(0, $parmcount, '?')); // Format the query with the dynamic IN clause $preparesql = sprintf($sql, $inclause); // Prepare and execute the statement $st = $dbh->prepare($preparesql); $st->execute($parms);
ソリューションの比較
大規模なリストの場合は、一時テーブルのアプローチの方が効率的ですが、内破ソリューションの方がより簡単です。小さいリストの場合は、より高速なオプションとなる可能性があります。
ソリューションの簡潔なバージョン2
簡潔な解決策を求める人向け:
$st = $dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)', implode(',', array_fill(0, count($parms), '?')))); $st->execute($parms);
以上がMySQL プリペアドステートメントで可変サイズの IN 句を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。