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


85

我有一个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);

Answers:


141

要将NULL传递给MySQL,只需执行此操作。

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

因此,在您的代码中,检查if $intLat, $intLngempty,如果是,请使用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)";

9
这不会添加mysql NULL值。这将属性设置为字符串“ NULL”,该字符串与mysql NULL值不同。我只是说您写了两种不同的东西,第一是正确的,第二是我想的不多。
G4bri3l 2014年

22
@ G4bri3l:在$query字符串中,$intLat并且$intLng不加引号。因此,对变量进行插值时将为, NULL, NULL);
火箭Hazmat

2
哦,是的,我现在明白了。真好!感谢您抽出
宝贵

@ G4bri3l:没有问题。我在这里为您提供帮助:)
Rocket Hazmat

2
@alessadro:这个问题很老了。如果将变量连接到这样的SQL查询中,那么您做错了!请切换到在PDO或MySQLi中使用准备好的语句。
火箭Hazmat

17

如果不传递值,则默认值将为null。

但是,您可以只传递NULL而不带引号。


8
如果以这种方式设置表,则默认情况下,他只会获得NULL。
火箭Hazmat

2
对我来说,这就是“可选”的意思。
dkretz 2011年



4

通常,您可以通过以下方式从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
}

当您的值是空/空($ val1 ==“”或$ val1 == NULL),并且您希望将NULL添加到SQL而不是0或空字符串时,请添加到以下内容:

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插入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是可选的。
火箭Hazmat

这是行不通的。此代码段有很多错误(除了使用错误的变量外,如Rocket所指出)。由于三元运算符的优先级,您需要在表达式两边加上括号。但至关重要的是,您仍将列值括在单引号中,因此您将回到平方,分配一个字符串,而不是一个数据库NULL。另外,您使用的是PHPs NULL(未引号)关键字,该关键字在字符串上下文中计算为空字符串,因此,再次要分配一个空字符串
MrWhite

1

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


1

你可以用例如

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

1

由于某些原因,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."'")) . 
    ")";

空白导致将正确的空值(未加引号)插入查询中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.