Ограничение MySQL NOT NULL не работает
-
21-08-2019 - |
Вопрос
Я пытаюсь реализовать ограничение NOT NULL в таблице customer, которая создается как:
CREATE TABLE CUSTOMER(
cust_id INT(5) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(cust_id),
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(25) NOT NULL,
email VARCHAR(25) NOT NULL,
password VARCHAR(25) NOT NULL,
gender VARCHAR(1) NOT NULL,
city VARCHAR(25) NOT NULL,
dob DATE NOT NULL,
pin INT NOT NULL);
После этого из формы я передаю значения и вставляю их как :
$sql= "INSERT INTO customer(first_name,last_name,email,password,gender,city,dob,pin) VALUES('$first_name','$last_name','$email_add','$password','$gender','$city','$DOB','$pin')";
Однако, если я передаю пустые значения полей, Mysql, кажется, вставляет их?В чем может заключаться возможная проблема??
Решение
$sql= "INSERT INTO customer(first_name,last_name,email,password,gender,city,dob,pin) VALUES('$first_name',".
($last_name?"'".$last_name."'":"NULL").
", '$email_add','$password','$gender','$city','$DOB','$pin')";
Это будет:
VALUES('ahm',NULL,'email@a.ddr' ...
И из-за NOT NULL ничего не будет вставлено.
Другие советы
Я подозреваю, что это потому, что в реальной СУБД, в отличие от Oracle :-), существует различие между пустым значением и нулевым значением.
Пустые строки идеально подходят для NOT NULL
поля.Единственное значение, которое вы не должны быть в состоянии вложить в NOT NULL
поле - это, подождите, пытаюсь вспомнить, ...НОЛЬ.Да, это все.НОЛЬ.:-)
В сторону:Oracle приняла решение много лун назад рассматривать пустые переменные как нули, и это все еще преследует их (или это было бы так, если бы я не был единственным, кто отказался использовать его из-за этой проблемы).
Если вы хотите, чтобы ваш PHP-код работал как Oracle (где пробелы становятся нулями), вам придется предварительно обработать строку, что-то вроде (псевдокод):
if $first_name == "":
$first_name = "NULL"
else:
$first_name = "'" + $first_name + "'"
: : :
$sql= "INSERT INTO customer(" +
"first_name," +
"last_name," +
"emailpassword," +
"gender," +
"city," +
"dob," +
"pin" +
") VALUES (" +
$first_name + "," +
"'$last_name'" + "," +
"'$email_add'" + "," +
"'$password'" + "," +
"'$gender'" +
",'$city'" + "," +
"'$DOB'" + "," +
"'$pin'" +
")";
и так далее для других полей, которые также могут быть нулевыми.Я только показал, как это сделать для $first_name
.
Это приведет к тому, что ваш столбец first_name в INSERT
утверждение должно быть либо NULL
или ценность $first_name
заключен в одинарные кавычки.
Имейте в виду, что все эти поля должны быть проверены и / или изменены, чтобы предотвратить атаки с использованием SQL-инъекций.
Некоторая дополнительная информация из документов здесь:
http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html