【问题标题】:PDO does not throw exceptionPDO 不抛出异常
【发布时间】:2018-05-22 14:39:38
【问题描述】:

我知道这个问题已经问过很多次了,但没有一个适合我的答案。

我的 PDO 只是没有抛出任何错误......或者在我之前发现了错误。

我对php很陌生,我讨厌不理解简单的事情。

这是我的初始化代码

$pdo = new PDO("mysql:host=" . $db['host'] . ";dbname=" . $db['dbname'], $db['user'], $db['pass']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

还有一个示例,例如,我插入具有唯一性约束的重复行(但对于未知行或任何 pdo 异常都有同样的问题......)

    $columnString = "....";
    $valueString = "....";
    $sql = "INSERT INTO " . $table . " (" . $columnString . ") VALUES (" . $valueString . ")";
    try {
        $stmt = $this->pdo->prepare($sql);          
        foreach($request_data as $key => $value){
            $stmt->bindValue(':' . $key,$request_data[$key]);
        }
        $stmt->execute();
    } catch (PDOException $e) {
        return null;
    }

当然,这个代码在没有出现数据库问题的情况下运行良好。

我正在使用 Slim 3 框架和 php7。 php5也有同样的问题。

它与框架有关吗?还有其他配置吗?为什么没有捕捉到该死的异常?

【问题讨论】:

  • 我觉得应该是:catch(\PDOException $e){...}(如果你还没有导入和别名的话)
  • 哦!就是这个。是因为我的文件被命名空间了吗?
  • 当您发现错误时除了返回 null 之外,您没有做任何事情吗?您根本没有显示错误。
  • 哦,这是为了举例。当然,我正在正确处理错误。

标签: php exception pdo slim-3


【解决方案1】:

首先,当您创建PDO 类实例或捕获异常PDOException 时,我在您的代码sn-p 中看不到任何use 子句。如果你错过了它们,它可能会给你错误,因为 PHP 找不到它们在哪里。您需要确保添加

use PDO;
use PDOException;

在引用这些类的代码中。

其次,您可以使用此代码抑制任何与 PDO 操作相关的异常。

try {
    //your code
} (PDOException $e) {
    return null;
}

为了能够确定任何与数据库相关的错误的原因,您需要正确处理异常。您需要替换 return null; 以执行更有意义的操作来处理错误。

【讨论】:

  • 第二点是为了简单起见,第一点是我的问题的答案。在 cmets 部分,ka_lin 建议使用 \PDOException 是声明,您建议在标题中使用 use PDOException。两者都有效。最佳做法是什么?
  • \PDOException 用于使用绝对命名空间引用类名,而 PDOException 没有 use PDOException 将导致 PHP 在当前命名空间中查找 PDOException。
  • ... 和 use PDOException 用于在当前命名空间中添加 PDOException?嗯,不错,很有趣。
  • 我相信use 不会将它添加到当前命名空间,它只是通知 PHP 去哪里寻找。哪个是全局命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2012-01-24
  • 2013-05-24
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多