MySQL Not Null 제약 조건은 작동하지 않습니다
-
21-08-2019 - |
문제
나는 다음과 같이 만든 고객 테이블에서 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이 삽입되는 것 같습니다. 가능한 문제는 무엇입니까 ??
해결책
$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' ...
그리고 널 있지 않기 때문에 아무것도 삽입되지 않습니다.
다른 팁
실제 DBMS에서는 Oracle과는 반대로 빈 값과 널 값 사이에 차이가 있기 때문입니다.
블랭크 스트링은 완벽하게 유효합니다 NOT NULL
필드. 당신이 넣을 수없는 유일한 가치 NOT NULL
필드는, 매달리고, 기억하려고 노력하고 있습니다. 맞어 그거야. 없는. :-)
외로 : 오라클은 빈 바르 차를 널로 취급하기로 결정한 많은 달을 결정했지만 여전히 그들을 괴롭 히고 있습니다 (또는 그 문제로 인해 사용을 거부 한 유일한 사람이 아니라면).
PHP 코드가 Oracle (빈 공백이 널이되는 곳)처럼 작동하기를 원한다면 (pseudo-code)와 같은 문자열을 사전 프로세스해야합니다.
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
.
그것은 당신의 첫 _name 열에서 INSERT
어떤 진술도 NULL
또는의 가치 $first_name
단일 따옴표로 둘러싸여 있습니다.
SQL 주입 공격을 방지하기 위해 이러한 모든 필드를 점검 및/또는 수정해야합니다.
문서의 몇 가지 추가 정보는 다음과 같습니다.
http://dev.mysql.com/doc/refman/55.0/en/problems-with-null.html