【问题标题】:will a false returned PDO execute() the same as the exception it thrown?错误返回的 PDO execute() 会与它抛出的异常相同吗?
【发布时间】:2012-07-21 23:06:10
【问题描述】:

根据要求,我重新格式化问题:

对于以下代码:

$newPDO=new PDO($DSN,$USER,$PASS);
$newPDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$SQL='SOME SQL STATEMENT MAYBE FAULTY';
try{
$Query=$newPDO->Prepare($SQL)
$Success=$Query->execute();
if(!$Success)
  echo('A');
}
catch(PDOException $e)
{
  echo('B');
}

问题是,是否可以看到打印的“A”?对于不同类型的$SQL(例如选择或插入),答案会有所不同吗?

原问题:

  • 首先我将属性设置为 PDO::ATTR_ERRMODE、PDO::ERRMODE_EXCEPTION,这样,我认为,当 execute() 遇到来自 DB 的错误时,它应该抛出异常。 然后我意识到,如果这是真的,我什至不必检查 execute() 的返回,只要抛出的异常与返回的“假”相同。我只需要从外面抓。如果没有捕获到查询应该没问题。
    但我不确定这一点,因为 execute() 默认情况下不会根据手册抛出异常。当我插入一些东西时,我尝试了一些操作,比如重复 PK 和违反唯一约束。支持我的断言:PDO 将抛出异常,我可以从 DB 获取详细的错误消息。 但我不知道这是否是普遍真理。当我将 ERRMODE 设置为最大值时,是否有可能从 execute() 中得到一个错误,并且没有抛出 PDOEXCEPTION? *

【问题讨论】:

  • 如果开启异常,那么 PDO 在失败时抛出异常,它不会返回 false。检查 false 是没有意义的,因为执行会立即跳转到任何相关的 catch 块。
  • 这是预期的行为,但 execute() 似乎并不总是抛出异常。它实际上是关于这个问题的。

标签: php exception pdo execute


【解决方案1】:

我已经看到 execute() 返回 false 而不抛出异常,在我看来这是一种意外/不良行为。 这意味着我们基本上必须同时进行错误和异常处理。

就我而言:如果我准备了一个不带任何参数的插入查询,然后使用参数执行。 Execute 不会抛出异常,而是返回 false。我建议任何人使用@mlishn 的解决方案。

【讨论】:

    【解决方案2】:

    试试这个:

       try {
          //Initial query processing
          $execute = $query->execute()
          if (!$execute) {
            //catch the exception
            throw new Exception ("blah")
          }
        } catch (Exception $e) {
          //Exception logic here
    
        }
    

    这样编写您的查询,如果他们在try 部分遇到异常,它将中继到catch 部分,您可以随意处理它(id 是否取决于特定情况)。

    如果没有异常,它将永远不会到达catch 语句,并且您的查询只会执行。

    当涉及到 DUPLICATES -> 您需要在 SQL 中解决这个问题。例如,您的查询可能是:

    INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 
    

    【讨论】:

    • 是的,这基本上是我用来测试的,正如我所说,我试图插入重复的 pk 等。但是我不认为我想列举我的查询可能导致错误的所有情况,坦率地说,我不知道所有情况。因此,我问这个问题是为了快速回答。我可以找到一些帖子很可能表明我的断言是正确的,例如 stackoverflow.com/questions/8618618/… 中的 Bill Karwin 的 cmets 等,但就像我说的,我不确定。
    • 只要你有正确的查询,这将找到所有的错误。它只是寻找查询未执行的时间,无论是什么情况。重复应在 SQL 语句中处理
    • (1) 是的,这就是错误应该是对的吗?就像您的查询实际上并未执行一样。现在我的观点是,如果每个错误都将由抛出的异常处理,则返回值的含义为零。因为如果我抓到一个,就会返回一个 false (但实际上不会返回该值,因为它已经跳出)。 (2) 你建议我在插入之前检查所有可能的重复项?我实际上看不到重点。为什么不直接从数据库中读取错误信息?这只是一个数据库操作,会告诉您您需要的所有信息。也许我错了,但希望有人能澄清我。
    • 不,我的意思是这样写你的查询&如果他们在try部分遇到异常,它将转发到catch部分,你可以随心所欲地处理它(是否 id 取决于特定情况)。如果没有异常,它将永远不会到达catch 语句,您的查询只会执行。当涉及到 DUPLICATES -> 你需要在 SQL 中解决这个问题。例如,您的查询可能是:INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
    • 谢谢。但是,如果我设置 PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION,重复 PK 会抛出异常。另外,我认为在很多情况下,我们只需要告诉用户您已经输入了一些内容,例如您尝试注册的用户名已被其他人使用。因此,我将检查条件放在了 catch 部分。这又不是我的问题。我很确定重复 PK,外键约束会从 PDO 抛出异常。但是我从 mysql 中看到了一堆 SQL 错误,但我不确定 PDO 是否可以相应地抛出异常。
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多