2

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

对于以下代码:

$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?*
4

2 回答 2

0

尝试这个:

   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); 
于 2012-07-23T17:19:17.353 回答
0

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

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

于 2016-08-18T15:16:16.043 回答