【问题标题】:looping through checkboxes in php, unexpected results循环通过php中的复选框,意外结果
【发布时间】:2011-12-30 05:03:11
【问题描述】:

我正在遍历一堆数组类型字段。我有两个复选框,名称分别为“taxable[]”和“ship[]”

我将这些复选框输入到 mysql 中,并注意到我的表单中的所有其他字段都正确提交,除了这些。

如果我有 6 行复选框并且我取消选中第一行。最后一行复选框受到影响。

同样,如果我取消选中前两行,最后两行会受到影响。

我将其分解为下面的简单 php.. 并遍历我的复选框,我看到循环的最后一次迭代是未设置复选框的位置,而不是第一个循环。任何想法这里发生了什么。我还检查了数组的大小,它与每种类型的字段数相匹配。

    echo sizeof($post["prodID"]);

    for($i = 0; $i<sizeof($post["prodID"]); $i++){         

        echo $i.' taxable  '.$post["taxable"][$i].' '.$i.' ship  '.$post["ship"][$i].'  <br />';

         continue;
    }

表单的html:

<? foreach($products as $prod): ?>
                <tr class="<?= $prod["activeText"] ?>">
                    <td><?= $prod["productid"] ?></td>
                    <td><input type="text" name="name[]" value="<?= $prod["itemname"] ?>"/></td>
                    <td><textarea name="description[]"><?= $prod["description"] ?></textarea></td>
                    <td><input type="text" name="cost[]" value="<?= $prod["cost"] ?>"/></td>
                    <td><input type="text" name="price[]" value="<?= $prod["price"] ?>"/></td>
                    <?php $checked = ($prod["taxable"] == 1) ? "checked='checked'" : ""; ?>
                    <td style="padding:0px;"><input style="position:relative; right:-10px;"type="checkbox" name="taxable[]" <?= $checked ?>/></td>
                    <td>   
                        <select name="tax[]">
                            <?php foreach($taxes as $tax){ 
                                $selected = ($prod["inventoryTaxRateID"] == $tax["inventoryTaxRateID"]) ? 'selected="selected"' : '';
                             ?>
                            <option <?= $selected ?> value="<?= $tax["inventoryTaxRateID"] ?>"><?= $tax["name"] ?></option>
                            <?php } ?>
                        </select>
                    </td>
                    <?php $ship = ($prod["ship"] == 1) ? 'checked' : '' ?>
                    <td><input type="checkbox" name="ship[]" <?= $ship ?> /></td>
                    <td><input type="text" name="sandh[]" value="<?= $prod["shipping_handling"] ?>"/></td>

                    <td><?= $prod["activeText"] ?></td>
                    <td>
                        <? if($prod["inactive"] !== null): ?>
                            <input type="button" name="changeStatus" value="<?=  $prod["buttonText"] ?>" onclick="window.location='<?= base_url() ?>management/productManager/activate/<?= $prod["inventoryItemID"] ?>/<?= $prod["activeStatus"] ?>/<?= $category ?>'" />
                        <? endif; ?>
                        <input type="hidden" name="prodID[]" value="<?= $prod["inventoryItemID"] ?>" />
                        <input type="hidden" name="cat[]" value="<?= $prod["cat"] ?>" />
                    </td>
                </tr>
                <? endforeach; ?>

【问题讨论】:

  • 请发布表单的 HTML。
  • 注意:循环末尾的continue; 不需要:)
  • 在我的循环底部有额外的代码,我没有包含在示例中

标签: php arrays loops checkbox


【解决方案1】:

这是因为 PHP 只接收选中的复选框。未选中的复选框不会由浏览器发送。示例

<input type="checkbox" name="ship[]" value="1" />
<input type="checkbox" name="ship[]" value="2" />
<input type="checkbox" name="ship[]" value="3" />
<input type="checkbox" name="ship[]" value="4" />

如果您选择第一个和最后一个复选框,浏览器将只发送第一个和最后一个复选框。 PHP 会将$_POST['ship'] 视为

Array(
    [0] => 1
    [1] => 4
)

【讨论】:

  • 我明白这一点,但即使使用此代码,我也会得到不正确的结果:$post["ship"][$i] = (isset($post["ship"][$i])) ? 1 : 0;
  • $post 是你设置的还是你的意思是$_POST[]
  • 你是对的.. 它循环的值更少,所以设置错误
  • 正如我所说,如果未选中复选框,则永远不会发送,因此,如果您的产品很少带有 ship 复选框并且未选中,您应该为它们假设一些默认值(可能为 0),您应该将&lt;input type="checkbox" name="ship[]" &lt;?= $ship ?&gt; /&gt; 更改为&lt;input type="checkbox" name="ship[]" &lt;?= $ship ?&gt; value="1" /&gt;
【解决方案2】:

您可以为输入名称添加索引,这可能会解决您的问题。

即。

<input type="checkbox" name="ship[0]" value="ship1" />
<input type="checkbox" name="ship[1]" value="ship2" />
<input type="checkbox" name="ship[2]" value="ship3" />
<input type="checkbox" name="ship[3]" value="ship4" />

如果您随后选择船 1 和船 3,$_POST['ship'][0] 和 $_POST['ship'][2] 将被设置,而其他将不会在 $_POST 数组中,因为他们没有与表单一起提交。

然后您可以使用 array_keys($_POST['ship']) 进行迭代

即。

if(is_array($_POST['ship']))
{
    foreach(array_keys($_POST['ship']) as $index)
    {
        echo $_POST['ship'][$index]."<br />";
    }
}

应该回显所有选定的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多