2012-07-23 80 views
1

按照要求我重新格式化的问题:会返回一个错误的PDO执行()与抛出的异常相同吗?

对于下面的代码:

$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,所以,我认为,当执行()遇到从数据库中的错误,它应该抛出例外。 然后我意识到,如果这是真的,只要抛出的异常与返回的'false'相同,我甚至可能不必检查execute()的返回值。我只需要从外面抓到。如果没有发现,查询应该没问题。
    但我不确定这是因为execute()不会根据手册默认抛出异常。当我插入某些东西时,我尝试了几次操作,如重复PK和唯一约束违规。我的断言得到支持:PDO将抛出一个异常,我可以从数据库中获取detaield错误消息。 但是我不知道这是否是一个普遍的事实。是否有可能从execute()中获得false,并且当我将ERRMODE设置为最大值时抛出PDOEXCEPTION? *
+0

如果启用异常,那么PDO在失败时抛出异常,它不会返回false。检查错误没有意义,因为执行会立即跳转到任何相关的catch块。 – 2016-08-18 15:21:22

+1

这是预期的行为,但execute()似乎并不总是抛出异常。其实际上这个问题是关于什么的。 – Niksac 2016-08-18 15:55:09

回答

1

试试这个:

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); 
+1

是的,这基本上是我曾经测试过的,正如我所说的,我试图插入重复的pk等。但是我不认为我想列举每个我的查询可能导致错误的情况,坦率地说我不'不知道所有的情况。因此,我问这个问题,以便快速回答。我可以发现一些帖子很可能说我的断言是真实的,比如Bill Karwin在http:// stackoverflow中的评论。com/questions/8618618/php-pdo-mysql-transaction-code-structure等等,但就像我说的,我不确定。 – 2012-07-24 02:59:14

+0

只要你有正确的查询,这将找到所有的错误。它只是查找何时查询未执行,无论情况如何。重复应该在SQL语句 – mlishn 2012-07-24 13:38:29

+1

(1)中处理是的,这是错误应该是正确的?就像你的查询没有被实际执行一样。现在我的观点是,如果每个错误都将由抛出的异常来处理,则返回值的含义为零。因为如果我抓到一个,就会返回一个错误(但是它的价值在它已经跳出来时不会被返回)。 (2)你建议我在插入前检查每一个可能的重复吗?我实际上看不到这一点。为什么不从数据库中读取错误消息?这只是一个数据库操作,并告诉你所有你需要的信息。也许我错了,但希望有人澄清我。 – 2012-08-01 08:49:28

0

我见过的execute()返回未抛出异常这是一种在我看来,意外/不良行为错误。 这意味着我们基本上必须同时执行 - 并行错误和异常处理。

在我的情况:如果我准备了一个插入查询没有任何参数,然后用参数执行。执行不会抛出异常,但返回false。我建议任何人使用@ mlishn的解决方案。