mysqli::get_warnings是MySQLi 對象的方法,用於檢索最近一次MySQL 操作中產生的所有警告。警告通常不會導致查詢失敗,但可能包含重要信息,例如數據截斷、隱式類型轉換等,這些信息對保證數據的準確性和調試都很有幫助。
在執行一條可能產生警告的SQL 語句後,通過get_warnings獲取警告對象:
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("INSERT INTO users (id, name) VALUES (1, 'Alice'), (1, 'Bob')"); // 可能違反唯一約束
if ($warning = $mysqli->get_warnings()) {
do {
printf("Warning: %d: %s\n", $warning->errno, $warning->message);
} while ($warning->next());
$warning->close();
}
?>
在這段代碼中, get_warnings()返回一個mysqli_warning對象,可以遍歷所有警告並輸出警告號和警告消息。
如果你在項目中使用異常捕獲數據庫錯誤,仍然可以通過get_warnings來獲取非致命的警告信息:
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
try {
$mysqli->query("UPDATE products SET price = price * 1.1 WHERE id = 5");
if ($warning = $mysqli->get_warnings()) {
do {
error_log("MySQL Warning: {$warning->errno} - {$warning->message}");
} while ($warning->next());
$warning->close();
}
} catch (mysqli_sql_exception $e) {
echo "Error: " . $e->getMessage();
}
?>
此時,正常錯誤由異常捕獲,而警告則被記錄到日誌中。
當進行批量數據寫入或複雜事務時,警告信息尤為重要,能夠提示如數據截斷或約束未完全滿足等問題:
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$values = [
"(1, 'LongNameExceedingLimit')",
"(2, 'NormalName')"
];
$sql = "INSERT INTO customers (id, name) VALUES " . implode(',', $values);
$mysqli->query($sql);
if ($warning = $mysqli->get_warnings()) {
while ($warning) {
echo "Warning {$warning->errno}: {$warning->message}\n";
$warning = $warning->next();
}
}
?>
這可以幫助發現諸如字段長度溢出而導致的數據截斷警告。
get_warnings依賴於MySQL 服務器支持警告信息,通常要求MySQL 5.6 及以上版本。較低版本可能不返回警告,或行為不穩定。
當SQL 查詢因嚴重錯誤失敗時, get_warnings不會返回警告信息,此時應通過錯誤處理機制捕獲錯誤。
調用get_warnings()返回的對象需要顯式調用close()方法釋放底層資源,防止內存洩漏。
警告消息有時會暴露SQL 細節或數據狀態,務必在生產環境中謹慎處理日誌輸出,避免信息洩露。
mysqli::get_warnings是PHP 開發中監控數據庫警告的有效工具,合理使用它能夠提前發現潛在數據問題和隱患。推薦在重要數據庫操作後調用此函數,結合日誌或調試工具,提升程序的穩定性和可維護性。同時,注意MySQL 版本兼容及資源釋放,確保應用性能和安全。