2009-08-30 17 views
3

我無法獲取表單來更新從複選框傳遞的信息。我被給了這個代碼。

$one = isset($_POST['one']) ? 'on' : 'off'; 

只要我分別調用每個複選框,這很有效。我的問題是我總共有大約200個複選框。

以下是我用於UPDATE的代碼。任何人都可以幫助我找出將我的代碼插入到現在的代碼中的位置嗎?我嘗試了各種各樣的變化。

if($_POST['submit']){ 
    if(!empty($applicant_id)){ 
     $sql = "UPDATE play SET "; 
     foreach($_POST as $key => $value){ 
       if(($key != 'submit') && ($key != 'applicant_id')){ 
        $sql .= $key. " = '$value',"; 
       } 
     } 
     $sql = substr($sql, 0, -1); 
     $sql .= " WHERE ".$applicant_id." = $applicant_id"; 
     $result = mysql_query($sql,$db) or die(mysql_error(). "<br />SQL: $sql"); 
    } 
} 
+1

所以您在數據庫中有200列的表? O_O – strager 2009-08-30 23:06:30

+1

此代碼也只是尖叫SQL注入,... – strager 2009-08-30 23:13:53

回答

0
if($_POST['submit']){ 
    if(!empty($applicant_id)){ 
      $sql = "UPDATE play SET "; 
      foreach($_POST as $key => $value){ 
       if(($key != 'submit') && ($key != 'applicant_id')){ 
        $sql .= $key . " = '" . ($value ? 'on' : 'off') . "',"; 
       } 
      } 
      $sql = substr($sql, 0, -1); 
      $sql .= " WHERE ".$applicant_id." = $applicant_id"; 
      $result = mysql_query($sql,$db) or die(mysql_error(). "<br />SQL: $sql"); 
    } 
} 

上述假設所有你輸入的複選框。如果他們不是,你需要制定一個約定來區分它們。

順便說一下,您當前運行的UPDATE代碼易受到SQL injection的影響,因爲您沒有用mysql_real_escape_string()消毒輸入。乾杯。

+0

所以該表有200列與某種CHAR數據類型? – 2009-08-30 23:16:32

+0

顯然。我現在太累了,無法判斷。 – chaos 2009-08-30 23:21:08

5

解決的辦法是從您已知的array()或類似的複選框列表開始。我可以假設你用這樣的列表生成表單嗎?如果沒有,你可能應該。然後,您可以對相同的數據使用循環來檢查每個複選框的存在。

其他一些提示:

isset($array[$key])不推薦。雖然它大部分時間都很可靠,但如果$array[$key]null,它將會失敗。正確的電話是array_key_exists($key, $array)

當裝配字符串片段爲SQL,像你這樣做,這是更優雅做到以下幾點:

$sqlvalues = array(); 
foreach($options as $field) { 
    if(array_key_exists('checkbox_'.$field, $_POST)) 
     $sqlvalues[] = $field.' = \'on\''; 
    else 
     $sqlvalues[] = $field.' = \'off\''; 
} 
mysql_query('UPDATE '.$table.' SET '.implode(', ', $sqlvalues).' WHERE applicant_id = '.$applicant_id); 
+0

我一直在使用isset($ array [$ key])。我從來不知道它$ array [$ key] === null時返回false! – strager 2009-08-31 00:44:48

+0

如果變量存在但它實際記錄爲NULL,它也返回false。 – staticsan 2009-08-31 06:02:51

1

您可能正在運行到HTML複選框行爲:複選框只發送到服務器,如果他們在;如果它們關閉,則不會發送名稱/值對。使用上面的代碼關閉值將會遇到問題。

因此,您需要運行您已知的值列表並在$ _POST參數中檢查它們。

0

刪除所有上述:-) 名稱所有你喜歡的複選框,並 在$ _ POST [「出來」] BUT的foreach的工作!不要忘記黃金法則:不要相信用戶。在寫入數據庫之前,重新檢查每個key =>的值。

1

您應該使用數組名稱,它將是PHP中的數組。

正如ndp所說,如果一個複選框未被選中,它的值將不會被傳輸。因此,您需要在複選框輸入字段之前使用具有相同名稱的隱藏輸入字段,並使用「off」值。

<label for="one">One</label> 
<input type="hidden" name="checkboxes[one]" value="off"/> 
<input type="checkbox" name="checkboxes[one]" id="one" value="on"/> 

記得checked =「checked」,如果它應該默認爲on。

現在,您可以用循環POST或GET複選框

foreach ($_POST['checkboxes'] as $key => $value) { 
    //something 
}