我正在寻找一种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?
谢谢!
您应该可以通过将插入内容放入事务中来大大提高速度。您还可以将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();