在使用PHP 的MySQLi 擴展時, mysqli::$errno是一個非常重要的屬性,它存儲了上次數據庫操作中的錯誤碼。通常,我們會通過它來判斷數據庫操作是否成功,或者進行錯誤處理。但有一個值得注意的點, mysqli::$errno ,這可能會導致一些不容易察覺的錯誤。今天,我們就來探討這個問題。
mysqli::$errno是MySQLi 類的一個屬性,它返回最近一次數據庫操作的錯誤碼。如果數據庫操作沒有出錯, mysqli::$errno會返回0。反之,它會返回一個錯誤碼,表示具體的錯誤類型。
例如,當執行一條查詢時,若查詢成功,則mysqli::$errno返回0;如果查詢失敗,則返回相應的錯誤碼。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "連接失敗: " . $mysqli->connect_error;
exit();
}
$query = "SELECT * FROM non_existent_table";
$mysqli->query($query);
if ($mysqli->errno) {
echo "查詢失敗,錯誤碼:" . $mysqli->errno;
}
?>
在上面的例子中,如果執行查詢時出錯, $mysqli->errno會返回一個表示錯誤的數字。
問題出現在mysqli::$errno並不會在每次新的數據庫操作之前自動清空。在某些情況下,可能會出現錯誤碼被保留,導致後續的數據庫操作誤判為失敗。這可能讓你在處理某些操作時非常困惑,因為即使後續操作沒有出錯, $mysqli->errno依舊返回上次錯誤的錯誤碼。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$query1 = "SELECT * FROM valid_table";
$mysqli->query($query1);
$query2 = "SELECT * FROM non_existent_table";
$mysqli->query($query2);
// 此時,$mysqli->errno 依然会返回上次错误查询的錯誤碼,而不是当前查询的錯誤碼
if ($mysqli->errno) {
echo "查詢失敗,錯誤碼:" . $mysqli->errno;
}
?>
在上面的代碼中,即使第二次查詢失敗(查詢不存在的表), $mysqli->errno可能不會立即顯示正確的錯誤碼。實際上,它可能顯示第一次查詢的錯誤碼(如果有的話),造成誤判。
為了避免這個坑,最好的做法是在每次執行新的查詢或數據庫操作時,手動將mysqli::$errno重置為0。可以通過mysqli::clear_errors()方法來清除所有錯誤碼。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$query1 = "SELECT * FROM valid_table";
$mysqli->query($query1);
// 手動清除錯誤
$mysqli->clear_errors();
$query2 = "SELECT * FROM non_existent_table";
$mysqli->query($query2);
if ($mysqli->errno) {
echo "查詢失敗,錯誤碼:" . $mysqli->errno;
}
?>
通過這種方式,你可以確保每次查詢之前, $mysqli->errno是乾淨的,避免舊的錯誤碼干擾新的操作。
mysqli::$errno是MySQLi 中非常有用的屬性,它可以幫助我們識別和處理數據庫錯誤。然而,它有一個隱蔽的坑:不會自動重置。這意味著,如果你不手動清除錯誤碼,可能會導致錯誤碼被保留,從而影響後續操作的錯誤處理。為了避免這種情況,建議每次執行新的數據庫操作前,使用mysqli::clear_errors()方法手動清除錯誤碼。
相關標籤:
mysqli