且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误

更新时间:2022-09-21 13:57:41

本节书摘来自华章社区《PHP精粹:编写高效PHP代码》一书中的第2章,第2.6节处理PDO中的错误,作者:(美)  Davey Shafik,更多章节内容可以访问云栖社区“华章社区”公众号查看

2.5 处理PDO中的错误
当你刚开始使用PDO时,它的某个方面是令人惊讶或让人沮丧的(视你的态度而定),即当它出现问题时,并不总是显而易见的。当我们第一次连接到数据库时,就会看到一个失败的连接会导致抛出一个异常。这里有一个提醒的代码:


《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误

一般来说,当某些引人注目的事情发生时PDO会抛出异常,但是如果你的查询由于某些原因而未能运行时,你也不必为此大惊小怪。这表明我们要仔细检查一切是否按照我们所预期的那样运行。
让我们复习一下迄今为止所学到的相关内容,看看我们如何对出现的问题进行识别和反应。

2.5.1 处理预处理时的问题
当我们调用PDO::prepare()方法时,这个函数会为我们返回一个PDOStatement对象。我们知道,如果这个预处理失败,该函数可能会返回false或抛出一个PDOException,因此,我们应该像这样包裹代码:


《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误

上述示例中的prepare()调用返回了false。此外,如果一个异常发生在我们预处理过程的任何阶段,无论是执行还是获取,它将马上被捕捉并得到处理。
这个示例使用了getMessage()方法,它会告诉你抛出异常的原因。更多关于使用异常的知识可以回顾第1章中的相关内容。

2.5.2 处理执行时的问题
一旦我们有了PDOStatement,就可以绑定任何我们需要的值或参数,并且可以执行它。如果execute()方法成功会返回true;如果失败则返回false,这是我们尝试提取任何结果前检查一切是否正确的***办法。
一个典型的示例如下所示:


《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误


《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误

注意,我们指定了execute()调用的结果,因此可以检查这个结果是true还是false。如果它是true,我们可以继续提取数据,或者接着做想做的任何事情。
然而,如果execute()方法失败了,PDO不会给我们任何解释!相反,我们必须使用errorInfo()方法主动找到错误产生的原因。它会返回一个由3个元素组成的数组:
1)SQLSTATE—一个关于错误产生原因的ANSI SQL标准码;
2)来自数据库驱动的错误代码;
3)来自数据库驱动的错误消息。
在这个示例中,我们使用了第三个元素:错误消息。如果你使用命令行、phpMyAdmin或任何类似的工具针对数据库手动运行这个查询,你将会看到这个错误。当然,在开发阶段这是对我们最有用的信息了。

2.5.3 处理提取数据时的问题
如果我们成功地调用了execute()方法,那么说明已经战胜了大部分的挑战。但是如果我们调用fetch()方法时出了差错,这个方法将返回false。你可以选择在数据库代码中捕捉并测试返回值是否为***选择,或者应用程序是否会处理false被返回的情况。像以前一样,我们用PDOStatement::errorInfo()方法返回数组中关于错误的有用信息。
fetch()方法也可以返回一个空数组(或等效的其他方式,这取决于你的提取模式,就像我们在2.4.3节中看到的一样),并且没有错误状态。这个空数组仅仅表明没有符合你查询的记录。