2013-03-19 3 views
1

나는 $_POST을 사용하여 값을 얻은 다음 DB에 삽입하는 PHP 코드를 가지고 있습니다. 모든 필드는 기본 키를 나타 내기 때문에 CU00 등을 제외하고 입력 기반입니다.NOT NULL 값에 대한 SELECT 문이 NULL 값을 반환합니다.

$ sql="INSERT INTO weekly 
VALUES 
('$_POST[uactual]','$_POST[utarget]','CU001','$a1','$_POST[ucomment]',NOW()) 
,('$_POST[uactual2]','$_POST[utarget2]','CU002','$a2','$_POST[ucomment2]',NOW()) 
,('$_POST[uactual3]','$_POST[utarget3]','CU003','$a3','$_POST[ucomment3]',NOW()) 
,('$_POST[dactual]','$_POST[dtarget]','CD001','$b1','$_POST[dcomment]',NOW()) 
,('$_POST[dactual2]','$_POST[dtarget2]','CD002','$b2','$_POST[dcomment2]',NOW()) 
,('$_POST[dactual3]','$_POST[dtarget3]','CD003','$b3','$_POST[dcomment3]',NOW()) 
,('$_POST[iactual]','$_POST[itarget]','CI001','$c1','$_POST[icomment]',NOW()) 
,('$_POST[iactual2]','$_POST[itarget2]','CI002','$c2','$_POST[icomment2]',NOW()) 
,('$_POST[iactual3]','$_POST[itarget3]','CI003','$c3','$_POST[icomment3]',NOW()) 
,('$_POST[ractual]','$_POST[rtarget]','CR001','$d1','$_POST[rcomment]',NOW()) 
,('$_POST[ractual2]','$_POST[rtarget2]','CR002','$d2','$_POST[rcomment2]',NOW()) 
,('$_POST[ractual3]','$_POST[rtarget3]','CR003','$d3','$_POST[rcomment3]',NOW())"; 

SQL 표 I 신호 만 행이 선택 어디에 선택을 할

ACTUAL|TARGET|KEY |SIGNAL |TIME 
NULL NULL CU001 NULL 00:00 
NULL NULL CU002 NULL 00:00 
NULL NULL CU003 NULL 00:00 
NULL NULL CU004 NULL 00:00 
100  200 CU005 300 00:00 

:

지금 가정 해 사용자는 한 행에 들어갑니다. 하지만 내가 할 때 :

SELECT * 
    FROM TABLE 
    WHERE 
    'signal' IS NOT NULL 

나는 모든 행을 반환합니다. 마치 테이블에 NULL 값이없는 것과 같습니다.

+0

사용법 ... 훌륭하게 지금 작동합니다. –

답변

0

DB에 빈 문자열을 넣고 있습니다.

는이 작업을 수행 : 모든 $_POST 변수의

(empty($_POST['uactual']) ? 'NULL' : '\'' . $_POST['uactual'] . '\'') 

합니다. 그런 다음 NULL 값이 있는지 확인할 수 있습니다.

제발하지 말아요 : $_POST[uactual]! PHP는 먼저 정의 된 val을 검색합니다! $_POST['uactual'] '항상 사용하십시오!

또한 선택이 잘못되었습니다. 아니야. 이것은 올바른

SELECT 'signal' FROM TABLE 

: 당신이 그런 질문을 믿지 않는 경우에

SELECT `signal` FROM TABLE or 
SELECT signal FROM TABLE 

이것은 문자열 '신호'가 아닌`signal` 열을 반환합니다.

WHERE 
    'signal' IS NOT NULL 

이것은 항상 true입니다! 이것이 왜 전체 데이터를 반환하는지. 당신은 다음 2 실수를했다 :] 삽입 및 데이터를 선택합니다.

+0

나는이 befor inseret bcos 신호 칼럼이지만 일한 적 없어, 지금 SQL을 변경해야합니까? –

+0

어디서든 상관 없습니다. 삽입 문자열에는 NULL (''없음) 또는 'somestring'('') 또는 888 (''이어야 함)이 포함되어야합니다. (int) $ x를 수행 할 수도 있습니다. 그런 다음 값이 정수가 될 것입니다 (숫자 문자열이 아닌 경우 0). 나는 둘 다 (int) + empty :] – imclickingmaniac

+0

'empty ($ x)? NULL : (int) $ x' 희망이 도움이됩니다. – imclickingmaniac

3
SELECT * 
    FROM TABLE 
    WHERE 
    signal IS NOT NULL 

'signal'은 참으로 NOT NULL되는 단지 문자열 리터럴입니다. 아마도 '대신'을 의미했을 것입니다.

+0

아니요 int로 가지고 있습니다 –

+0

'신호'주위에 잘못된 유형의 따옴표를 사용하고 있습니다. –

+0

@SaiVignesh 아니요, '신호'는 int가 아니라 문자열입니다. – Andrey

0

NULL을 삽입하지 않습니다. 빈 문자열을 삽입하는 것이 가장 좋습니다.

또한 입력에 대한 유효성 검사를 사용해야합니다.

+0

POST 아래에 댓글을 달 수는 없지만 아래의 답변이 잘못되었습니다. string 주위의 따옴표는 필요하지 않습니다. MySQL은 그것을 문자열이 아니라 열 이름으로 이해합니다. –

+0

문제는 NULL을 삽입하지 않는다는 것입니다. 문자열을 삽입하고 있습니다. 입력 내용의 유효성을 검사하고 빈 문자열을 적절한 경우 NULL로 변환해야합니다. –

+0

oh 데이터를 삽입 할 때 –

관련 문제