在 PHP 處理多行 JSON 資料並批次寫入 MySQL 時,常遇到「迴圈跑完了但資料庫只有一筆資料」的困惑。本文針對 foreach 迴圈中 mysql_query 僅執行一次的經典問題,提供核心排查思路與修正方案。
開發者從文字檔讀取多行 JSON,解析後在 foreach 中構建 SQL 插入語句:
$cc = file_get_contents('data/phone_log.txt');
$arrConts = explode("\n", $cc);
foreach ($arrConts as $ccc) {
$ccc = json_decode(stripslashes($ccc), true);
// ... 處理 JSON 邏輯
$query = "INSERT INTO logs SET name='".$ccc['name']."', state=1, domain='".$domain."', data='".$new."'";
mysql_query($query); // 僅第一筆生效?
}
現象:資料表 id 為自增,但資料庫僅出現第一筆記錄,後續資料靜悄悄地「消失」了。
最佳回答直指要害:**在 `mysql_query` 前加上 `echo $query;` 列印實際執行的 SQL 語句**。
echo $query; // 關鍵調試:輸出每輪構建的 SQL
mysql_query($query);
這一步能立即揭示三類常見真相:
除了上述調試技巧,該代碼存在亟待修正的架構級問題:
mysqli 或 PDO,並使用**預處理語句**防止 SQL 注入。$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO logs (name, state, domain, data) VALUES (?, 1, ?, ?)");
$lines = file('data/phone_log.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
$data = json_decode($line, true);
if (json_last_error() !== JSON_ERROR_NONE) continue; // 跳過壞行
$stmt->execute([$data['name'], $domain, $new]);
}
$pdo->commit();
總結:**「先印 SQL,再看錯誤」** 是解決資料庫寫入異常的黃金法則;拥抱 PDO/MySQLi 與預處理語句,才是告別低級 Bug、構建健壯應用的正道。