Home  >  Q&A  >  body text

What is the most efficient way to INSERT multiple values ​​in mysqli?

I'm looking for a SQL injection safe technique to insert a large number of rows (~2000 rows) at once using PHP and MySQLi.

I have an array that contains all the values ​​it must contain. Currently I'm doing this:

<?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();
}
?>

I tried call_user_func_array() but it resulted in stack overflow.

What is a faster way to do this (like inserting them all at once?) but still prevent SQL injection (like prepared statements) and stack overflow?

P粉908138620P粉908138620385 days ago715

reply all(2)I'll reply

  • P粉250422045

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

    Try again, I don't understand why your original code doesn't work after a slight modification:

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

    reply
    0
  • P粉785957729

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

    By putting your inserts into a transaction you should be able to speed things up a lot. You can also move prepare and bind statements outside the loop.

    $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");

    I tested this code on my web server for 10,000 iterations.

    No transaction: 226 seconds. Transaction time: 2 seconds. Or be two orders of magnitude faster, at least for this test.

    reply
    0
  • Cancelreply