2009-04-14 71 views
3

提交帶未選中複選框的表單時出現「未定義索引」錯誤。除了對每個單獨發佈的值執行「isset」或「empty」檢查之外,還有其他方法嗎?PHP表單複選框和未定義索引

我看了這Question,我很難相信這是唯一的解決方案。

下面是一些示例代碼: 編輯:請不要說這些不是表列的實際名稱;他們被統一命名(如「地址後的,displayPhone,學生等)

回答

7

你可以寫一個檢查一個複選框是否被選中的功能:

function checkbox_value($name) { 
    return (isset($_POST[$name]) ? 1 : 0); 
} 

現在在您的查詢中調用該功能,如下所示:

$sql = 'UPDATE table SET '. 
     'checkbox1 = '. checkbox_value('checkbox1') .','. 
     'checkbox2 = '. checkbox_value('checkbox2') .','. 
     'checkbox3 = '. checkbox_value('checkbox3') .','. 
     'checkbox4 = '. checkbox_value('checkbox4') .','. 
     'checkbox5 = '. checkbox_value('checkbox5') .','. "LIMIT 1"; 
+0

是啊!我喜歡你思考的方式。謝謝! – superUntitled 2009-04-14 05:18:29

0

嘗試以下

<?php 
//first part of the query 
$query = "UPDATE table SET "; 

$howManyCheckboxes = 5; 
//for every checkbox , see if it exist , if it is, add it to the query 
for($i=1;$i<=$howManyCheckboxes;$i++) 
{ 
    if(isset($_POST['checkbox'.$i])) 
    { 
     $query = $query . " checkbox".$i."='".escape($_POST['checkbox'.$i])."',"; 
    } 
} 
//lets remove the last coma 
$query = substr($query,0,-1); 
//add the rest of the query 
$query = $query . " LIMIT 1"; 

$result = mysql_query($query); 
if(! $result) echo "um, not everything went as expected."; 
?> 
+0

感謝這一點,但複選框名稱並不總是「複選框1」,「複選框2」... – superUntitled 2009-04-14 05:13:01

6

如果您想打開/關閉複選框,您可以在寫入複選框之前編寫一個隱藏值。 (除非複選框被默認選中默認情況下)或者是

<input type="hidden" name="checkbox1" value="no" /> 
<input type="checkbox" name="checkbox1" value="yes" /> 

這將始終返回一個值,要麼沒有。

您可以使用FILTER_VALIDATE_BOOLEAN驗證filter functions的輸入。

它更容易,如果你寫了這樣的功能,如formCheckbox($名),與值的選項(「開」值意味着複選框默認選中),屬性等

+0

這實際上工作嗎?這太瘋狂了...以前從未聽說過。這將取決於瀏覽器,但?我敢肯定,即使它在w3c規範中,所有的瀏覽器都不支持這個功能嗎? – mpen 2009-04-14 05:30:30

+0

這適用於我所知道的所有瀏覽器。瀏覽器按照從頭到尾的順序返回值。在PHP中,只有姓氏纔會變成GET/POST超級全局變量(不帶名稱[]),並且如果未選中複選框,則不會提交。 – OIS 2009-04-14 05:43:41