Я пытаюсь вставить запись в автомобильный стол. Вот отрегулированная версия таблицы.Почему PDO обрабатывает пустое значение как null?
ПРИМЕЧАНИЕ: это не рабочая модель реального времени, ее нельзя использовать или оценивать как таковую. Я просто показываю проблему, которую я имею упрощенным способом.
mysql> describe desc_autos;
+-----------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------------------+----------------+
| car_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| automobile_name | varchar(25) | NO | MUL | | |
+-----------------+------------------+------+-----+---------------------+----------------+
7 rows in set (0.00 sec)
mysql> select count(*) FROM desc_autos WHERE automobile_name IS NULL;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) FROM desc_autos WHERE automobile_name = '';
+----------+
| count(*) |
+----------+
| 19322 |
+----------+
1 row in set (0.02 sec)
+-------------+
CREATE TABLE `desc_autos` (
`car_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`automobile_name` varchar(15) NOT NULL,
PRIMARY KEY (`car_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------------+
1 row in set (0.00 sec)
Таким образом, вы видите automobile_name
поле NOT NULL
, а пустые значения показываются для многих записей. (игнорировать имена полей - просто принять, что есть поле с ненулевыми значениями)
Я преобразовываю из собственных MySQL-функций в PDO. Если я вставляю запись с непустым значением automobile_name
, никаких проблем - работает нормально. Если automobile_name
пуст, PDO перестает.
$automobile_name = '';
try
{
$q = "
INSERT INTO
desc_autos
(
automobile_name
)
VALUES
(
:automobile_name
)
";
$stmt = $dbx_pdo->prepare($q);
$stmt->bindParam(':automobile_name', $automobile_name, PDO::PARAM_STR);
$stmt->execute();
return true;
} catch(PDOException $err) {
log_error();
return false;
}
}
Это приводит к следующей ошибке:
Error: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'automobile_name' cannot be null
Я думал, что я должен был беспрекословно сказать PDO, чтобы вставить значение NULL, в противном случае пустые значения будут вставлены как ... пустые значения.
Ex:
$stmt->bindValue(':automobile_name', !empty($automobile_name) ? $automobile_name : NULL, PDO::PARAM_STR);
Я не нуждаясь для вставки NULLs в данном случае - мне нужно бросить пустой, ненулевое значение в данном поле.
Вопрос:
Почему PDO обработки пустое значение как нуль?
Вы подразумеваете 'IS NULL', работающий с mysql_query()? Поскольку PDO не влияет на выражения MySQL.Что касается вставки, вы связываете это значение с «PDO :: PARAM_STR», который превратит значения NULL в пустые строки. – mario
@mario Моя реакция тоже, но в верхней части находится '$ car_name = ''; ', явно устанавливая ее в пустую строку. –
@mario, перед этим запрос вставки выглядел как '$ q =" INSERT INTO desc_autos (автомобильное имя) VALUES ($ car_name) ";' then with 'mysqli_query ($ dbx, $ q);' Если '$ car_name' было пустой (или даже нулевой), он будет вставлен как пустое значение в MySQL. –