首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP foreach 迴圈僅插入第一筆資料?MySQL 插入失效排查指南

     編輯:程式設計疑難解答

在 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);

這一步能立即揭示三類常見真相:

  1. 迴圈實際執行次數:若 SQL 僅輸出一次,說明 `foreach` 本身未正確遍歷(如 `explode` 分隔符錯誤、檔案讀取異常、JSON 解析報錯導致迴圈中斷)。
  2. SQL 語句結構:檢查變數拼接是否正確,特別是字串欄位的引號包裹、特殊字元轉義(如單引號未處理導致 SQL 語法錯誤)。
  3. 資料庫報錯資訊:若 SQL 輸出正常但資料未入庫,需檢查 `mysql_error()` 回傳的具體錯誤碼(如主鍵衝突、欄位長度超限、外鍵約束失敗)。

深層原因與現代化修正建議

除了上述調試技巧,該代碼存在亟待修正的架構級問題:

  • 棄用 `mysql_*` 擴展:PHP 7.0+ 已移除,必須遷移至 mysqli 或 PDO,並使用**預處理語句**防止 SQL 注入。
  • 缺乏錯誤處理:每次 `query/execute` 後必須檢查返回值,失敗時記錄 `errorInfo()`。
  • 事務控制缺失:批次寫入應開啟事務,確保原子性;單條提交效率極低。
  • JSON 解析容錯:`json_decode` 失敗返回 `null`,需判斷 `json_last_error()` 避免後續陣列操作報錯中斷迴圈。

重構代碼範例

$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、構建健壯應用的正道。

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