我正在调整为PHP/5.2编写的遗留数据库类,该类旨在连接到MySQL并隐藏所有错误。我已经将PDO实例配置为抛出异常:
new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))
现在我需要相应地调整我的代码,以处理函数可以在以前不会引发异常的情况下,所以我前往手册。
在某些情况下,手册是明确的,例如PDO::prepare
:
如果数据库服务器成功地准备了语句,
PDO::prepare()
返回一个PDOStatement
对象。如果数据库服务器 无法成功准备语句,PDO::prepare()
返回FALSE
或发出PDOException
(取决于错误处理)。
在其他情况下,它有点模糊,例如PDO::commit
:
成功时返回
TRUE
,失败时返回FALSE
。
抛出PDOException
如果没有活动交易。
(它可以由于其他原因失败并简单地返回false
吗?
在某些情况下,甚至没有提到例外,例如PDO::bindValue
:
成功时返回
TRUE
,失败时返回FALSE
。
。即使很明显验证它确实会抛出错误(至少在某些错误上)PDOException
。
当手册没有另行说明时,我是否仍然需要检查在错误时返回false
的方法的返回值?
不,当您设置PDO::ERRMODE_EXCEPTION
时,任何错误总是会有例外
当您启用了异常并且代码中发生错误时,代码会直接停止从该函数执行,因此它不会返回任何内容。
所以坦率地说,你不需要检查返回值,但如果你不这样做,你就不能错误任何特定的错误,你将完全依赖PDO来正确错误。
当我创建数据库系统时,如果我看到即将出现错误,我会利用两者,而是自己扔掉它。例如$pdo->prepare('')
非常有效,但在绑定时会出错。
然后还有其他函数,例如fetch
如果数据库中没有结果就不会出错,不检查结果将是愚蠢的。
现在对于提交失败,我相信有 1 种情况会导致它返回 false 而不会引发异常,那就是在连接到数据库后和调用PDO::commit
之前与服务器的连接断开,很高兴知道您是否有远程数据库服务器。
因此,要回答您的问题,是的,它可以在不引发异常的情况下失败,但是如果您有本地数据库,则其时间必须非常具体。
试试这个
try {
$db = new PDO("mysql:host=localhost;dbname=dbname", "username", "password");
}catch( PDOException $Exception ) { $Exception->getMessage( ) ; }