2012-07-23 77 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的解決方案。