0

PHPスクリプトを書いているときに、次の質問に出くわしました。可変長の配列から最初の 2 つの整数をデータベース テーブルに格納し、それらを削除して、配列が空になるまでこれを繰り返す必要があります。while ループを使用することもできますが、パフォーマンスが低下するため、ループ内に SQL ステートメントを記述しないようにする必要があることを読みました。

簡単な例:

while(count($array) > 0){
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) VALUES (?,?)")){
                        $sql->bind_param('ii',$array[0],$array[1]);
                        $sql->execute();
                        $sql->close();
                    }
                        array_shift($array);
                        array_shift($array);
}

これが最善の方法ですか?そうでない場合、より良いアプローチは何ですか?

4

5 に答える 5

1

次のようなこともできますが、これははるかに高速です。

疑似コード:

$stack = array();
while(count($array) > 0){
    array_push($stack, "(" . $array[0] . ", " . $array[1] . ")");
    array_shift($array);
    array_shift($array);
}
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) 
                                 VALUES " . implode(',', $stack))){
    $sql->execute();
    $sql->close();
}

ここでの唯一の問題は、「MySQL Safe」挿入ではないことです。修正する必要があります。

これにより、値を保持する配列が生成されます。1 つのクエリ内ですべての値を一度に挿入するため、必要な MySQL 時間が少なくて済みます。

于 2013-05-03T17:46:56.933 に答える
0

あなたのループ状態が安全である限り(時間内に壊れます)、そこから何かを得られる限り..大丈夫だと思います.

于 2013-05-03T17:44:50.757 に答える
0

一括挿入ステートメントを作成したほうがよいでしょう。mysql へのヒットは少なくなります。

$sql = "INSERT INTO table(number1, number2) VALUES";
$params = array();
foreach( $array as $item ) { 
    $sql .= "(?,?),\n";
    $params[] = $item;
}
$sql = rtrim( $sql, ",\n" ) . ';';
$sql = $db_connect->prepare( $sql );
foreach( $params as $param ) {
    $sql->bind_param( 'ii', $param[ 0 ], $param[ 1 ] );
}
$sql->execute();
$sql->close();
于 2013-05-03T17:44:31.083 に答える
0

私の経験から、INSERT ステートメントを 1 つずつ実行する場合でも、配列で実行する場合でも、パフォーマンスに顕著な影響を与えることはありません。

データベース接続は 1 回しか開かれないため、大きな問題ではありません。非常識な量のクエリを実行している場合は、そうなる可能性があります。

于 2013-05-03T17:44:37.553 に答える