在使用PHP 將CSV 文件導入到MySQL 數據庫時,常常會遇到一些數據格式問題、重複鍵、數據截斷等警告。這些警告不會直接導致導入失敗,但會影響數據的完整性和正確性。為了精準掌握導入過程中出現的潛在問題, mysqli::get_warnings函數就成為了排查和優化導入過程的重要工具。
mysqli::get_warnings是PHP 的mysqli類中用於獲取最近一次數據庫操作所產生的警告信息的方法。它返回一個警告對象鏈,通過它我們可以逐條讀取並分析數據庫執行過程中產生的警告,諸如數據截斷、外鍵約束失敗等。
在導入CSV 的場景中,這些警告信息可以幫助我們定位問題行,及時調整CSV 文件或數據庫結構,避免數據異常。
讀取CSV 文件內容。
解析每一行數據。
使用INSERT或LOAD DATA INFILE將數據寫入數據庫。
調用mysqli::get_warnings獲取執行過程中的警告。
根據警告結果做相應處理或記錄日誌。
下面示例展示瞭如何用PHP 結合mysqli導入CSV 並使用get_warnings來獲取警告。
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
$csvFile = fopen("data.csv", "r");
if (!$csvFile) {
die("無法打開 CSV 文件");
}
$lineNumber = 0;
while (($data = fgetcsv($csvFile)) !== false) {
$lineNumber++;
// 假設 CSV 有三列: id, name, email
$id = $mysqli->real_escape_string($data[0]);
$name = $mysqli->real_escape_string($data[1]);
$email = $mysqli->real_escape_string($data[2]);
$sql = "INSERT INTO users (id, name, email) VALUES ('$id', '$name', '$email')";
if (!$mysqli->query($sql)) {
echo "1。 $lineNumber 行插入失敗: " . $mysqli->error . "\n";
} else {
// 獲取警告信息
if ($mysqli->warning_count > 0) {
$warning = $mysqli->get_warnings();
while ($warning) {
echo "1。 $lineNumber 行警告: ({$warning->errno}) {$warning->message}\n";
$warning = $warning->next();
}
}
}
}
fclose($csvFile);
$mysqli->close();
?>
Data truncated for column
說明導入的數據長度超出字段長度,可能導致數據被截斷。建議檢查CSV 對應字段長度,或者數據庫字段類型是否合理。
Duplicate entry
導入的數據違反了唯一性約束,可能是主鍵或唯一索引衝突。需要核查重複數據並處理。
Incorrect datetime value
日期時間格式不正確,導致插入失敗或異常。檢查CSV 中對應字段格式,確保符合MySQL 要求。
利用mysqli::get_warnings ,我們能在導入CSV 過程中實時捕獲並輸出潛在的警告信息,從而實現更細緻的錯誤診斷和數據質量控制。這不僅提升了數據導入的穩定性,也便於後續的數據清洗和修正。
通過合理處理這些警告,確保導入數據的完整性和準確性,是提升系統數據可靠性的關鍵步驟。