PDO 設定屬性錯誤模式

PDO::setAttribute 在資料庫控制代碼上設定一個屬性。setAttribute 的描述是:

public bool PDO::setAttribute ( int $attribute , mixed $value )

PDO::ATTR_ERRMODE: 此屬性用於錯誤報告。它可以具有以下值之一。

  • PDO::ERRMODE_SILENT:如果程式碼中未設定 ATTR_ERRMODE,則 ERRMODE_SILENT 是 ATTR_ERRMODE 屬性的預設值。它設定錯誤程式碼。在靜默模式下,如果 SQL 中存在錯誤,PDO 將不會丟擲異常; PDO 不會發出任何警告; 它只會返回 false。PDO::ERRMODE_SILENT 的值為 0.指令碼將執行而不會生成任何錯誤或警告。
  • PDO::ERRMODE_WARNING:該值引發 E_WARNING。在警告模式下,如果 SQL 中存在錯誤,PDO 將發出警告但指令碼將繼續執行。PDO::ERRMODE_WARNING 的值為 1.指令碼將執行並生成有關錯誤的警告。
  • PDO::ERRMODE_EXCEPTION:此值丟擲異常。在異常模式下,如果 SQL 中存在錯誤,PDO 將丟擲異常並且指令碼將停止執行。PDO::ERRMODE_EXCEPTION 的值為 2.指令碼將停止執行生成引發異常的錯誤。

示例:現在我們將通過一些示例來檢視屬性 ATTR_ERRMODE 的各種值。為此,建立一個名為 learn_project_db 的資料庫,並在其中插入一個名為 user_table 的表。以下 SQL 程式碼段可用於實現:

DROP DATABASE IF EXISTS `learn_project_db`;
CREATE DATABASE `learn_project_db`;
USE `learn_project_db`;
CREATE TABLE `user_table` (
  `user_email` varchar(50) PRIMARY KEY,
  `user_password` varchar(50) NOT NULL
);
INSERT INTO `user_table` (`user_email`, `user_password`) VALUES
('test1@example.com', '123'),
('test2@example.com', '1234'),
('test3@example.com', '12345');

首先,我們將檢查如果我們不設定 ATTR_ERRMODE 會發生什麼,我們將在 SQL 查詢中出錯。建立一個名為 default.php 的 PHP 檔案,試試這個:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

請注意,查詢中的表名是 wrong_user_table,該名稱未在我們之前建立的資料庫中定義。但是,由於我們沒有設定 ATTR_ERRMODE,它將執行指令碼而不會丟擲任何異常或發出任何警告。它將輸出一個空陣列作為結果集。我們還應該注意到,PDO::ATTR_ERRMODE 的值是 0。

現在,我們將檢查如果我們將 ATTR_ERRMODE 設定為 PDO::ERRMODE_WARNING 會發生什麼,我們將在 SQL 查詢中出錯。建立一個名為 warning.php 的 PHP 檔案,試試這個:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

warning.php 的輸出是:

Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist in E:\xampp\htdocs\oop\db.php on line 10
array(0) { } 
Value of PDO::ATTR_ERRMODE: 1

這一次,當我們用 PDO::ERRMODE_WARNING 值設定 ATTR_ERRMODE 時,它將顯示一條警告資訊。該指令碼成功執行並顯示一個空陣列作為輸出,其值為 PDO::ATTR_ERRMODE 為 1。

最後,我們將檢查如果我們將 ATTR_ERRMODE 設定為 PDO::ERRMODE_EXCEPTION 會發生什麼,我們將在 SQL 查詢中出錯。建立一個名為 error.php 的 PHP 檔案,試試這個:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

error.php 的輸出是:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist' in E:\xampp\htdocs\oop\db.php:10 Stack trace: #0 E:\xampp\htdocs\oop\db.php(10): PDOStatement->execute() #1 {main} thrown in E:\xampp\htdocs\oop\db.php on line 10

這一次,當我們用 PDO::ERRMODE_EXCEPTION 值設定 ATTR_ERRMODE 時,它會丟擲 PDOException,這會產生致命的錯誤。丟擲異常後,指令碼將停止執行。這是處理資料庫查詢相關錯誤的最常用方法。在大多數情況下,我們使用此值設定屬性 ATTR_ERRMODE 來處理可能駐留在 SQL 查詢中的任何異常。