首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP mysqli_multi_query批量執行SQL實戰:DML批量寫入與多結果集查詢處理

     編輯:MySQL 資料庫相關知識

核心API:mysqli::multi_query()

單次調用執行多條以分號分隔的SQL語句,支持INSERT/UPDATE/DELETE混合批量執行,不推薦包含SELECT(結果集處理複雜)。

場景一:批量DML寫入(INSERT/UPDATE/DELETE)

<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
if ($mysqli->connect_error) die("連接失敗: " . $mysqli->connect_error);

$sqls = "INSERT INTO user1 (name, password, email, age) VALUES ('AAA', MD5('AAA'), 'AAA@hu.com', 25);";
$sqls .= "INSERT INTO user1 (name, password, email, age) VALUES ('BBB', MD5('BBB'), 'BBB@hu.com', 25);";
$sqls .= "INSERT INTO user1 (name, password, email, age) VALUES ('CCC', MD5('CCC'), 'CCC@hu.com', 25);";
// 可混合:$sqls .= "UPDATE user1 SET age=15 WHERE id=1;";
// $sqls .= "DELETE FROM user1 WHERE id=10;";

$res = $mysqli->multi_query($sqls);
if (!$res) {
    echo "操作失敗: " . $mysqli->error;
} else {
    echo "OK";
}
$mysqli->close();

關鍵點:每條語句必須以分號結尾,最後一條也需分號。網絡往返1次,解析優化1次,性能提升數十倍。

場景二:批量查詢多結果集處理

<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
$sqls = "SELECT * FROM user1;";
$sqls .= "DESC user1;";

if ($res = $mysqli->multi_query($sqls)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                foreach ($row as $val) echo '--' . $val;
                echo '<br/>';
            }
            $result->free(); // 及時釋放內存
        }
        if ($mysqli->more_results()) {
            echo "********新的結果集***************<br/>";
        } else {
            break;
        }
    } while ($mysqli->next_result());
}
$mysqli->close();

結果集處理流程圖解

  1. multi_query()發送所有SQL
  2. store_result()獲取第一個結果集(緩衝模式)
  3. 循環fetch_row()讀取數據
  4. free()釋放當前結果集內存
  5. more_results()判斷是否有下一個
  6. next_result()移動到下一個結果集,循環回步驟2

最佳實踐與避坑指南

  • 批量大小控制:單次multi_query建議<100條,SQL總長度<1MB(受max_allowed_packet限制)
  • 錯誤處理:任一語句失敗,後續語句不再執行,需檢查$mysqli->errno和$mysqli->error
  • 事務配合:批量寫入建議包裹在BEGIN; ... COMMIT;中,或設置autocommit=0
  • 防注入:動態參數嚴禁拼接,改用prepare()+bind_param()循環execute()(雖失去multi_query優勢,但安全第一)

multi_query是PHP操作MySQL批量寫入的利器,配合合理批次控制,可將導入速度提升50-100倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved