当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE

Posted

技术标签:

【中文标题】当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE【英文标题】:PHP PDO fetch returns FALSE when no records found AND on failure 【发布时间】:2018-03-02 17:44:38 【问题描述】:

PDO 方法 fetch() 返回值 FALSE 在没有找到记录失败时(例如,当数据库访问出现问题时)。

我需要能够区分这两种情况,并以相应的方式处理每一种情况:

在未找到记录时向用户显示消息,并且 失败时抛出异常。

那么,我的问题是:有没有办法以适当的方式处理结果?

感谢您的宝贵时间。

fetchAll() 方法的情况一样。

更新:

方法PdoStatement::fetch 在失败时抛出异常,而不是FALSE。我的回答中证明了这种情况:

Simulate a PDO fetch failure situation

总之,正如@pucky124 已经说过的,区分很容易实现:

如果没有找到记录,PDOStatement::fetch 返回FALSE PDOStatement::fetch 在失败时抛出异常。

【问题讨论】:

为什么不使用PDOStatement::rowCount @ErikKralj 感谢您的评论。一个有趣的想法。我现在就测试一下。您也可以将其作为答案。 “未找到记录”表示一个空的(或用尽的)结果集。不匹配的查询不是失败的查询,它只是一个空的结果集。尝试从空(或用尽)的结果集中获取返回 false,这也不是失败。在queryprepare 阶段发生由于无效查询或失败的数据库连接而导致的真正失败;如果这些成功了,那么在获取时几乎没有任何事情会失败。 @deceze 感谢您的评论。请给我几分钟时间回答。 @deceze 抱歉我的回答迟到了。我怀着极大的兴趣和关注阅读了您的评论。好吧,我不认为 emty result 失败。也不是第二种情况。关于查询和准备阶段的真正失败,我非常清楚。您提到“几乎没有什么会失败”。正是这个“几乎”是关键。我处于试图找出是否存在这种情况的位置。如果不是,那我肯定知道fetch()返回的FALSE只是一个空结果,我可以轻松处理。 【参考方案1】:

这就是PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 的用途。像这样使用它:

$pdo = new PDO(
            'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
            , 'user'
            , 'pass'
            , [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]
    );

当以这种方式使用时,错误实际上会作为异常抛出。这意味着如果 fetch(或使用此 pdo 对象的其他方法)发生错误,将引发异常,并且该方法实际上根本不会返回。这是在 PDO 中处理错误的一种非常有效的方法。现在您知道了,如果 fetch 返回一个值,则不会发生错误,因此如果它为 false,则查询不会返回任何记录。

【讨论】:

确实,这将是正确的方法,在每个人都知道的情况下,PDOStatement::fetch 在失败时抛出异常。这就是为什么我认为,如果你在你的这个答案中也提到我的另一个问题Simulate a PDO fetch failure situation,那会很好。再次感谢您的所有努力! :-)【参考方案2】:
<?php
class Connect extends PDO

    public function __construct()
    
        parent::__construct("mysql:host=localhost;dbname=vicode", 'root', '',
        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        $this->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    

?>

【讨论】:

以上是关于当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE的主要内容,如果未能解决你的问题,请参考以下文章

黄聪:PHP数据库连接失败--could not find driver 解决办法

如何使用 PDO 从 php 文件中插入数据?

PHP PDO - 没有活动事务

PHP PDO准备插入-不插入数据并且不显示错误[重复]

PDO数据访问抽象层

PHP PDO 执行失败时事务会回滚吗?