Rumah  >  Soal Jawab  >  teks badan

Apakah cara paling berkesan untuk MEMASUKKAN berbilang nilai dalam mysqli?

Saya sedang mencari teknik selamat suntikan SQL untuk memasukkan sejumlah besar baris (~2000 baris) sekali gus menggunakan PHP dan MySQLi.

Saya mempunyai tatasusunan yang mengandungi semua nilai yang mesti terkandung di dalamnya. Pada masa ini saya melakukan ini:

<?php
$array = array("array", "with", "about", "2000", "values");

foreach ($array as $one) 
{
    $query = "INSERT INTO table (link) VALUES ( ?)";
    $stmt = $mysqli->prepare($query);
    $stmt ->bind_param("s", $one);
    $stmt->execute();
    $stmt->close();
}
?>

Saya cuba call_user_func_array() tetapi ia mengakibatkan limpahan tindanan.

Apakah cara yang lebih pantas untuk melakukan ini (seperti memasukkan kesemuanya sekali gus?) tetapi masih menghalang suntikan SQL (seperti pernyataan yang disediakan) dan limpahan tindanan?

P粉908138620P粉908138620334 hari yang lalu652

membalas semua(2)saya akan balas

  • P粉250422045

    P粉2504220452023-10-22 12:11:47

    Cuba lagi, saya tidak faham mengapa kod asal anda tidak berfungsi selepas sedikit pengubahsuaian:

    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("s", $one);
    
    foreach ($array as $one) {
        $stmt->execute();
    }
    $stmt->close();

    balas
    0
  • P粉785957729

    P粉7859577292023-10-22 09:31:38

    Dengan memasukkan sisipan anda ke dalam transaksi, anda seharusnya dapat meningkatkan kelajuan dengan ketara. Anda juga boleh mengalihkan penyata sediakan dan ikat di luar gelung.

    $array = array("array", "with", "about", "2000", "values");
    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt ->bind_param("s", $one);
    
    $mysqli->query("START TRANSACTION");
    foreach ($array as $one) {
        $stmt->execute();
    }
    $stmt->close();
    $mysqli->query("COMMIT");

    Saya telah menguji kod ini pada pelayan web saya untuk 10,000 lelaran.

    Tiada urusan:226 秒。 Waktu dagangan: 2 秒。 Atau 速度提高两个数量级, sekurang-kurangnya untuk ujian ini.

    balas
    0
  • Batalbalas