2013-10-29 171 views
-1

我收到通知時提交了一個帶有空複選框的表單,但我不知道如何擺脫它們。注意:未定義索引(mysqli/php)

這是我的PHP:

if(count($_POST) > 0) { 
    $Q1 = $db->real_escape_string(trim($_POST['Q1'])); 
    $Q2_1 = $db->real_escape_string(trim($_POST['Q2_1'])); 
    $Q2_2 = $db->real_escape_string(trim($_POST['Q2_2'])); 
    $Q2_3 = $db->real_escape_string(trim($_POST['Q2_3'])); 
    $Q2_4 = $db->real_escape_string(trim($_POST['Q2_4'])); 
    $Q2_5 = $db->real_escape_string(trim($_POST['Q2_5'])); 
    $Q2_6 = $db->real_escape_string(trim($_POST['Q2_6'])); 
    $Q3 = $db->real_escape_string(trim($_POST['Q3'])); 

    if($insert = $db->query(" 
     INSERT INTO response (Q1, Q2_1, Q2_2, Q2_3, Q2_4, Q2_5, Q2_6, Q3) 
     VALUES ('$Q1', '$Q2_1', '$Q2_2', '$Q2_3', '$Q2_4', '$Q2_5', '$Q2_6', '$Q3'); 
    ")) { 
     echo $db->affected_rows; 
    } 
} 

,這裏是我的html:

<input type='checkbox' name="Q2_1" value="1">Not related to my issue<br/> 
<input type='checkbox' name="Q2_2" value="1">Too complicated explanations<br/> 
<input type='checkbox' name="Q2_3" value="1">Too much information<br/> 
<input type='checkbox' name="Q2_4" value="1">Incorrect information<br/> 
<input type='checkbox' name="Q2_5" value="1">Unclear information<br/> 
<input type='checkbox' name="Q2_6" value="1">Incomplete information<br/> 

編輯 的錯誤信息是: 注意:未定義指數:Q2_1在C:\ XAMPP \ htdocs \ srsurvey \ connect.php 49行

注意:未定義索引:Q2_4在C:\ xampp \ htdocs \ srsurve上行y \ connect.php 52

說明:未定義指數:Q2_5在C:\ XAMPP \ htdocs中\ srsurvey \ connect.php上線53

說明:未定義指數:Q2_6在C:\ XAMPP \ htdocs目錄\ srsurvey \ connect.php上線54

當複選框留空

+0

而錯誤信息是? – kero

回答

1

未選中複選框不與$ _ POST提交的數據,所以他們不數組中存在。您可以檢查是否有任何給定的複選框通過測試與isset()檢查:

$ myVar = isset($ _ POST('myCheckbox')); // true,如果選中,否則爲false

設置插入到數據庫可以做這樣的:

$Q2_1 = (isset($_POST['Q2_1']))?1:0; // No need to escape since the data is provided by your code. 
+0

謝謝,這正是我所需要的。 – Alex

0

複選框不要被瀏覽器,如果他們選中提交,所以$_POST['Q2_1']沒有定義如果該複選框已被清除。

爲了擺脫該通知的任何檢查指標定義,像

$Q1 = $db->real_escape_string(array_key_exists('Q2_1', $_POST) ? trim($_POST['Q2_1']) : false); 

或簡單地通過增加@抑制通知:

$Q1 = $db->real_escape_string(trim(@$_POST['Q2_1'])); 

HTH

+1

抑制成本很高,而且通常很髒。雖然這會消除錯誤信息,但是最好不要在第一時間產生錯誤 –

+0

「代價高昂」 - 我從來沒有對此問題進行過分析,您是否有任何數字?至於「壓制錯誤」 - 這只是一個通知;-) – ErnestV

+2

@KaiQing你說得對,我做了一個快速的性能測試,比較了壓縮,isset和arraykey_exists,每次檢查100k個隨機索引:壓縮0.81sec,array_key_exists 0.21sec,isset 0.14sec。可靠和可重複的測量。感謝您的輸入! – ErnestV

1

複選框如果它們沒有被檢查,它們將不會作爲後期數組的一部分發送。您可以在簡單的三元組中使用isset來設置這些值:

$Q2_1 = isset($_POST['Q2_1']) ? $db->real_escape_string(trim($_POST['Q2_1'])) : 0; 

假設您沒有檢查就傳遞0即可。改變這個以適應你的需求。

另請注意Mike W的回答。如果後期值設置完畢,它看起來像你只是使用1作爲值。他的例子更加簡潔,並且消除了對不必要的轉義處理的需要。我會說這更合適。

0

問題是,當複選框沒有被點擊時,它們不會發送POST數據,因此您需要檢查索引是否已定義。由於每個複選框的任務總是相同,所以您可以輕鬆自動執行該任務。

$fields = array('Q2_1','Q2_6'); // all values 
$query_fields = ""; 
$query_values = ""; 
foreach ($fields as $index) { 
    $query_fields .= $index.","; 
    if (isSet($_POST[$index])) 
     $query_values .= "'1',"; 
    else 
     $query_values .= "'0',"; 
} 
$query = "INSERT INTO table " . rtrim($query_fields,",") . " VALUES (" . rtrim($query_values,",") . ")"; 

這樣,你的代碼更加靈活,因爲你可以改變陣列$fields,它會產生一個有效的SQL查詢,所以如果你想添加或更高版本刪除字段,你只需要編輯一個線。