-1

当我提交带有空复选框的表单时收到通知,但我不知道如何摆脱它们。

这是我的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/>

编辑 错误消息是:注意:未定义索引:第 49 行 C:\xampp\htdocs\srsurvey\connect.php 中的 Q2_1

注意:未定义索引:第 52 行 C:\xampp\htdocs\srsurvey\connect.php 中的 Q2_4

注意:未定义索引:第 53 行 C:\xampp\htdocs\srsurvey\connect.php 中的 Q2_5

注意:未定义索引:第 54 行 C:\xampp\htdocs\srsurvey\connect.php 中的 Q2_6

当复选框为空时

4

4 回答 4

1

未选中的复选框不会与 $_POST 数据一起提交,因此它们不存在于您的数组中。您可以通过以下测试检查是否选中了任何给定的复选框isset()

$myVar = isset($_POST('myCheckbox')); // 如果选中则为真,否则为假

可以像这样设置插入数据库:

$Q2_1 = (isset($_POST['Q2_1']))?1:0;   // No need to escape since the data is provided by your code.
于 2013-10-29T21:05:49.570 回答
1

如果未选中复选框,它们将不会作为 post 数组的一部分发送。您可以在一个简单的三元组中使用 isset 来设置这些值:

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

假设如果未检查,您可以通过 0。改变它以满足您的需求。

还要注意 Mike W 的回答。如果完全设置了 post 值,那么看起来您只是使用 1 作为值。他的例子更加简洁,消除了不必要的转义处理的需要。我会说这更合适。

于 2013-10-29T21:06:12.690 回答
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']));

高温高压

于 2013-10-29T21:05:59.557 回答
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 查询,所以如果你想稍后添加或删除一个字段,你只需要编辑一行。

于 2013-10-29T21:07:33.627 回答