2009-05-11 3 views
3

Я пытаюсь выполнить NOT NULL ограничения в таблице клиента, который создается как:MySql 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
$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 protected]' ... 

И из-за NOT NULL ничего не будет вставлено.

5

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

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

Помимо: Oracle было принято решение много лун назад, чтобы рассматривать пустые VARCHARS как значения 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-инъекций.

+0

Как я получить это право ?? Раньше я использовал оракул. Попробовал MYSQL и немного борется. Как передать нулевой валуз из формы? – Arc

+0

Этот пример кода ("'" + $ first_name + "'") для SQL-инъекций. Вам нужно избежать кавычек и обратных косых черт в $ first_name (для MySQL используйте addlashes ($ first_names), если только волшебные кавычки уже не сделали этого). – pts

+0

@pts, код, поскольку он имел эту уязвимость и, да, должен быть исправлен, но это был не тот вопрос, о котором идет речь. – paxdiablo

 Смежные вопросы

  • Нет связанных вопросов^_^