2011-11-01 106 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列定義。