使用 MySQLi 錯誤函式顯示錯誤
 
MySQLi 是一個 PHP 函式,用於訪問 MySQL 資料庫伺服器。如果你有 MySQL 4.1.13 或更高版本,你可以使用這個擴充套件。
在 PHP 中,你可以使用各種 MySQLi 函式來執行不同的功能。在本文中,我們將學習 MySQLi 錯誤函式。
我們還將瞭解如何以及在何處使用程式碼示例並觀察輸出。對於本教程,我們將使用 MySQL 版本 8.0.27 和 PHP 版本 7.4.1。
PHP MySQLi 錯誤函式
在本教程中,我們將學習以下 PHPMySQLi 錯誤函式:
- mysqli_error()
- mysqli_errno()
- mysqli_error_list()
- mysqli_connect_error()
- mysqli_connect_errno()
所有這些功能都可以在物件導向風格和過程風格中使用。讓我們使用 mysqli_error() 函式來理解這兩種語法。
物件導向風格的 mysqli_error() 函式的語法
string $mysqli->error;
程式風格的 mysqli_error() 函式的語法
string mysqli_error ( mysqli $link )
MySQL 中的 mysqli_error() 函式
此函式用於輸出最近一次函式呼叫(如果有)的最後一個錯誤描述。當你想知道 SQL 查詢是否有錯誤時使用它。
如果沒有錯誤,mysqli_error() 返回錯誤描述和空字串。請參閱以下示例。
使用程式樣式的示例程式碼:
<?php
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "person";
    $connection = mysqli_connect($host, $username, $password, $database) 
    or die("Connection Failed"); 
    $sql = "SELECT * FROM teacher";
    $result = mysqli_query($connection, $sql);
    $error_message = mysqli_error($connection);
    if($error_message == ""){
        echo "No error related to SQL query.";
    }else{
        echo "Query Failed: ".$error_message;
    }
    mysqli_close($connection);
?>
上面給出的程式碼嘗試使用 $host、$username、$password、$database 變數建立連線,並將此連線儲存到 $connection 變數中。
mysqli_error() 函式將把這個連線變數 $connection 作為引數,檢查最近的 MySQLi 函式呼叫是否有錯誤,這裡是 mysqli_query($connection, $sql)。
輸出:

現在,將 SQL 查詢中的表名從 teacher 更改為 person 並觀察下面給出的輸出。
輸出:

作為開發人員,我們很容易理解 person 資料庫中沒有 person 表(這就是上面錯誤中的意思)。
保持表名更改並替換行 $error_message = mysqli_error($connection); 與 $error_message = $connection->error; 使用 MySQLi 錯誤函式來練習和理解物件導向的風格。
MySQL 中的 mysqli_errno() 函式
mysqli_errno() 的工作方式與 mysqli_error() 相同,但它會返回錯誤程式碼而不是錯誤描述。
編寫以下程式碼來練習和理解。你可能已經注意到,我們使用程式樣式來練習此功能。
<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 
     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_errno($connection);
     if($error_message == ""){
     	echo "No error related to SQL query.";
     }else{
     	echo "Query Failed: ".$error_message;
     }
    mysqli_close($connection);
?>
上面給出的程式碼將顯示以下輸出,你將在其中看到一個數字作為錯誤程式碼。
輸出:

問題是,為什麼我們使用這個函式只顯示數字?因為如果要列印使用者友好的錯誤訊息(自定義訊息),可以在 if-else 語句中使用此錯誤程式碼。
請參閱下面的程式碼及其輸出。
<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 
     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_errno($connection);
     if($error_message == 1146){
     	echo "You are trying to read the data from a table which doesn't exist in your 			database "."'".$database."'";
     }
    mysqli_close($connection);
?>
輸出:

MySQL 中的 mysqli_error_list() 函式
此函式對於瞭解錯誤程式碼、SQL 狀態和錯誤描述非常有用,因為此函式返回一個包含所有必要資訊的陣列。
示例程式碼:
<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 
     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     print_r(mysqli_error_list($connection));
     mysqli_close($connection);
?>
輸出:

MySQL 中的 mysqli_connect_error() 函式
    
mysqli_connect_error() 返回上次連線的錯誤描述(如果有)。雖然 die() 函式也告訴我們連線不成功,但 mysqli_connect_error() 返回的錯誤我們很容易理解。
首先編寫以下程式碼,檢視其輸出,然後我們將其與 mysqli_connect_error() 產生的輸出進行比較。
<?php
     $host = "localhost";
     $username = "root";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed"); 
     $sql = "SELECT * FROM person";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);
     if($error_message != ""){
     	echo "Query Failed: ".$error_message;
      }
    mysqli_close($connection);
?>
輸出:

見上面給出的輸出;你可以看到我們能理解的錯誤在中間的某個地方。
想象一下,如果你有 2 或 3 個錯誤,就不容易找出來。現在,使用 mysqli_connect_error() 並使用以下程式碼和輸出檢視差異。
<?php
     $host = "localhost";
     $username = "newroot";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed: ".mysqli_connect_error()); 
     $sql = "SELECT * FROM teacher";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);
     if($error_message != ""){
     	echo "SQL Query Failed: ".$error_message;
    }
    mysqli_close($connection);
?>
輸出:

上面的輸出清楚地表明沒有名為 newroot 的使用者,它不允許你訪問資料庫。
MySQL 中的 mysqli_connect_errno() 函式
此函式的行為類似於 mysqli_connect_error(),但顯示錯誤程式碼而不是錯誤訊息。我們可以使用此錯誤程式碼來編寫自定義錯誤訊息。
示例程式碼:
<?php
     $host = "localhost";
     $username = "newroot";
     $password = "";
     $database = "person";
     $connection = mysqli_connect($host, $username, $password, $database) 
     or die("Connection Failed: ".mysqli_connect_errno()); 
     $sql = "SELECT * FROM teacher";
     $result = mysqli_query($connection, $sql);
     $error_message = mysqli_error($connection);
     if($error_message != ""){
	     echo "SQL Query Failed: ".$error_message;
     }
     mysqli_close($connection);
?>
輸出:

まとめ
考慮到所有討論和示例,我們得出了兩個主要類別。第一類顯示有關 SQL 查詢的錯誤,另一類顯示有關資料庫連線的錯誤。
根據專案需要,我們可以列印每個類別的錯誤資訊或錯誤程式碼。
