【问题标题】:Should I check the return value of an execute operation in pdo php我应该在 pdo php 中检查执行操作的返回值吗
【发布时间】:2014-11-19 09:42:44
【问题描述】:

我一直在研究注册系统。与 db 交互的数据非常敏感,所以我试图特别注意细节。 这是我如何进行插入的示例。

    try{
        $query="INSERT INTO account (user_id,password,salt) VALUES (:user_id,:password,:salt)";
        $stmt=$db->prepare($query);
        $params=array(':user_id'=>$userId,':password'=>$password,':salt'=>$salt);
        $result=$stmt->execute($params);
        if(!$result){
           $db->rollBack();
           doStaff();
        }
    }
    catch(PDOException $e){
       $db->rollBack();
       doStaff();
    }

我想知道是否存在执行操作的结果返回 false 但 pdo 不抛出异常的情况?我应该同时检查它们,还是我偏执?

【问题讨论】:

  • $stmt->execute() 绝对可以返回 false 而不会引发异常。但是,$db->rollback() 会回滚您未使用的事务。
  • @castis 我正在使用它,你可以在代码中看到它。你能具体说明一下execute什么时候返回false而不抛出异常吗?
  • 你了解transactions吗?这就是rollback 的用途;就目前而言,在您的代码中对 rollback 的调用没有任何作用。
  • @wavemode 这只是我代码的一部分,当然包括多个查询; $db->beginTransaction() 如果这是你的要求。
  • @Whitney 好的,只是检查一下 :)

标签: php mysql pdo


【解决方案1】:

答案是肯定的。

如果您尝试做一些完全不可能的事情(即使用不正确的主机名连接到数据库、使用不正确的用户名或密码进行身份验证等),将会引发 PDOException。但是,如果您的 SQL 中只是存在语法错误或未定义的引用,PDOStatement::execute 将默默地返回 false。如果您想检查这些错误并回滚更改,您当然应该确保 execute 返回 true。

但是,您可以使用change this behavior 代替此方法,以便 SQL 错误显示为异常:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后,代码中的单个 catch 语句就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2020-04-26
    • 2010-11-10
    相关资源
    最近更新 更多