PHP使用PDO连接数据库失败无报错的原因咨询
可能的原因及解决方案
- 实例化PDO时的错误模式配置时机错误
你是在new PDO执行成功之后才设置PDO::ATTR_ERRMODE属性,如果连接过程本身就失败,此时PDO还没实例化完成,默认使用PDO::ERRMODE_SILENT静默模式,不会抛出异常,自然走不到catch块。
正确写法是把错误模式作为构造函数的第四个参数传入,确保连接阶段就启用异常抛出:
<?php $servername = "localhost"; $username = "myusername"; $password = "mypassword"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, // 可按需加其他PDO配置项 ]; try { $db = new PDO('mysql:host=localhost;dbname=mydatabase;charset=utf8mb4', $username, $password, $options); } catch (PDOException $e) { print "连接错误:" . $e->getMessage() . "<br/>"; die(); } catch (Error $e) { // PHP7+ 捕获核心错误,比如PDO扩展未安装的场景 print "系统错误:" . $e->getMessage() . "<br/>"; die(); } ?>
- PHP运行环境的错误输出配置关闭
检查你的php.ini配置,确认display_errors = On、error_reporting = E_ALL,如果不方便修改全局配置,可以在代码开头临时加两行配置启用错误显示:
ini_set('display_errors', 1); error_reporting(E_ALL);
- 捕获的异常类型不全
PHP7及以上版本中,致命错误会以Error类的形式抛出,比如环境没装pdo_mysql扩展、PDO类不存在的场景,抛出的不是PDOException,只写一个catch捕获PDOException就会漏掉这类错误,参考上面的代码增加对Error类型的捕获即可。
内容的提问来源于stack exchange,提问作者nooby
相关产品推荐
相关产品推荐

