0

次のような入力の配列がある状況がいくつかあります。

$myArray = array( "apple", "banana", "orange", "pear" );

配列に任意の数の果物を含めることができる場所。PHP で MySQL プリペアード ステートメントを使用して、次のようなクエリを作成したいと考えています。

SELECT * FROM fruitcart WHERE fruitname IN ('apple','banana','orange','pear');

以前は、次のようなことでこれを達成していました。

$query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . implode( "','", $myArray ) . "')";

しかし、準備されたステートメントで同様のことを行う方法があるかどうか知りたいですか?

4

3 に答える 3

1

準備されたステートメントでそれを行う方法はありません。唯一の可能性は、次のようなことです。

$query = "SELECT * FROM fruitcart WHERE fruitname = ? OR fruitname = ? OR fruitname = ? ...

foreach ループを使用すると、このようなステートメントを簡単に作成できます。

ただし、配列の値の量はおそらく異なるため、データベース オプティマイザーのアルゴリズムで混乱が生じる可能性があることに注意してください。最適なパフォーマンスを得るには、たとえば 128、64、32、16、8、4、2、1 のスロットを使用してステートメントを準備し、データベースからすべての値を取得するまで、入力できる最大のスロットを使用することをお勧めします。こうすることで、オプティマイザはより限定された量のステートメント スケルトンを処理できます。

これには一時テーブルを使用することもできます。たとえば、値 (リンゴ、バナナなど) と値セットの ID のみを含むテーブルを作成します。

次に、一意の set-id (たとえば、php は guid 関数を提供します) を使用して値の配列をデータベースに挿入し、サブクエリでそれらを選択できます。

$query = "SELECT * FROM fruitcart WHERE fruitname IN (SELECT fruitname FROM temptable WHERE setid = ?)"

これは簡単に準備でき、非常に優れたパフォーマンスを発揮します。temptable にメモリ内テーブルを使用できるため、非常に高速になります。

于 2012-07-19T06:50:12.550 に答える
0
$placeholders = rtrim(str_repeat('?, ', count($myArray)), ', ') ;
$query = "SELECT * FROM fruitcart WHERE fruitname IN ($placeholders)";

$stm = $db->prepare($query) ;
$stm->execute($myArray) ;
于 2012-07-19T06:53:31.883 に答える
-2

あなたはそれを行うための適切な方法を使用しています。編集できます

$list = implode( ',', $myArray );
$query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . $list . "')";

それでおしまい :)

于 2012-07-19T06:38:42.207 に答える