Php 将空值传递给mysql数据库

Php 将空值传递给mysql数据库,php,mysql,null,Php,Mysql,Null,用户填写表单,如果他们选择不填写不需要的字段,php会执行以下操作: if($_SESSION['numofchildren']=="") $_SESSION['numofchildren']=null; 但是当我在mysql查询中使用session变量时,结果不是null,而是0。该列是一个允许NULL的tinyint(4) 为什么我得到的是0而不是NULL?请查看插入到哪个表中的表定义。该字段的“默认”值可能设置为零 您正在使用的MySql版本对于确定MySq

用户填写表单,如果他们选择不填写不需要的字段,php会执行以下操作:

      if($_SESSION['numofchildren']=="")
         $_SESSION['numofchildren']=null;
但是当我在mysql查询中使用session变量时,结果不是null,而是0。该列是一个允许NULL的tinyint(4)


为什么我得到的是0而不是NULL?

请查看插入到哪个表中的表定义。该字段的“默认”值可能设置为零

您正在使用的MySql版本对于确定MySql的处理方式非常重要

上面的链接说:

对于数字类型,默认值为0, 除了整数或 使用声明的浮点类型 自动增量属性,默认值 是序列中的下一个值


可能是因为PHP没有将“null”转换为“null”。您可能只是插入了一个空值

INSERT INTO TABLE (`Field`) ('')
您可能将列的默认值设置为“0”,这意味着除非您指定数字或
NULL

INSERT INTO TABLE ('Field') (NULL)
要解决此问题,请在执行查询之前检查空值

foreach($values as $key => $value)
{
     if($value == null)
     {
         $values[$key] = "NULL";
     }
}
我有一种感觉,准备好的声明将有远见地自动完成这项工作。但是,如果您使用内联语句,则需要添加更多内容

MySQL值周围必须有引号,但空值不能。因此,您需要引用使用此

foreach($values as $key => $value)
{
     if($value == null)
     {
         $values[$key] = "NULL";
     }
     else
     {
         // Real Escape for Good Measure
         $values[$key] = "'" . mysql_real_escape_string($value) . "'";
     }
}
然后,在创建语句时,确保不要在任何值周围加引号

$SQL = "INSERT INTO TABLE (Field) VALUES(".$values['field'].")";
变成

$SQL = "INSERT INTO TABLE (Field) VALUES("Test Value")";


null
解析为字符串的值变为0。尝试使用()首先检查该值,并在查询中放置
NULL
,而不是0

foreach($values as $key => $value)
{
     if($value == null)
     {
         $values[$key] = "NULL";
     }
}

或者,尝试使用and来实现一个完美且黑客安全的查询。

你们可能都是对的,但我所要做的就是在null周围加引号

  if($_SESSION['numofchildren']=="")
    $_SESSION['numofchildren']='NULL';

几分钟前我也有同样的问题,但后来我发现了。在我的例子中,我使用引号之间的
NULL
变量进行查询,如
“,”
。。。 这就是您想要做的:

INSERT INTO `tbl_name` (`col1`, `col2`) VALUES (NULL,"some_value");
因此,如果要使用
NULL
变量,它应该是
“NULL”
,如下所示:

$var1="NULL"; $var2="some_value";
现在,如果要使用
$var2
,您将在查询中键入
'$var2'
,但不应对
$var1
执行相同操作:

INSERT INTO `tbl_name` (`col1`, `col2`) VALUES ($var1,'$var2');

若你们把
$var1
放在引号之间,你们会得到一个
0
而不是
NULL

对于我来说,在数据库中放NULL var不起作用,我使用了var char(2)

所以我只做了2个查询。这样它将100%工作。对于您的示例,它将是:

if($_SESSION['numofchildren']=="")
{
$updatequery="
            UPDATE table 
            SET table1='$value', table2='$value2', numofchilrdrentable=(NULL)
            ";
}
else
{
$updatequery="
            UPDATE table 
            SET table1='$value', table2='$value2', numofchilrdrentable='$_SESSION[numofchildren]'
            ";

}
$updatequeryresult=mysql_query($updatequery) or die("query fout " . mysql_error() );    

编辑:var char->var char(2)

这非常令人困惑,尤其是当值从web表单发布时。我这样做:

我们假设您需要一个名为“numochildren”的数据库字段,该字段将接受可能的值:NULL、0、1、2..等。最大值为99,默认值应为SQL NULL值

SQL字段应定义为:

.. `numofchildren` INT( 2 ) NULL DEFAULT NULL
当您为空值插入数据时,您会传递类似“NULL”的字符串,并在循环传入数据时查找它们。您刚刚转换为整数的其他值:

    foreach ($data as $v) {
$v['numofchildren'] = !isset($v['numofchildren']) || $v['numofchildren'] === 'NULL' ? '(NULL)' : (int) $v['numofchildren'];
                $q = "INSERT INTO tablename (numofchildren) VALUES ({$v['numofchildren']}) ";
    ...
            }
请注意,SQL查询中的{$v['numochildren']}没有用单引号括起来,因为您不传递字符串,而是传递整数(0,1,2..)或SQL NULL


我相信它很清楚,很短,涵盖了这个问题。

如果您想为数据库中的任何列设置NULL 一开始 您应该检查该列的
是否为null

secuond:如果需要变量 若设置为空代码,则必须在双引号中插入“空”,然后提交到数据库

如果将null设置为双引号(“”)nothing,则不会发送任何内容,数据库将收到错误 例如:

function insert_to_db($var){
...
sql="INSERT INTO table VALUES($var)"
...
}
在代码中使用带“”和不带“”时=>


显示您在查询中设置的代码。@Ian McCullough请查看我的编辑。我认为您的列设置为不可为空,MySql正在应用默认值。请阅读该链接。
function insert_to_db(null)// error : INSERT INTO table VALUES()
correct: 
function insert_to_db("null")//its ok