记录调试信息和错误
问题
希望访问一些信息来帮助你调试数据库问题。例如,一个查询失败时,希望查看数据库返回的错误消,息。
解决方案
执行一个操作后,如果操作失败,使用PD0::errorCode()或PD0Statement::errorCode()得到一个错误码。相应的errorInfo()方法可以返回错误的更多信息。
会处理试图访问一个不存在的数据库表所导致的错误。
打印错误信息
$user = 'admin';
$password = '123456';
$db = new PDO('mysql:host=127.0.0.1;port=3306;dbname=dvwa', $user, $password);
$st = $db->prepare('SELECT * FROM zodiacs');
if(!$st){
$error = $db->errorInfo();
print "Problem ({$error[2]})";
}else{
print "sucess";
}
errorCode()方法返回一个5字符错误码。PDO使用SQL 92 SQLSTATE错误码。根据这个标准,00000表示“无错误”,所以返回00000的errorCode()调用表示成功。
errorInfo()方法返回一个3元素数组。第一个元素包含5字符SQLSTATE码(与errorCode()的返回结果相同)。第二个元素是一个特定于数据库后端的错误码。第三个元素是一个特定于数据库后端的错误消息。
要确保在所检查的同一个对象上调用errorCode()或errorInfo(),即调用方法来检查错误的那个对象。在示例10-26中,prepare()方法在一个PDO对象上调用,所以errorInfo()也在这个PDO对象上调用。如果想检查一个pD0Statement对象上调用的fetch()是否成功,就要在这个PD0Statement对象上调用errorCode()或errorInfo()。
这个规则有一个例外,创建一个新PDO对象时情况有所不同。如果创建失败,PDO会抛出一个异常。之所以这样做,这是因为否则将没有可以调用errorCode()或errorInfo()的对象。异常中的消息会详细指出连接为什么失败。****
要让PDO每次遇到一个错误时就抛出异常,可以在创建PDO对象之后在这个对象上调用setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)。这样一来,就能采用一种统一的方式处理数据库问题,而不需要在代码中反复调用errorCode()和errorInfo()。这些操作都封装在一个try/catch块中。
捕获数据库异常
$user = 'admin';
$password = '123456';
try{
$db = new PDO('mysql:host=127.0.0.1;port=3306;dbname=dvwa', $user, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$st = $db->prepare('SELECT * FROM zodiacs');
$st->execute();
while($row = $st->fetch(PDO::FETCH_NUM)){
print implode(',',$row) . "
";
}
}catch(Excejption $e){
print "Database Problem: " . $e->getMessage();
}
警告”错误模式与异常错误模式类似。setAttribute(PD0::ATTR_ERRMODEPDO::ERRMODE_WARNING)告诉PDO在遇到一个数据库错误时发出警告。如果更愿意处理常规的PHP错误而不是异常,就可以使用这个错误模式。用set_error_handler()建立一个定制的错误处理程序来处理EWARNING级事件,可以在这个错误处理程序中处理你的数据库问题。
不论使用哪一种错误模式,如果初始的PDO对象创建失败,PDO都会抛出一个异常。使用PDO时,可以用set_exception_handler()建立一个默认的异常处理程序,这是一个很好的想法。如果没有一个默认的异常处理程序,倘若display_errors打开,未捕获的异常就会导致显示一个完整的栈轨迹。如果连接数据库时抛出一个异常,这个栈轨迹可能包含敏感信息,包括数据库连接的凭据。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验