MySQL和PHP - 插入NULL而不是空字符串

109

我有一个MySQL语句,可以将一些变量插入到数据库中。最近我添加了两个可选字段($intLat, $intLng)。如果这些值没有被输入,我现在传递一个空字符串作为值。我该如何将显式的NULL值传递给MySQL(如果为空)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng) VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', NULLIF('$intLat',''), NULLIF('$intLng',''))"; - Saghachi
10个回答

169

要将 NULL 传递给 MySQL,只需这样做。

INSERT INTO table (field,field2) VALUES (NULL,3)

因此,在您的代码中,检查$intLat,$intLng是否为空,如果是,则使用NULL代替'$intLat''$intLng'

$intLat = !empty($intLat) ? "'$intLat'" : "NULL";
$intLng = !empty($intLng) ? "'$intLng'" : "NULL";

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  $intLat, $intLng)";

15
这并不是添加了MySQL的NULL值。这是将属性设置为字符串"NULL",这与MySQL的NULL值不同。我只是说你写了两件不同的事情,第一件是正确的,第二件不太对吧。 - G4bri3l
29
$query 字符串中,$intLat$intLng 没有使用引号引用。因此,在变量插值时,它将变成 , NULL, NULL); - gen_Eric
2
哦,是的,我现在明白了。太好了!谢谢你花时间给我指出来;) - G4bri3l
1
@G4bri3l:没问题。我在这里帮你 :) - gen_Eric
3
@alessadro说:“这个问题很旧了。如果你正在将变量连接到SQL查询中,那么你的方法是错误的!请改用PDO或MySQLi中的预处理语句。” - gen_Eric
显示剩余6条评论

27

对我来说这完全没问题:

INSERT INTO table VALUES ('', NULLIF('$date',''))

(首次''会增加id字段)


1
NULLIF函数有两个参数NULLIF(expr1, expr2)。请参阅http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_nullif。 - Roy Hinkley
我认为这更好,因为你可以只用一行代码就完成。 - hiddeneyes02
使用预处理语句并不那么简单。 - MrrMan

18

如果您不传递值,则会得到默认值的空值。

但是您可以仅传递单词NULL而不带引号。


9
如果表格是这样设置的,他将只会得到默认的 NULL 值。 - gen_Eric
2
对我来说,这就是"可选"的意思。 - dkretz

13

您只需要做如下操作:$variable = NULL; //然后将其传递给插入查询。这将在mysql数据库中将该值存储为NULL


不需要在“NULL”周围加引号。 - Louis

5

通常,您可以像这样从PHP将常规值添加到mySQL:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

当您的值为空/为null ($val1=="" 或 $val1==NULL),而您想要添加 NULL 而不是 0 或空字符串到 SQL 中时,请使用以下代码:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

请注意,null必须添加为"NULL"而不是"'NULL'"。非空值必须添加为"'".$val1."'"等。希望这可以帮助您,我刚刚在某些硬件数据记录器中使用了它,其中一些记录温度和辐射,而另一些只记录辐射。对于那些没有温度传感器的记录器,出于明显的原因,我需要NULL而不是0(0也是一个被接受的温度值)。

对于定义为整数的列,另一种解决方案可以正常工作,但对于文本字段,我不得不像上面的radhoo那样将查询分解为字符串连接。$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ("."NULL".", ".$val2.")"; - Brian

2

您的查询可以如下:

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
      VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$lng', '" . ($lat == '')?NULL:$lat . "', '" . ($long == '')?NULL:$long . "')";
mysql_query($query);

2
$intLat和$intLng是可选的。 - gen_Eric
这样是行不通的。除了使用错误的变量(如Rocket所指出的),这段代码片段中有很多问题。由于三元运算符的优先级,您需要在表达式周围加上括号。但是至关重要的是,您仍然将列值括在单引号中,因此您回到了起点,分配了一个字符串,而不是数据库NULL。此外,您正在使用PHP的NULL(未引用)关键字,在字符串上下文中评估为空字符串,因此再次分配了一个_空字符串_。 - MrWhite

2
由于某些原因,radhoo的解决方案对我不起作用。当我使用以下表达式时:
$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')?"NULL":("'".$val1."'")) . ", ".
    (($val2=='')?"NULL":("'".$val2."'")) . 
    ")";

“null”(带引号)被插入而不是没有引号的 null,这使它成为字符串而不是整数。所以最终我尝试了:
$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')? :("'".$val1."'")) . ", ".
    (($val2=='')? :("'".$val2."'")) . 
    ")";

空白导致正确的null(未引用)被插入查询中。

1
在构建查询之前,请检查变量是否为空,如果为空,则将它们更改为字符串NULL。

1
你可以用以下方式完成,例如:
UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

0

2022 | PHP 7.3 | MySQL 5.7

Rocket Hazmat 给出的答案返回一个字符串"NULL"。所以我将其更改为:

$intLat = !empty($intLat) ? "'$intLat'" : NULL;
$intLng = !empty($intLng) ? "'$intLng'" : NULL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接