0

x1,y1 x2,y2 x3,y3 で区切られた約10000個のポイントを持つテキストファイルを読む必要があります。. 10000回

PHP でループを使用してそれらを読み取り、配列に格納してから、ループを実行して一度に 1 行ずつデータベースに挿入します。本当に長い時間がかかります。配列全体を挿入する方法はありますか

for ($i=0; $i<10000; $i++)

{
    $sql = '
        INSERT INTO `firefly`.`FreeFormPoly` 
            (`markedObjectID`, `order`, `x`, `y`) 
        VALUES 
            ('.$markedObjectsID.', '.$order.', '.$valuesx[i].','.$valuesy[i].')';

    $db->query($sql, $markedObjectsID, $order, $values[1], $values[0]);
}
4

4 に答える 4

0

まず、準備済みステートメントを使用して、ネットワークのオーバーヘッドを削減できます。PDO を仮定すると:

$stmt = $db->prepare('INSERT INTO mytable (foo, bar, baz) VALUES (:foo, :bar, :baz)');

for ($i = 0; $i < $length; ++$i) {
    $stmt->execute(array(
        ':foo' => $data[$i]['foo'],
        ':bar' => $data[$i]['bar'],
        ':baz' => $data[$i]['baz'],
    ));
}

$db->beginTransaction()次に、コード全体をand内にラップできます$db->commit()

于 2013-06-29T14:51:02.160 に答える
0

私はこのようなことをします:

$sql = 'INSERT INTO `firefly`.`FreeFormPoly` (`markedObjectID`, `order`, `x`, `y`) VALUES';
for($i=0;$i<length;$i++) {
    $sql .= '('.$markedObjectsID.', '.$order.',  .$valuesx[i].','.$valuesy[i].'),';
}
$sql = substr($sql,0,-1);
$db->query($sql);

説明:

複数のレコードを入力する構文は次のとおりです。

INSERT INTO TABLE_NAME VALUES(VAL1, VAL2, ....), (...), (...);

(val1,val2,val3),ループを実行するたびに連結しているSQLでは,、最後の位置に余分なものがあり、それを切り捨てますsubstr()

より好ましくは私はするだろう

$sql = 'INSERT INTO `firefly`.`FreeFormPoly` (`markedObjectID`, `order`, `x`, `y`) VALUES ';
for($i=0;$i<length;$i++) {
    $sql .= '('.$markedObjectsID.', '.$order.',  .$valuesx[i].','.$valuesy[i].'),';
}
$sql = substr($sql,0,-1);
$result = mysqli_query($db,$sql)
    or die('Error in querying the database');
于 2013-06-28T18:43:59.347 に答える