我想在包含电话区号的表列中插入一个NULL
值,该区号具有以下属性:
mediumint unsigned DEFAULT NULL
在我的PHP脚本中,我进行了以下检查,将空字符串转换为NULL
值:
if($_POST['area_code'] == "") $_POST['area_code'] = NULL;
// clean POST
foreach($_POST as $field => $value)
{
$string[] = $field."=".$value;
}
$sql = "UPDATE Buyer SET ".implode(", ", $string)." WHERE user='$user'";
但是,我得到的是0
而不是NULL
值。如何插入NULL
?
您的语句需要看起来像
UPDATE ... SET area_code = NULL ...
如果像这样将PHP null
强制转换为字符串,那么它只会强制转换为""
,即空字符串。您需要将值更改为"NULL"
(字符串"NULL"(,而不仅仅是NULL
(类型null
(。在将值插入SQL查询之前,您还应该认真地对其进行转义/消毒/验证,因为您对SQL注入非常开放。
来源http://php.net/manual/en/language.types.string.php
NULL总是转换为空字符串
当您构建$string[]
时,您不能只是连接您的$value
,否则您的null将转换为空字符串,这些字符串将转换回零。你必须做一个测试,比如:
$value == '' ? 'NULL' : $value
将PHP NULL更改为MySQL NULL(字符串(:
if($_POST['area_code'] == '') $_POST['area_code'] = 'NULL';
NULL始终转换为空字符串。
尝试
if($_POST['area_code'] == "") $_POST['area_code'] = "NULL";
因为null不是字符串
这样试试:
if($_POST['area_code'] == "") $_POST['area_code'] = "NULL";
对于初学者来说,您应该转义这些发布的值(也许您已经转义了(。其次,PHP中的NULL
总是转换为空字符串(http://php.net/manual/en/language.types.string.php)。相反,使用:
$_POST['area_code'] = 'NULL';
然后将正确创建字符串:
area_code=NULL
用于您的UPDATE
声明。
如果您的数据库表列数据类型定义为int/foat/numeric,则它采用0而不是NULL。因为您正在做的是,将其作为与int/foat列定义不匹配的字符串。
这是因为您将NULL
强制转换为字符串:
$field."=".$value
你有两个选择:
为NULL值编码一个异常:
if( is_null($value) ){ $string[] = $field . '=NULL'; }else{ // Please note I've also added proper string escaping $string[] = $field . "='" . mysql_real_escape_string($value) . "'"; }
切换到支持准备语句的库(IMHO,最简单、最可靠的解决方案(:
$string[] = $field . '=?'; $params[] = $value;