提问者:小点点

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


我正在寻找一种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(),但它导致了堆栈溢出。

有什么更快的方法可以做到这一点(比如一次插入它们?),但仍然可以防止SQL注入(比如准备好的语句)和StackOverflows?
谢谢!


共2个答案

匿名用户

您应该可以通过将插入内容放入事务中来大大提高速度。您还可以将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秒。带事务:2秒。或一个两个数量级的速度提升,至少对于那个测试是这样的。

匿名用户

再试一次,我不明白为什么您的原始代码在轻微的修改下就不能工作了:

$query = "INSERT INTO table (link) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $one);

foreach ($array as $one) {
    $stmt->execute();
}
$stmt->close();