2

我有代码:

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

这将返回:Array ( [0] => 00000 [1] => [2] => )

为什么不返回错误信息?

4

2 回答 2

6

以下正确报告错误:

$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()成功,则execute()可能会导致错误,但该错误是针对$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 中,然后语句的实际准备会延迟到您调用execute(). 因此,如果有错误,将报告$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(),但在 处我得到了与上面相同的错误execute()。同样,您必须$stmtexecute().

于 2013-07-15T19:04:41.547 回答
-2

SQLSTATE 00000 表示“成功”。根据PHP 文档

如果未设置 SQLSTATE 错误代码或没有特定于驱动程序的错误,则元素 0 之后的元素将设置为 NULL。

于 2013-07-15T18:12:00.963 回答