首頁  >  問答  >  主體

在 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粉908138620334 天前655

全部回覆(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
  • 取消回覆