Php 如何使用PDO准备的语句从MySQL中获取有意义的错误消息?

Php 如何使用PDO准备的语句从MySQL中获取有意义的错误消息?,php,mysql,pdo,Php,Mysql,Pdo,假设我有下表: mysql> CREATE TABLE example ( -> `id` INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, -> `stuff` VARCHAR(255) NOT NULL -> ); Query OK, 0 rows affected (0.06 sec) stuff列被声明为notnull。当一个空值在一个准备好的语句中传递给它时,它自然会失败。因此: mysql>

假设我有下表:

mysql> CREATE TABLE example (
    -> `id` INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    -> `stuff` VARCHAR(255) NOT NULL
    -> );
Query OK, 0 rows affected (0.06 sec)
stuff
列被声明为
notnull
。当一个空值在一个准备好的语句中传递给它时,它自然会失败。因此:

mysql> PREPARE test FROM "INSERT INTO example (stuff) VALUES (?)";
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> SET @a = NULL;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE test USING @a;
ERROR 1048 (23000): Column 'stuff' cannot be null
错误消息
列“stuff”不能为空
非常清楚。但是当我使用PDO的绑定参数执行完全相同的查询时,它不会给我那个错误消息。下面是一个示例脚本:

<?php

$host = 'localhost';

$user = 'fakeuser';
$pass = 'fakepass';
$db_name = 'fakedb';

$dsn = "mysql:host=$host;port=3306;dbname=$db_name";

// Connect to the database.
try {
    $DB = new PDO(
        $dsn,
        $user,
        $pass,
        array(PDO::ATTR_PERSISTENT => true)
    );
} catch (PDOException $e) {
    print "Unable to connect to database.\n";
    exit;
}

// Make sure everything is handled in the UTF-8 character set.
$DB->exec('SET NAMES UTF8');

$SQL = 'INSERT INTO example (stuff) VALUES (:stuff)';

$query = $DB->prepare($SQL);

$values = array(
    ':stuff' => null,
);

$saved = $query->execute($values);

print "\$saved is:\n";
var_dump($saved);
print "\n\n";

print "Error code is:\n";
var_dump($DB->errorCode());
print "\n\n";

print "Error info is:";
var_dump($DB->errorInfo());
print "\n\n";

所有这些都不是通过PHP返回给我的调试信息有用。我怎样才能让它给我真正的错误信息,而不是这个
00000
垃圾?

试试
$query->errorInfo()

试试
$query->errorInfo()

可能重复的@Marc B不是重复的问题。我实际上不想插入空值;我想从PDO那里得到真正的错误信息。插入空值只是让MySQL抛出PHP无法报告的错误的简单方法。请尝试
$query->errorInfo()
。@Marc B啊哈!是的,成功了。如果你把它作为一个答案贴出来,我会很高兴地投赞成票并接受。可能是@Marc B的重复,而不是那个问题的重复。我实际上不想插入空值;我想从PDO那里得到真正的错误信息。插入空值只是让MySQL抛出PHP无法报告的错误的简单方法。请尝试
$query->errorInfo()
。@Marc B啊哈!是的,成功了。如果你把它作为一个答案,我会很高兴地投票并接受。总是简单的事情,不是吗?总是简单的事情,不是吗?
$ php test.php

$saved is:
bool(false)

Error code is:
string(5) "00000"

Error info is:array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}