Предположим, у меня есть следующая таблица:
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
?
$query->errorInfo()
попробуйте $query->errorInfo()
.