一尘不染

在mysqli中插入许多值的最佳方法?

mysql

我正在寻找一种SQL注入安全技术,以便通过PHP和MySQLi一次插入很多行(大约2000年)。
我有一个必须包含所有值的数组。目前,我正在这样做:

<?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呢?
谢谢!


阅读 236

收藏
2020-05-17

共1个答案

一尘不染

通过将插入内容放入事务中,您应该能够大大提高速度。您还可以将您的prepare和bind语句移出循环。

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

编辑:

我在Web服务器上经过10,000次迭代测试了此代码。

没有事务:226 seconds. 有事务:2 seconds. 或a two order of magnitude speed increase,至少对于该测试。

2020-05-17