3

我正在尝试在创建为的客户表中实现 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 似乎会插入它们?可能是什么问题?

4

3 回答 3

5

我怀疑这是因为,在真正的 DBMS 中,与 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.

这将导致INSERT语句中的 first_name 列是由单引号括起来NULL的值或值。$first_name

请记住,应检查和/或修改所有这些字段以防止 SQL 注入攻击。

于 2009-05-11T06:46:08.350 回答
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@a.ddr' ...

并且由于 NOT NULL 不会插入任何内容。

于 2009-05-11T06:56:49.800 回答
0

此处文档中的一些附加信息:

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

于 2009-05-12T07:00:00.283 回答