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

时间:2017-09-21 11:30:07

标签: php mysql pdo exception-handling fetch

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

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

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

所以,我的问题是:有没有办法以正确的方式处理结果?

感谢您的时间。

P.S。:当我没有找到任何记录时,我希望收到一个空数组,当出现错误时,我会收到值FALSE。就像fetchAll()方法一样。

UPDATE:

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

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

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

2 个答案:

答案 0 :(得分:2)

这是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,那么查询没有返回任何记录。

答案 1 :(得分:0)

<?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);
    }
}
?>