<?php
$sqlFile = 'install.sql';
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'password';
$dbName = 'myapp';
$mysqli = new mysqli($dbHost, $dbUser, $dbPass);
if ($mysqli->connect_errno) {
die('連線失敗: ' . $mysqli->connect_error);
}
$sql = file_get_contents($sqlFile);
$statements = array_filter(array_map('trim', explode(';', $sql)));
foreach ($statements as $stmt) {
if ($stmt === '') continue;
if (!$mysqli->query($stmt)) {
die("SQL 執行失敗: {$mysqli->error}\nSQL: $stmt");
}
}
$mysqli->close();
echo "匯入完成\n";
SQL 檔中移除 CREATE DATABASE ...; USE ...;,改由 PHP 動態建立:
$mysqli->query("CREATE DATABASE IF NOT EXISTS `$dbName` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$mysqli->select_db($dbName);
fopen() + fgets() 逐行讀取,組裝完整語句再執行,避免 file_get_contents 佔用大量記憶體。$mysqli->autocommit(false) → 執行 → $mysqli->commit(),失敗 rollback()。mysqli::multi_query() 可一次發送多條語句,需循環 next_result() 清理結果集。$mysqli->set_charset('utf8mb4'),SQL 檔儲存為 UTF-8 無 BOM。<?php
$pdo = new PDO("mysql:host=$dbHost;charset=utf8mb4", $dbUser, $dbPass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$pdo->exec("USE `$dbName`");
$sql = file_get_contents($sqlFile);
foreach (array_filter(array_map('trim', explode(';', $sql))) as $stmt) {
$pdo->exec($stmt);
}
echo "PDO 匯入完成\n";
php install.php --sql=install.sql --db=myapp CLI 指令。composer install → php install.php → phpunit。