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 查詢中的任何異常。