开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:PDO 错误机制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12741
PDO 错误机制
1、目标
PDO的一个错误机制,在异常学习中PHP其实也有一些错误处理的模式,它默认的是警告,出了错就直接报错,PDO是如何来实现这些错误的一个控制,变成一种我们可以控制的一种方式?就要了解PDO的一个错误机制。
目标:了解PDO错误机制这种机制,理解不同机制对应的效果。
2、概念&示例
这个概念指PDO在使用过程中,如果运行时候出现错误(大多的是SQL指令执行错误)的时候,那么PDO对应的处理方式就是它自己的错误机制,PDO提供三种错误机制,是通过一个PDO的常量PDO::ALTR_ERRMODE来选择的,这个属性常量的值对应三种,分别是如下:
1、PDO::ERRMODE_SILENT:静默模式,出错了不处理(默认的)
2、PDO::ERRMODE_WARNING:警告模式,出错了立马给出错误提示
3、PDO::ERRMODE_EXCEPETION:异常模式,出错了将错误交给异常PDOException对象
来具体看看这三种模式。第一个模式PDO::ERRMODE_SILENT,,执行一个错误,查看它的处理效果,比如输入:
第一个模式:$pdo=newPDO(_’mysql:host=locallhost;port=3306;dbname=db_2’’root’,’root’);
$pdo->exec(’insert into t_40 values()_’);
#错误,但是不会报错
运行之后显示没有任何错误,这就是静默的处理方式,对开发者是致命的,拿不到错误,不知道哪里出错。
第二个模式:警告模式$pdo=newPDO(_’mysql:host=locallhost;port=3306;dbname=db_2’’root’,’root’);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)
$pdo->exec(’insert into t_40 values()_’);
#错误:系统直接报错
它里面有个set Attribute,然后对应的这个常量,然后设置一个对应的值,不是把这个值赋给常量,常量是不能被复制的,它只是通过这个常量来判定你要做什么事情,然后再找出你的值去针对的去解决。其实里面有很多switch, switch设置为警告模式,再来运行同样的代码警告模式,需要主动告知PDO。所以这个代码先设定为警告模式,这样代码再往下面运行,有顺序先设定后运行,运行结果如下图,直接告诉warning 就报错了,所以警告这个效果很直接。
第三个模式:$pdo=newPDO(_’mysql:host=locallhost;port=3306;dbname=db_2’’root’,’root’);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPETION)
Try{
$pdo->exec(’insert into t_40 values()_’);#错误:被捕捉到
}catch(PDOException $e){
#进入到异常处理
}
第三种是异常模式,需要修改为异常模式,Try catch可能出现的错误,一定要用 exception 这个类的对象来做,因为它出错了,他出来的 PDOException $e 这个对象。异常模式就要捕获,否则,如果不补足的话,它放在外面就出错了,它也是扔出一个异常,
运行结果如下图,最终又变成了直接一个输出,因为异常没人捕获,所以它就直接报错,告诉哪个地方报错了。
如果不用这种方式,就用catch 来捕捉,这个try必须进行捕获,捕获#PDO中的所有的错误发生,都会产生一个PDOException类对象,既然产生了这个类对象,再捕捉之后,可以理解为echo“来了”,“来了”之后就可以按照自己的逻辑去处理。这就是三种模式。
当然可以看所谓的PDOException异常类。会发现它就是继承了runtimeException里面东西,runtime又继承Exception,所以就有一个架构,这个就是架构的过程,内容会发现三个类都一样,除了名字不一样,其他都一样。所以要掌握这种继承的一个架构这种方式。
总结:
PDO中提供了多种处理机制,静默模式,警告模式,异常模式,其中警告模式,异常模式需要设置,因为静默模式是默认的,PDO可以通过PDO::setAttribute()方法来设定错误模式,但是一定要找准对应的这些要设置的内容,比如ATTR_ERRMODE,可以输出它就是一个数字,定义的一个常量,但是用ATTR_ERRMODE,你能很明确的知道当时要干嘛,以及为什么,就是要让我们知道这种东西,不要乱来,你用我固定的东西我才能帮你,正确的设置,是为了保证我们内部的结构不用去处理一些错误代码,错误的东西可以直接忽略,就相当于没设置,可以给他随便他设置,就是PDO中的一个错误的模式D的三种类型。