首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 執行 SQL 文件導入資料庫的簡易實現

     編輯:PHP 相關知識

核心代碼

<?php
$sqlContent = file_get_contents('backup.sql'); // 讀取整個 SQL 文件
$statements = explode(';', $sqlContent);        // 按分號分割語句

foreach ($statements as $stmt) {
    $stmt = trim($stmt);
    if (empty($stmt)) continue;                 // 跳過空語句
    $stmt .= ';';                               // 還原分號
    $result = mysqli_query($conn, $stmt);       // 執行(需先建立 $conn)
    if (!$result) {
        error_log("SQL 執行失敗: " . mysqli_error($conn) . "\nSQL: $stmt");
    }
}
?>

關鍵改進點

  • 使用 mysqli/PDO:原示例用已棄用的 mysql_* 函數,生產環境必須改用 mysqli 或 PDO。
  • 事務支持:導入大量數據時建議開啟事務,失敗可回滾。
  • 處理分號在字符串中:簡單 explode(';') 會誤切含分號的字符串字面量,健壯方案需用正則或解析器(如 php-sql-parser)。
  • 大文件分批:超大 SQL 文件建議分行讀取、分批執行,避免記憶體溢出。

完整版示例(PDO + 事務)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$handle = fopen('backup.sql', 'r');
$buffer = '';
$count = 0;

$pdo->beginTransaction();
try {
    while (($line = fgets($handle)) !== false) {
        $buffer .= $line;
        if (substr(trim($line), -1) === ';') {
            $pdo->exec($buffer);
            $buffer = '';
            if (++$count % 100 === 0) $pdo->commit(); // 每 100 條提交一次
        }
    }
    $pdo->commit();
    echo "導入成功,共執行 $count 條語句";
} catch (PDOException $e) {
    $pdo->rollBack();
    echo "導入失敗: " . $e->getMessage();
}
fclose($handle);
?>

應用場景

自動化安裝腳本、數據庫遷移工具、備份恢復功能等。

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