MySql NOT NULL Ограничение не работает - PullRequest
3 голосов
/ 11 мая 2009

Я пытаюсь реализовать ограничение NOT NULL в таблице клиентов, которая создается как:

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, кажется, вставляет их? В чем может быть возможная проблема ??

Ответы [ 3 ]

5 голосов
/ 11 мая 2009

Я подозреваю, что это потому, что в реальной СУБД, в отличие от Oracle :-), существует различие между пустым значением и значением NULL.

Пустые строки идеально подходят для полей NOT NULL. Единственное значение, которое вы не можете указать в поле NOT NULL, это зависать, пытаясь вспомнить, ... NULL. Да это оно. НОЛЬ. : -)

В сторону: Oracle много лет назад приняла решение рассматривать пустые VARCHAR как NULL, и это все еще преследует их (или было бы, если бы я был не единственным, кто отказался использовать его из-за этой проблемы).

Если вы хотите, чтобы ваш PHP-код работал как Oracle (где пробелы становятся NULL), вам придется предварительно обработать строку, что-то вроде (псевдокод):

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'" +
    ")";

и т. Д. Для других полей, которые также могут иметь значение NULL. Я только показал, как это сделать для $first_name.

Это приведет к тому, что ваш столбец first_name в операторе INSERT будет либо NULL, либо значением $first_name, заключенным в одинарные кавычки.

Имейте в виду, что все эти поля должны быть проверены и / или изменены для предотвращения атак с использованием SQL-инъекций.

3 голосов
/ 11 мая 2009
$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 ничего не будет вставлено.

0 голосов
/ 12 мая 2009

Некоторая дополнительная информация из документации здесь:

http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html

...