首页  >  问答  >  正文

在 mysqli 中 INSERT 多个值的最有效方法是什么?

我正在寻找一种 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 注入(比如准备好的语句)和堆栈溢出?

P粉908138620P粉908138620385 天前716

全部回复(2)我来回复

  • P粉250422045

    P粉2504220452023-10-22 12:11:47

    再试一次,我不明白为什么您的原始代码在稍作修改后就无法工作:

    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("s", $one);
    
    foreach ($array as $one) {
        $stmt->execute();
    }
    $stmt->close();

    回复
    0
  • P粉785957729

    P粉7859577292023-10-22 09:31:38

    通过将插入内容放入事务中,您应该能够大大提高速度。您还可以将准备和绑定语句移到循环之外。

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

    我在我的网络服务器上测试了此代码 10,000 次迭代。

    没有事务:226 秒。 交易时间:2 秒。 或者速度提高两个数量级,至少对于该测试而言。

    回复
    0
  • 取消回复