2011-11-01 101 views
6

我要插入一个NULL值到含有具有以下属性的电话区号表列:如何插入一个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

+1

请改善您的implode(“,”,$ string)功能。 –

+0

哎唷!除非这些信息从未发布到互联网上,否则您应该阅读SQL注入漏洞。关于主题:将NULL设置为一个字符串(当执行查询时它将是一个常规的NULL):'$ _POST ['area_code'] ='NULL';' – jensgram

+0

related:http:// stackoverflow。 com/questions/3700239/mysql-update-statement-for-decimal-fields-to-null-or-emptiness –

回答

5

你的语句需要看起来像

UPDATE ... SET area_code = NULL ... 

如果你铸造PHP null为一个字符串,你做,它只会投射到"",即一个空字符串。您需要将值更改为"NULL"(字符串“NULL”)而不是NULL(类型null)。在将它们插入SQL查询之前,您还应该认真地转义/清理/验证您的值,并且您已经开放了SQL注入。

+0

+1也提到SQL注入风险。 – Jacco

+0

是的,我明白你的观点。和阿兰提到的一样。我确实应用了一个'mysqli_real_escape_string'来清理我的'POST'。没有在这里展示一切。 :) –

2

变化PHP NULL到MySQL NULL(字符串):

if($_POST['area_code'] == '') $_POST['area_code'] = 'NULL'; 
+0

不,它没有工作。仍然'0' –

3

http://php.net/manual/en/language.types.string.php

NULL将被转换为空字符串。

当你建立$string[],你不能只是串连你$value,或者你的空值将被转换为空字符串,其转换回零。您必须执行如下测试:

$value == '' ? 'NULL' : $value 
+0

我不想让所有空字符串作为NULL值。但我看到你的观点,为什么它不起作用。谢谢。 –

2

NULL始终转换为空字符串。

尝试

if($_POST['area_code'] == "") $_POST['area_code'] = "NULL"; 

因为null不是一个字符串

1

试试这样说:

if($_POST['area_code'] == "") $_POST['area_code'] = "NULL"; 
1

那是因为你投你的NULL到字符串:

$field."=".$value 

你有两种选择:

  1. 代码为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) . "'"; 
    } 
    
  2. 切换到支持预处理语句库(恕我直言,最简单,最可靠的解决方案):

    $string[] = $field . '=?'; 
    $params[] = $value; 
    
1

对于初学者来说,你应该逃避这些公布值(也许你已经是) 。其次,PHP中的NULL始终转换为空字符串(http://php.net/manual/en/language.types.string.php)。相反,使用:

$_POST['area_code'] = 'NULL'; 

然后将正确地创建字符串:

area_code=NULL 

UPDATE声明。

1

如果您的数据库表列数据类型定义为int/float/numeric,则它将使用0而不是NULL。因为你正在做的是,使它作为字符串,不符合int/float列定义。