2013-10-29 122 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查询,所以如果你想添加或更高版本删除字段,你只需要编辑一个线。