复选框仅将特定行发送到php表单解析器

时间:2013-06-05 14:47:37

标签: php html forms

我正在尝试使用带有php的表单。

我从数据库填充表单信息。

表单输入分为几行。

表单提供了一个复选框,只传递该行数据,应该发生的是当我解析表单解析文档中的数据时,我只得到已检查的行。

然而,正在发生的事情是,checkbox数组的$ _POST方法只返回已检查的内容,但所有其他输入数组仍然包含所有行,甚至是未检查的行。

<?php



while($row = mysql_fetch_assoc($query)){
    $id = $row["id"];
        $email = $row["user_email"];
    $androidId = $row["user_androidid"];
    $amount = $row["amount"];

    echo "<tr>
    <td><input id='data_id' name='data_id[]' size='25'  value='".$id."'/></td>
    <td><input id='mail' name='mail[]'size='25' value='".$email."'/></td>
    <td><input id='androidId' name='androidId[]' size='25' value='".$androidId."'/></td>
    <td><input id='amount' name='amount[]' size='25' value='".$amount."'/></td>
    <td>coming soon...</td>
    <td><input id='currency' name='currencyCode[]' size='25' value='USD'/></td>
    <td><input type='checkbox' name='chosen[]' value='".$id."'<td>
    </tr>";



}
?>

我正在测试它:

for($i=0; $i<count($_POST["chosen"]); $i++){

echo $_POST["chosen"][$i];

}
for($i=0; $i<count($_POST["mail"]); $i++){

echo $_POST["mail"][$i];

}

对于一个特定的例子,我现在有三行,我“检查”第一行和最后一行。

当我解析表单数据时,checkbox数组只返回第一个和最后一个的值,但如果我尝试解析mail [],则它包含第1,2和3行的所有值。

有关如何正确配置此功能的任何想法?我确定结构有问题,只是寻找确认。

3 个答案:

答案 0 :(得分:3)

尝试通过为输入数组提供相同的键来链接输入数组,在本例中为$id -

while($row = mysql_fetch_assoc($query)){
    $id = $row["id"];
        $email = $row["user_email"];
    $androidId = $row["user_androidid"];
    $amount = $row["amount"];

    echo "<tr>
    <td><input id='data_id' name='data_id[".$id."]' size='25'  value='".$id."'/></td>
    <td><input id='mail' name='mail[".$id."]'size='25' value='".$email."'/></td>
    <td><input id='androidId' name='androidId[".$id."]' size='25' value='".$androidId."'/></td>
    <td><input id='amount' name='amount[".$id."]' size='25' value='".$amount."'/></td>
    <td>coming soon...</td>
    <td><input id='currency' name='currencyCode[".$id."]' size='25' value='USD'/></td>
    <td><input type='checkbox' name='chosen[".$id."]' value='".$id."'/><td>
    </tr>"; 
}

然后在帖子上你只能得到被检查的数组 -

foreach($_POST["chosen"] as $key=>$value){
     echo $_POST["data_id"][$key];
     echo $_POST["mail"][$key];
     echo $_POST["androidId"][$key];
     echo $_POST["amount"][$key];
     echo $_POST["currencyCode"][$key];
     echo $_POST["chosen"][$key];
}

答案 1 :(得分:1)

也许这是一个更好的结构,这样你将拥有一个id为键的值数组,以及一个包含所选键的选定值数组。检查您有<td><input type='checkbox' name='chosen[]' value='".$id."'<td>

的html错误
echo "<tr>
<td><input id='data_id' name='".$id."[data_id]' size='25'  value='".$id."'/></td>
<td><input id='mail' name='".$id."[mail]' size='25' value='".$email."'/></td>
<td><input id='androidId' name='".$id."[androidId]' size='25' value='".$androidId."'/></td>
<td><input id='amount' name='".$id."[amount]' size='25' value='".$amount."'/></td>
<td>coming soon...</td>
<td><input id='currency' name='".$id."[currency]' size='25' value='USD'/></td>
<td><input type='checkbox' name='chosen[]' value='".$id."'/></td>
</tr>";

现在用于测试的PHP:

if ( !empty($_POST['chosen']) ) {
    foreach ( $_POST['chosen'] as $value ) {
        print_r( $_POST[$value] );
    }
}

答案 2 :(得分:1)

我建议你做一个 var_dump($ _ POST),然后看一下你发送的内容,因为它让我感到惊讶(除非我误解了)你得到的信息(只有那个)选中复选框的行的信息)。对于初学者,如果您未在输入类型中指定“类型”,则默认类型将为“文本”。这意味着您可以编辑该文本框中的任何内容,这样当您点击提交按钮时(无论您是否选中了其中一​​个复选框),每个文本框中的所有值都将转到被发送。

有多种方法可以满足您的需求(仅使用选中的复选框处理属于该行的信息)。

Javascript帮助:

  1. 添加一个名为disable()的函数,只要按下提交按钮,就会调用该函数。此函数负责通过未选中复选框行的值并将文本框设置为“已禁用”,这样它们就不会被发送到服务器。
  2. 这样做的优点是,只会发送与已选中复选框相关的信息,您不必担心在服务器中进行过滤。

    Cosn,如果你不习惯javascript这显然没有帮助。

    PHP服务器端:

    我刚看到肖恩的答案,这是一个很好的答案,如果你想在服务器上进行验证,你可以这样做。只是让我警告你,虽然用户可以编辑你的文本框数据,例如,将其留空或添加他喜欢的内容,当他发送它并你尝试通过$ _POST [input_name] [$ key]访问它时不会得到你从服务器建立的东西。