2013-03-19 64 views
1

我有PHP代码,使用$_POST获取值,然后插入到数据库中。除了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表

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

使用isset ...现在奇妙地工作 – 2013-03-22 11:20:36

回答

0

您正在将空字符串放入数据库。

这样做:

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

对于所有$_POST变量。然后你可以确定会有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

<?php(empty($ a1)?'NULL':'\''。$ a1。'\'')?> 我做了这个befor inseret bcos这是信号列但从来没有工作,我应该现在更改SQL吗? – 2013-03-19 23:21:21

+0

无论你在哪里做。您的插入字符串应包含: NULL(不带'')或'somestring'(带有'')或888(不带''如果它应该是数字)。 你也可以做(int)$ x。然后你会确定该值是整数(如果不是数字字符串,则为0)。我会做两个(整数)+空:] – imclickingmaniac 2013-03-19 23:28:34

+0

'空($ x)? NULL:(int)$ x'希望这有助于。 – imclickingmaniac 2013-03-19 23:29:05

3
SELECT * 
    FROM TABLE 
    WHERE 
    signal IS NOT NULL 

'signal'只是字符串文字这的确是NOT NULL。 你可能意思是`而不是'。

+0

不,我把它作为int – 2013-03-19 22:50:26

+0

您使用'signal'周围的错误引号类型 – 2013-03-19 22:50:54

+0

@SaiVignesh否,''signal''是字符串,而不是int。 – Andrey 2013-03-19 22:51:39

0

您没有插入任何NULL。你最好插入空字符串。

此外,你应该使用一些验证你的输入。

+0

我不能在下面的POST中添加注释,但下面的答案是错误的。字符串之间的引号是不需要的,MySQL不会将其理解为字符串,而是将其理解为列名。 – 2013-03-19 22:52:41

+0

问题是您没有插入NULL。您正在插入字符串 - 您需要验证您的输入并在适当的情况下将空字符串转换为NULL。 – 2013-03-19 22:53:06

+0

哦插入数据时如何过滤空字符串然后 – 2013-03-19 22:53:40