Я ищу безопасную технологию SQL-injection для вставки большого количества строк (около 2000) сразу с PHP и MySQLi.
У меня есть массив со всеми значениями, которые необходимо включить. В настоящее время я делаю это:
<?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(); } ?>
Я попробовал call_user_func_array () , но это вызвало stackoverflow.
Что такое более быстрый способ сделать это (например, вставлять их все одновременно?), Но все же защищен от SQL-инъекций (например, подготовленного оператора) и stackoverflows?
Спасибо!
Вы должны иметь возможность значительно увеличить скорость, разместив свои вставки внутри транзакции. Вы также можете переместить свои инструкции подготовки и привязки за пределы своего цикла.
$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");
Редактировать:
Я проверил этот код с 10 000 итераций на моем веб-сервере.
Без транзакции: 226 seconds.
С транзакцией: 2 seconds.
Или two order of magnitude speed increase
на two order of magnitude speed increase
, по крайней мере для этого теста.
Повторяя это, я не понимаю, почему ваш исходный код не будет работать с небольшими изменениями:
$query = "INSERT INTO table (link) VALUES (?)"; $stmt = $mysqli->prepare($query); $stmt->bind_param("s", $one); foreach ($array as $one) { $stmt->execute(); } $stmt->close();
Да, вы можете создать один большой запрос вручную, с чем-то вроде:
$query = ""; foreach ($array as $curvalue) { if ($query) $query .= ","; $query .= "('" . $mysqli->real_escape_string($curvalue) . "')"; } if ($query) { $query = "INSERT INTO table (link) VALUES " . $query; $mysqli->query($query); }