我正在寻找一种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();
}
?>
Run Code Online (Sandbox Code Playgroud)
我尝试了call_user_func_array(),但它导致了stackoverflow.
有什么更快的方法可以做到这一点(比如一次插入所有这些?),但仍然可以防止SQL注入(如预处理语句)和stackoverflows?
谢谢!
Dan*_*eus 30
通过将插入放在事务中,您应该能够大大提高速度.您还可以在循环外部移动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");
Run Code Online (Sandbox Code Playgroud)
编辑:
我在我的Web服务器上测试了10,000次迭代的代码.
没有交易:226 seconds.
使用交易:2 seconds.
或者a 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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29068 次 |
| 最近记录: |