2010-10-22 63 views
25

這裏是我的代碼片段:PDO的錯誤信息?

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
$sth->execute($data); 

print_r($this->pdo->errorInfo()); 

這應該給我一個錯誤,因爲表不存在一樣。然而,所有我得到的是這樣的:

陣列([0] => 00000)

我怎樣才能得到錯誤的更好的描述,所以我可以調試的問題?

+0

嘗試後,準備打印的錯誤,但執行 – thetaiko 2010-10-22 18:44:08

+0

之前的錯誤看起來很明顯,我,:SEARCH_STRING將與類似「foobar的」(包括引號)被替換,所以你最終的SQL語句看起來像「%‘foobar的’%」,你需要做的是追加%在該$數據 - >執行()語句。由於這是3年前,我相信你找出了錯誤 – relipse 2013-05-13 00:31:14

+0

順便說一句,我遇到了同樣的問題,沒有錯誤信息。我學會修復它的唯一方法就是將SQL複製並粘貼到phpmyadmin中並查找輸出。有沒有人知道這一點?我嘗試了下面的答案。 – relipse 2013-05-13 00:32:58

回答

68

試試這個:

print_r($sth->errorInfo()); 

編輯:

之前添加這是你的準備:

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

這將改變PDO的錯誤報告類型,使其發出警告時有一個PDO錯誤。它應該幫助您跟蹤下來,雖然你的errorInfo中應該有賭集。

+0

謝謝,這給了我完全一樣的東西,'Array([0] => 00000)'。 – 2010-10-22 18:42:14

+0

我添加了另一件你可以嘗試的東西,但是如果errorInfo沒有正確設置,那麼可能還有其他事情正在進行。 – 2010-10-22 18:49:16

+0

這似乎是工作。 – 2010-10-22 18:54:52

2

從手冊:

如果數據庫服務器成功 準備的發言,PDO ::準備() 返回一個PDOStatement對象的對象。如果 數據庫服務器不能成功地 準備語句,PDO ::準備() 返回FALSE或發出PDOException (取決於錯誤處理)。

準備語句可能導致錯誤,因爲數據庫將無法準備語句。在準備好查詢並執行之前,請立即嘗試測試是否有錯誤。

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
print_r($this->pdo->errorInfo()); 
+0

我試過了,它也沒有幫助 – relipse 2013-05-13 00:28:45

3

也許這個帖子太舊了,但它可以幫助作爲建議的人環顧這個: 而不是使用:

print_r($this->pdo->errorInfo()); 

使用PHP破滅()函數:

echo 'Error occurred:'.implode(":",$this->pdo->errorInfo()); 

這應該打印錯誤代碼,詳細的錯誤信息等等,如果你使用一些SQL用戶界面,你通常會得到。

希望它可以幫助

+1

你必須是'echo'發生了一個錯誤:'.implode(「:」,$ this-> pdo-> errorInfo();'。使用'print_r'沒有意義。如果對象不是數組:-) – 2012-09-19 05:29:19

+0

@ShaquinTrifonoff pdo-> errorInfo()的確是一個數組。看到這裏:http://php.net/manual/en/pdo.errorinfo.php – Vikram 2012-09-19 13:41:57

+0

這就是我所說的 - 'implode'把它變成一個字符串,所以沒有理由對字符串使用'print_r' 。 – 2012-09-19 18:56:39

4

舊線,但也許我的回答將幫助別人。我首先執行查詢,則設置一個差錯變量,然後檢查是否的錯誤變量數組爲空解決。看到簡單的例子:

$field1 = 'foo'; 
$field2 = 'bar'; 

$insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)"); 
$insert_QUERY->bindParam(':field1', $field1); 
$insert_QUERY->bindParam(':field2', $field2); 

$insert_QUERY->execute(); 

$databaseErrors = $insert_QUERY->errorInfo(); 

if(!empty($databaseErrors)){ 
    $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print 
    $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc...   

/* 
$errorLogMsg will return something like: 
error info: 
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 'table bogus(field1, field2) VALUES             ('bar', NULL)' at line 1 
) 
*/ 
} else { 
    # no SQL errors. 
}