2013-07-09 119 views
1

我有代碼:PDO ERRORINFO沒有返回信息

$stmt = $db->prepare(" bla bla "); 
$stmt->execute(); 
print_r($db->errorInfo()); 

這將返回:Array ([0] => 00000 [1] => [2] =>)

爲什麼不返回的錯誤信息?

+4

你試過了'print_r($ stmt-> errorInfo());'? – andrewsi

+0

我不知道爲什麼它不會,但無論如何異常情況會更好。 [PDO查詢失敗,但我看不到任何錯誤。如何從PDO獲取錯誤消息?](http://stackoverflow.com/a/15990858/285587) –

回答

-1

SQLSTATE 00000表示「成功」。每PHP documentation

如果未設置SQLSTATE錯誤代碼或沒有特定駕駛員的錯誤,下面的元素0的元素將被設置爲NULL。

+0

是的,這就是問題所在。 –

3

以下報告正確的錯誤:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

if (($stmt = $dbh->prepare(" bla bla ")) === false) { 
    print_r($dbh->errorInfo()); 
} 

if ($stmt->execute() === false) { 
    print_r($stmt->errorInfo()); 
} 

注意在上述期間prepare()引起的分析錯誤報告對$dbh。儘管prepare()成功,但​​可能會導致錯誤,但該錯誤報告爲$stmt

在上述試驗,我的prepare()後,立即得到了錯誤報告:

Array 
(
    [0] => 42000 
    [1] => 1064 
    [2] => You have an error in your SQL syntax; 
      check the manual that corresponds to your MySQL server version for the right 
      syntax to use near 'bla bla' at line 1 
) 

但是如果你用模擬的準備這種行爲變化。

當您啓用該屬性時,prepare()實際上是無操作的。它只是將查詢字符串保存在$ stmt中,然後語句的實際準備將被延遲,直到您致電​​。因此,無論是在準備時間還是在執行時間發生錯誤(如果有),都會報告$stmt

我測試改變錯誤報告行,如下所示:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 

// prepare won't report SQL errors, it's virtually a no-op. 
if (($stmt = $dbh->prepare(" bla bla ")) === false) { 
    print_r($dbh->errorInfo()); 
} 

// execute will report errors of parsing or execution. 
if ($stmt->execute() === false) { 
    print_r($stmt->errorInfo()); 
} 

在這種情況下,據報道在prepare()錯誤,而我卻得到了同樣的錯誤如上在​​。再次,您必須檢查$stmt以得到​​後的錯誤。

相關問題