Предположим, у меня есть следующая таблица:
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
был объявлен как NOT NULL
.Когда нулевое значение передается ему в подготовленном операторе, оно, естественно, завершается ошибкой.Таким образом:
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
Сообщение об ошибке Column 'stuff' cannot be null
довольно ясно.Но когда я выполняю точно такой же запрос, используя связанные параметры 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 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
}
Ничего из того, что отладочная информация, возвращающая меня через PHP, не является полезной.Как я могу получить реальное сообщение об ошибке вместо этого 00000
мусора?