【问题标题】:PDO error message? [duplicate]PDO 错误信息? [复制]
【发布时间】:2011-04-29 07:54:03
【问题描述】:

这是我的代码的 sn-p:

$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 )

如何更好地描述错误以便调试问题?

【问题讨论】:

  • 尝试在准备之后但在执行之前打印错误
  • 这个错误对我来说看起来很清楚, :search_string 将被替换为 'foobar' (包括引号),所以你的最终 sql 语句看起来像 "%'foobar'%" 什么您需要做的是将 % 附加到 ->execute() 语句中的 $data 中。由于这是 3 年前的事情,我相信您已经发现了错误
  • 顺便说一句,我遇到了同样的问题,没有错误消息。我学会修复它的唯一方法是将 SQL 复制并粘贴到 phpmyadmin 中并查找输出。有没有其他人弄清楚这一点?我尝试了以下答案。

标签: php pdo


【解决方案1】:

试试这个:

print_r($sth->errorInfo());

在准备之前添加:

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

这将更改 PDO 错误报告类型,并使其在出现 PDO 错误时发出警告。它应该可以帮助您追踪它,尽管您的 errorInfo 应该已经设置好了。

【讨论】:

  • 谢谢,这给了我完全相同的东西,Array ( [0] => 00000 )
  • 我添加了另一个你可以尝试的东西,但如果 errorInfo 没有正确设置,可能会发生其他事情。
  • 我尝试了 PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING 但它不起作用,我仍然得到 00000。有人有什么想法吗?
  • 非常感谢,这将在页面上发出警告,最好打开开发但在生产时关闭
  • 我添加了这个并且工作了:$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
【解决方案2】:

旧线程,但也许我的回答会对某人有所帮助。我首先执行查询,然后设置错误变量,然后检查错误变量数组是否为空来解决。查看简化示例:

$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.
}

【讨论】:

  • 终于,成功了!!
【解决方案3】:

也许这篇文章太旧了,但它可能有助于作为一个四处寻找的人的建议: 而不是使用:

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

使用 PHP implode() 函数:

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

这应该打印错误代码、详细的错误信息等,如果您使用某些 SQL 用户界面,您通常会得到这些信息。

希望对你有帮助

【讨论】:

  • 您的意思一定是echo 'An error occurred: '.implode(":",$this->pdo->errorInfo();。如果对象不是数组,则使用 print_r 毫无意义:-)
  • @ShaquinTrifonoff pdo->errorInfo() 确实是一个数组。见这里:php.net/manual/en/pdo.errorinfo.php
  • 这就是我要说的——implode 把它变成了一个字符串,所以没有理由在字符串上使用print_r
  • 好吧我的错..更正它..谢谢Shaquin
  • 感谢内爆的想法。节省了我很多时间。 +1
【解决方案4】:

来自手册:

如果数据库服务器成功 准备语句,PDO::prepare() 返回一个 PDOStatement 对象。如果 数据库服务器无法成功 准备语句,PDO::prepare() 返回 FALSE 或发出 PDOException (取决于错误处理)。

prepare 语句可能会导致错误,因为 db 将无法准备语句。在准备好查询之后和执行之前立即尝试测试错误。

$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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多