0

このようなコードを使用して、mySQL テーブルのエントリを操作する必要があります

foreach($items as $item)
{
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

$items には最大 50 個のアイテムが含まれる場合があります。このコードのバリエーションは次のようになります

foreach($items as $item)
{
 if ('z' != $img->img)
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 if ('z' != $item->lili)
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

どちらの場合も、$items の各アイテムに対して一連の SQL ステートメントを実行しています。私の質問

  1. アイテムの $sql を作成して実行する方がはるかに効率的ではないでしょうか?
  2. しかし、$items 内の潜在的に 50 個の項目すべてが意味のある SQL を生成する場合、それは SQL ステートメントのバッチの実行が非常に遅いことを意味するのではないでしょうか?
  3. 最後に、私のコードの 2 番目のバージョンのように PHP 側のifテストを実行する方が良いですか、それとも単に SQL を作成し、mySQL に WHERE テストが空の行を返すという事実を処理させる方がよいでしょうか?

これについて何か助けていただければ幸いです。

4

2 に答える 2

3

in代わりに句を使用できます。

$sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")"

たった 1 つの SQL クエリにまで削減できます。ただし、巨大な配列を使用しようとすると失敗する可能性があります。生成されたクエリが max_allowed_pa​​cket 設定を超えて強制終了される可能性があります。

strlen については... strlen の結果を と比較するポイントは何'z'ですか? strlen は整数を返しますif (apple == orange)。代わりに実行することもできます。

于 2013-04-08T04:17:48.523 に答える
1

最初に、IN 句と 2 つの別個のクエリを使用することをお勧めします... $item->img と $item->lili の 2 つの要素をエスケープする必要がある場合があります。

$ids = array("siteims"=>array(), "lists"=>array());
foreach($items as $item)
{
    $ids['siteims'][] = "'" . $item->img . "'";
    $ids['lists'][] = "'" . $item->lili . "'" ;
}
if(!empty($ids['siteims'])){
    $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")";
    $dbh->exec($sql);
}

if(!empty($ids['lists'])){
    $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")";
    $dbh->exec($sql);
}
于 2013-04-08T04:19:42.703 に答える