如何强制PHP不处理MariaDB/MySQL错误
嘿,我太懂你这种闹心的状况了!大概一年前PHP某次更新后,突然就越俎代庖接管了MariaDB/MySQL的错误处理,可你代码里明明已经写了通用的else分支和自定义错误处理函数,这完全打乱了你的原有逻辑对吧?毕竟你的处理方式对用户友好得多,哪像PHP直接掐断连接,半点不考虑用户体验。
你贴的代码片段看起来是截断了:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); set_error_handler('error_report'); register_
不过没关系,咱们直接说核心解决方案——要让PHP别插手数据库错误,关键是调整你用的数据库扩展的错误模式,让错误触发你自己的处理逻辑,而不是被PHP自行处理:
如果你用的是mysqli扩展:
先设置mysqli的错误报告模式,让它把数据库错误转化为PHP错误或者异常,这样就能被你注册的error_report函数捕获。示例代码:// 开启严格错误报告,让数据库错误触发PHP的错误机制 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 然后正常建立连接 $conn = new mysqli($db_host, $db_user, $db_pass, $db_name);这样一来,当数据库操作失败时,就会触发你的自定义错误处理函数,而不是被PHP直接掐断连接。
如果你用的是PDO扩展:
在建立PDO连接时,必须指定错误模式为PDO::ERRMODE_EXCEPTION或者PDO::ERRMODE_WARNING,这样PDO不会自行处理错误,而是把错误抛给你的自定义逻辑。示例代码:$db_options = [ // 让PDO抛出异常,或者换成PDO::ERRMODE_WARNING触发警告 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" ]; $conn = new PDO( "mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass, $db_options );要是选
PDO::ERRMODE_WARNING,错误会以PHP警告的形式触发你注册的error_report函数;选PDO::ERRMODE_EXCEPTION的话,你可以用try-catch块捕获异常,然后交给自己的else分支或者处理函数。
另外要注意,你的set_error_handler函数要确保能覆盖到数据库错误对应的错误级别(比如E_WARNING、E_RECOVERABLE_ERROR),这样才能顺利接管所有数据库相关的错误。
备注:内容来源于stack exchange,提问作者John

