Medoo

开始

更新日志

Where 语句

查询

聚合

Fetch

事务

管理

原生SQL查询

Raw object

PDO object

Debug

数据库信息

错误与错误处理

PDO 有三种不同的错误处理策略,您可以在连接时设置。更多信息请阅读 https://www.php.net/manual/en/pdo.error-handling.php。

$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 "没有错误。";
}
 
// 没有错误。