2011-09-18 76 views
0

我有一個插入語句,可以將從表單POST中收集的變量插入前一頁。如果表單中的變量沒有被填充,它會在插入時失敗(大概是因爲它插入了一個空字符串......)我將dataype設置爲允許NULL值 - 如果字段爲空,我如何插入空值表單POST?PHP MYSQL - 插入空變量失敗

$query = " 
INSERT INTO songs (
    userid, 
    wavURL, 
    mp3URL, 
    genre, 
    songTitle, 
    BPM 
) VALUES (
    '$userid', 
    '$wavFile', 
    '$mp3File', 
    '$genre', 
    '$songTitle', 
    '$BPM' 
) 
"; 

$result = mysql_query($query); 
+0

你能告訴我們一些代碼嗎?和一些PHP代碼(其中$ userid創建或$ wavFile分配)? –

+0

好的,添加了代碼。 – user547794

+1

'$ songTitle =(empty($ songTitle)|| null === $ songTitle)? 「NULL」:$ songTitle;' – tttony

回答

1

確切的方式取決於您是否將查詢或綁定參數寫入預準備語句。

如果寫自己的,它會是這個樣子:

$value = empty($_POST['bar']) ? null : $_POST['bar']; 
$sql = sprintf('INSERT INTO foo (bar) VALUES (%s)', 
      $value === null ? 'NULL', "'".mysql_real_escape_string($value)."'"); 

$result = mysql_query($sql); 

主要的一點是,你需要的字符串NULL(不帶引號)的傳遞,如果該值應爲null和字符串'val'如果值應該是「val」。請注意,由於我們正在使用PHP編寫字符串文本,因此在這兩種情況下,源代碼中都會有一對引號(這會在第一種情況下產生一對,在第二種情況下會產生兩對)。

警告:當直接從請求變量插入到數據庫時,SQL注入攻擊很容易被打開。不要成爲另一個受害者; read about how to protect yourself並實施其中一種普遍接受的解決方案。

0

對於我明白當事情不填充後的變量沒有被設置爲空值,而是根本沒有設置這樣在PHP你比如做:

$genre = isset($_POST['genre']) ? $_POST['genre'] : NULL; 
+0

我認爲這不是真的。如果用戶沒有填寫輸入,該變量仍然被髮布,但只是一個空字符串。 PHP函數empty()在這裏工作,但isset()會返回true,因爲變量已設置,即使沒有ant字符串值。 – nageeb

+0

你說得對,我只是做了一個小測試,我說的是$ _GET,$ _POST var_dump顯示一個長度爲0的空字符串。 – derp

0

這裏是我該怎麼辦它。我不喜歡從POST發送任何東西到SQL查詢(總是消毒!)在下面的cas中,您只需逐個運行POST變量,並將它們分配給輔助數組,同時檢查0長度字符串並將它們設置爲空值。

foreach ($_POST as $key => $value) { 
    strlen($value)=0 ? $vars[$key] = NULL : $vars[$key] = $value 
} 

然後,您可以從新創建的$ vars []數組構建您的SQL查詢。

正如喬恩上面所述,這將是在數據被插入到數據庫之前轉義字符串,剝離代碼並基本完成所有服務器端驗證的地方。