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

Rom*_*ner 12 php mysql 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();
}
?>
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,至少对于该测试.


Exp*_*lls 6

再试一次,我不明白为什么你的原始代码不能用于微小的修改:

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

  • @Copy Devil:你是在尝试解决一个真正的任务还是只是在想最奇怪的解决方案? (2认同)
  • 这对我来说似乎也违反直觉,但请参阅 PHP 手册的 PHP 准备语句部分 http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php 上的示例#3。我还在自己的网络服务器上对其进行了测试,您甚至可以在实际初始化最终将使用的变量之前准备绑定。 (2认同)