I'm looking for a SQL-injection-secure technique to insert a lot of rows (ca. 2000) at once with PHP and MySQLi.
I have an array with all the values that have to be include.
Currently I'm doing that:
<?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 caused a stackoverflow.
What is faster method to do this (like inserting them all at once?), but still secure against SQL-injections (like a prepared statement) and stackoverflows?
Thank you!
Trying this again, I don't see why your original code won't work with minor modifications:
You should be able to greatly increase the speed by putting your inserts inside a transaction. You can also move your prepare and bind statements outside of your loop.
Edit:
I tested this code with 10,000 iterations on my web server.
Without transaction:
226 seconds.
With transaction:2 seconds.
Or atwo order of magnitude speed increase
, at least for that test.Yes, you can build a single big query manually, with something like:
You should first convert your array into a string. Given that it is an array of strings (not a two-dimentional array), you can use the implode function.
Please be aware that each value should be enclosed into parenthesis and properly escaped to ensure a correct
INSERT
statement and to avoid the risk of an SQL injection. For proper escaping you can use the quote method of thePDOConnection
-- assuming you're connecting to MySQL through PDO. To perform this operation on every entry of your array, you can use array_map.After escaping each value and imploding them into a single string, you need to put them into the
INSERT
statement. This can be done with sprintf.Example:
Note: depending on the amount of records you're willing to insert into the database, you may want to split them into several
INSERT
statements.