0

現在、次のコードスニペットを使用してDBを検索しています

for($i=0; $i<sizeof($deleted_records);$i++)  { 

    if($stmt->prepare("SELECT `id`, `status` FROM `02-2012` WHERE `id` = ?")) {

    // Bind your variable to replace the ?
    $stmt->bind_param('s', $id);

    // Set your variable    
    $id = $deleted_records[$i];

    // Execute query
    $stmt->execute();

    // Bind your result columns to variables
    $stmt->bind_result($id_f, $stat_f);

    // Fetch the result of the query
    while($stmt->fetch()) {
        //echo $id_f . ' - ' . $stat_f . '<div>';
        array_push($hits, $id_f);

    }

}

どこ

$deleted_records

は大きな配列です(基本的に、「02-2012」テーブル内の配列の要素のすべての出現を検索しようとします)

このアプローチの問題は、非常に遅いことです。このブルートフォースアプローチよりも優れた/よりエレガントな方法があると確信しています。

御時間ありがとうございます

4

1 に答える 1

0

PHP ループを使用して毎回クエリを実行する代わりに、IN句を使用してクエリを 1 回実行できます。

問題は、次のようなことができないことです。

if($stmt->prepare("SELECT `id`, `status` FROM `02-2012` WHERE `id` IN (?)")) {

渡したいパラメータごとに個別のプレースホルダが必要です。それ$deleted_records が配列であることを確認してください。 $qMarksプレースホルダの文字列です?,?,?,?,?

$qMarks = str_repeat('?,', count($deleted_records) - 1) . '?';
//Suggested by @DonamiteIsTnt (http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition)

if($stmt->prepare("SELECT `id`, `status` FROM `02-2012` WHERE `id` IN ($qMarks)")) {

  $stmt->execute($deleted_records);
}

テストしませんでした。

于 2012-10-15T09:58:29.783 に答える