$pdo=newPDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test1','root','');//Fatalerror:UncaughtPDOException:SQLSTATE[HY000][1049]Unknowndatabase'blog_test1'
blog_test1 表并不存在,以是在 new PDO 的时候就已经直接会抛出非常了。这个在实例化连接数据库过程中的缺点处理机制是固定的,不是我们能修正的缺点处理机制,毕竟如果连数据库连接都无法建立的话,就不用谈后面的任何操作了。
默认情形$pdo=newPDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test','root','');$pdo->query('selectfromaabbcc');var_dump($pdo->errorCode());//string(5)"42S02"var_dump($pdo->errorInfo());//array(3){//[0]=>//string(5)"42S02"//[1]=>//int(1146)//[2]=>//string(38)"Table'blog_test.aabbcc'doesn'texist"//}
在上面的测试代码中,我们查询了 aabbcc 这个表,但实在数据库中并不存在这个表。如果不该用 errorCode() 或者 errorInfo() 的话,这段代码不会有任何输出,也便是说,不会有任何缺点信息让你看到,代码就直接运行过去了。
这个便是 PDO 在默认情形下的缺点处理机制。实在,这样的处理并不好,由于如果我们忘却设置缺点处理机制的话,就会导致一些缺点无法呈现,而且并不好调试。

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);$pdo->query('selectfromaabbcc');//Warning:PDO::query():SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'blog_test.aabbcc'doesn'texist
在设置缺点处理机制为警告后,PDO 会抛出一个不影响程序实行的 warning 信息。但是,如果我们修正了 ini 文件中缺点处理机制后,也可能是看不到警告信息的。不过相对付默认处理的情形来说,有一条警告信息已经非常好了。
设置为非常$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->query('selectfromaabbcc');//Fatalerror:UncaughtPDOException:SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'blog_test.aabbcc'doesn'texist
末了,我们将缺点处理机制设置为抛出非常。总算是能让程序中止运行并且报出 Fatal error 缺点了,同时,这个非常信息也是可以通过 try...catch 来捕获到的。这样的开拓才是我们最须要的开拓形式。
属性添加办法在上述测试代码中,我们利用的是 setAttribute() 方法来设置 PDO 的缺点处理属性,但实在我们可以在实例化 PDO 类时就指定一些须要的属性。
$pdo=newPDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test','root','',[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]);$pdo->query('selectfromaabbcc');//Warning:PDO::query():SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'blog_test.aabbcc'doesn'texist
总结
PDO 已经是现在的主流数据库连接扩展,也是各种框架的必备连库扩展,但是如果不深入的学习的话,很多人可能还真不知道很多关于 PDO 的一些知识。框架在为我们带来便利的同时,也让我们变得更“笨”,以是,学习还是要更多地打仗底层地知识,免得在口试的时候须要手写代码的时候手足无措。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/%E5%AD%A6%E4%B9%A0PDO%E4%B8%AD%E7%9A%84%E9%94%99%E8%AF%AF%E4%B8%8E%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E6%A8%A1%E5%BC%8F.php
参考文档:
https://www.php.net/manual/zh/pdo.error-handling.php