MySQL não NULL restrição não funciona
-
21-08-2019 - |
Pergunta
Eu estou tentando implementar NÃO restrição NULL na tabela de clientes que é criado como:
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);
Após isto de uma forma que eu estou passando valores e inseri-lo como:
$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')";
No entanto, se eu estou passando em branco valores dos campos, Mysql parece inseri-los? Qual pode ser o possível problema ??
Solução
$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')";
Esta será:
VALUES('ahm',NULL,'email@a.ddr' ...
E por causa de NOT NULL nada será inserido.
Outras dicas
Eu suspeito que isso é porque, em um real DBMS, em oposição ao Oracle :-), há uma distinção entre um valor em branco e um valor NULL.
cordas em branco são perfeitamente válidos para campos NOT NULL
. O único valor que você não deve ser capaz de colocar em um campo NOT NULL
é, cair sobre, tentando lembrar ... NULL. Sim é isso. NULO. : -)
Além Oracle tomou uma decisão há muitas luas para VARCHARs vazias tratar como nulos e ainda assombra-los (ou seria se eu não era o único que se recusou a usá-lo por causa do que problema)
.
Se você quiser que o seu código PHP para funcionar como Oracle (onde espaços em branco se tornam nulos), você vai ter que pré-processar a string, algo como (pseudo-código):
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'" +
")";
e assim por diante para os outros campos que podem ser NULL também. Eu só mostra como fazê-lo para $first_name
.
Isso fará com que sua coluna first_name na demonstração INSERT
para ser NULL
ou o valor de $first_name
cercado por aspas simples.
Tenha em mente todos esses campos devem ser verificados e / ou modificada a ataques de injeção SQL Prevent.
Algumas informações adicionais dos docs aqui:
http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html