Вопрос

Я пытаюсь реализовать ограничение 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top