MySQL 和 PHP - 插入 NULL 而不是空字符串
Posted
技术标签:
【中文标题】MySQL 和 PHP - 插入 NULL 而不是空字符串【英文标题】:MySQL and PHP - insert NULL rather than empty string 【发布时间】:2011-06-04 23:00:02 【问题描述】:我有一个 mysql 语句将一些变量插入到数据库中。我最近添加了 2 个可选字段($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);
【问题讨论】:
【参考方案1】:这对我来说很好用:
INSERT INTO table VALUES ('', NULLIF('$date',''))
(第一个 ''
增加 id 字段)
【讨论】:
NULLIF 采用 2 个参数NULLIF(expr1, expr2)
。见dev.mysql.com/doc/refman/5.7/en/…
我认为这样更好,因为你可以在一行中完成
准备好的语句不是那么简单。【参考方案2】:
您所要做的就是:$variable =NULL;
// 并在插入查询中传递它。这会将值作为 NULL 存储在 mysql db 中
【讨论】:
“NULL”周围不需要引号。【参考方案3】:要将 NULL 传递给 MySQL,您只需这样做。
INSERT INTO table (field,field2) VALUES (NULL,3)
因此,在您的代码中,检查 if $intLat, $intLng
是否为 empty
,如果是,请使用 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)";
【讨论】:
这不会添加 mysql NULL 值。这将属性设置为字符串“NULL”,这与 mysql NULL 值不同。我只是说你写了两个不同的东西,第一个是正确的,第二个不是我认为的。 @G4bri3l:在$query
字符串中,$intLat
和$intLng
没有被引用。所以,当变量被插值时,它将是, NULL, NULL);
。
哦,是的,我现在看到了。好的!感谢您花时间向我指出;)
@G4bri3l:没有问题。我是来帮忙的:)
@alessadro:这个问题很老了。如果您将变量连接到这样的 SQL 查询中,那么您做错了!请切换到在 PDO 或 MySQLi 中使用准备好的语句。【参考方案4】:
您的查询可以如下:
$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);
【讨论】:
$intLat 和 $intLng 是可选的。 这行不通。这段代码 sn-p 有很多问题(除了使用错误的变量,正如 Rocket 指出的那样)。由于三元运算符的优先级,您需要在表达式周围加上括号。但至关重要的是,您仍然将列值括在单引号中,因此您返回到第一个方格,分配一个字符串,而不是数据库NULL
。此外,您正在使用 phps NULL
(未加引号)关键字,它在字符串上下文中计算为空字符串,因此,您再次分配了一个 empty string。【参考方案5】:
由于某种原因,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."'")) .
")";
空白导致将正确的空值(未加引号)插入到查询中。
【讨论】:
【参考方案6】:通常,您从 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 添加到 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 INTO uradmonitor (db_value1, db_value2) VALUES ("."NULL".", ".$val2.")";【参考方案7】:你可以这样做,例如
UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'
【讨论】:
【参考方案8】:在构建查询之前检查变量,如果它们为空,则将它们更改为字符串NULL
【讨论】:
【参考方案9】:如果你不传递值,你会得到默认值的空值。
但你可以只传递不带引号的 NULL。
【讨论】:
如果表是这样设置的,他只会得到 NULL 默认值。 对我来说这就是“可选”的意思。 太棒了,它有效以上是关于MySQL 和 PHP - 插入 NULL 而不是空字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL