(PHP)包含带复选框的表的发布表单

时间:2017-02-09 11:19:48

标签: php

假设我有一个表格,包含输入和复选框:

<form method='post' action=''>
    <table>
        <tr>
            <th>Code</th>
            <th>Description</th>
            <th>Select</th>
        </tr>
        <tr>
            <td><input name=table[code][] type='text' value='C001' /></td
            <td><input name=table[description][] type='text' value='Object 1' /></td>
            <td><input name=table[select][] type='checkbox' checked /></td>
        </tr>
        <tr>
            <td><input name=table[code][] type='text' value='C002' /></td
            <td><input name=table[description][] type='text' value='Object 2' /></td>
            <td><input name=table[select][] type='checkbox' /></td>
        </tr>
        <tr>
            <td><input name=table[code][] type='text' value='C003' /></td
            <td><input name=table[description][] type='text' value='Object 3' /></td>
            <td><input name=table[select][] type='checkbox' checked /></td>
        </tr>

    </table>
</form>

该表由PHP填充并由用户扩展(通过jQuery脚本),因此我不知道在发布表单时我将拥有多少行

在$ _POST中我找到这些值(不是PHP代码,只显示$ _POST内容):

$_POST['table']['code'][0] = C001
$_POST['table']['code'][1] = C002
$_POST['table']['code'][2] = C003

$_POST['table']['description'][0] = Object 1
$_POST['table']['description'][1] = Object 2
$_POST['table']['description'][2] = Object 3

$_POST['table']['select'][0] = 1
$_POST['table']['select'][1] = 1

如您所见,“select”字段与“code / description”

之间没有相关性

我的解决方案是添加数组的索引,如下所示:

<td><input name=table[code][1] type='text' value='C001' /></td>
<td><input name=table[description][1] type='text' value='Object 1' /></td>
<td><input name=table[select][1] type='checkbox' checked /></td>

并检查if(isset(&_POST['table']['select'][1]))

但这对我来说并不是一个优雅的解决方案,因为它需要在填充表时对字段进行编号,并在添加新行时更新jQuery中的数字。

有没有更好的解决方案来保持每一行的输入?

2 个答案:

答案 0 :(得分:0)

我认为您的解决方案是最好的,您必须将相关字段组合在一起,并且,如果未检查checkbox元素,则最好的方法是使用唯一ID。< / p>

不过,还有其他解决方案。在我的头顶,有一个,这涉及一点jQuery并且丑陋如f ** k,但应该工作:

<form method='post' action=''>
    <table>
        <tr>
            <th>Code</th>
            <th>Description</th>
            <th>Select</th>
        </tr>
        <tr>
            <td><input name="table[code][]" type='text' value='C001' /></td>
            <td><input name="table[description][]" type='text' value='Object 1' /></td>
            <td>
                <input type="checkbox" checked />
                <input name="table[checkbox][]" value="1" />
            </td>
        </tr>
        <tr>
            <td><input name="table[code][]" type='text' value='C002' /></td>
            <td><input name="table[description][]" type='text' value='Object 2' /></td>
            <td>
                <input type='checkbox' checked />
                <input name="table[checkbox][]" value="0" />
            </td>
        </tr>
        <tr>
            <td><input name="table[code][]" type='text' value='C003' /></td
            <td><input name="table[description][]" type='text' value='Object 3' /></td>
            <td>
                <input type='checkbox' checked />
                <input name="table[checkbox][]" value="1" />
            </td>
        </tr>
    </table>
</form>

<script type="text/javascript">
    $('input[type="checkbox"]').on('change', function() {
        var target = $(this).parent('td').find('input[type="hidden"]');
        if ($(this).is(':checked')) {
            target.val(1);
        } else {
            target.val(0);
        }
    });
</script>

我从您的复选框中删除了name个属性,并添加了同名的hidden个字段。

当复选框的状态发生变化时(从已选中状态变为未选中状态,反之亦然),jQuery位会将相应的hidden输入值设置为1(如果复选框已被取消) )或0

答案 1 :(得分:0)

您的复选框输入中也可能包含值。然后,您可以在提交时根据您的代码进行检查。

我还没有测试过上面的代码,但是我会做点什么。

<td><input name=table[code][] type='text' value='C003' /></td>
<td><input name=table[description][] type='text' value='Object 3' /></td>
<td><input name=table[select] value='C003' type='checkbox' checked /></td>

在你的后端:

$checkedCodes = explode(',', $_POST['table']['select']); //all the values would be separated by ,
for ($i = 0; $i < count($_POST['table']['code']; $i++) {
    $code = $_POST['table']['code'][$i];
    $description = $_POST['table']['description'][$i];
    $checked = in_array($checkedCodes, $code);
}