繁體中文
版本: v2.3.0

錯誤處理

PDO 提供了三種可在連線上設定的錯誤處理模式。更多說明請參閱 PDO 錯誤處理說明文件
$database = new Medoo([
	// 必填。
	'type' => 'mysql',
	'host' => 'localhost',
	'database' => 'name',
	'username' => 'your_username',
	'password' => 'your_password',

	// 可選。
	// PDO::ERRMODE_SILENT(預設) | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION
	'error' => PDO::ERRMODE_SILENT,
]);

PDO::ERRMODE_SILENT(預設)

在此模式下,PDO 以靜默方式設定錯誤代碼。您可以從 $database->error 讀取錯誤訊息,從 $database->errorInfo 讀取詳細錯誤訊息。
$database = new Medoo([
	// ...
	'error' => PDO::ERRMODE_SILENT
]);

$database->select("bccount", "*");

var_dump($database->error);
var_dump($database->errorInfo);

// string(36) "Table 'master.bccount' doesn't exist"
//
// array(3) {
// [0]=> string(5) "42S02"
// [1]=> int(1146)
// [2]=> string(36) "Table 'master.bccount' doesn't exist"
// }

PDO::ERRMODE_WARNING

PDO 會發出傳統的 E_WARNING 訊息。這在開發階段非常有用,因為執行會繼續進行。你仍然可以透過 $database->error 讀取錯誤,就像在 PDO::ERRMODE_SILENT 模式下一樣。
$database = new Medoo([
	// ...
	'error' => PDO::ERRMODE_WARNING
]);

$database->select("bccount", "*");

var_dump($database->error);
var_dump($database->errorInfo);

// Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found:
// 1146 Table 'bccount' doesn't exist in /src/Medoo.php on line 10
//
// string(36) "Table 'master.bccount' doesn't exist"
//
// array(3) {
// [0]=> string(5) "42S02"
// [1]=> int(1146)
// [2]=> string(36) "Table 'master.bccount' doesn't exist"
// }

PDO::ERRMODE_EXCEPTION

PDO 拋出 PDOException 並停止後續執行,這可以幫助您快速識別失敗的程式碼路徑。
$database = new Medoo([
	// ...
	'error' => PDO::ERRMODE_EXCEPTION
]);

$database->select("bccount", "*");

// 這一行不會執行。
var_dump($database->error);

// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found
// 1146 Table 'master.bccount' doesn't exist in /src/Medoo.php:10
// Stack trace:
// #0 /src/Medoo.php(564): PDOStatement->execute()
// #1 /src/Medoo.php(1652): Medoo\Medoo->exec(Object(PDOStatement), Array)
// #2 /var/www/playground/index.php(44): Medoo\Medoo->select('bccount', Array, Array)
// #3 {main}
// thrown in /src/Medoo.php line 10
// 使用 try-catch 處理並印出例外訊息。
try {
	$database->select("bccount", "*");
} catch (PDOException $e) {
	echo $e->getMessage();
}

// SQLSTATE[42S02]: Base table or view not found: 1146 Table 'master.bccount' doesn't exist

檢查錯誤狀態

在 PDO::ERRMODE_SILENT 和 PDO::ERRMODE_WARNING 模式下,$database->error$database->errorInfo 在沒有錯誤發生時為 null。你可以透過檢查 null 來判斷是否發生錯誤。
$database->select("bccount", "*");

if ($database->error) {
	echo "發生錯誤。";
}

// 發生錯誤!
$database->select("account", "*");

if (!$database->error) {
    echo "沒有錯誤。";
}

// 沒有錯誤。