2010-10-22 61 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. 
}