POST 个带有隐藏元素的未选中复选框

POST unchecked checkboxes with hidden elements

我知道还有其他 post 有同样的问题,但它对我不起作用。 好吧,我有一个数据库 table(图像),其中包含 'img_name' 和 'img_status'。状态可以是 'active' 或 'inactive'。在 php 中,我执行以下操作,将数据库中的图像设置为活动或非活动:

while($row = mysqli_fetch_object($images)) {
    if ($row->img_status == 'active') {
        echo '<input type="hidden" name="image[]" value="' . $row->img_name . '">';
        echo '<label><input type="checkbox" name="image[]" value="' . $row->img_name . '" checked> ' . $row->img_name . '</label>';
    } else {
        echo '<input type="hidden" name="image[]" value="' . $row->img_name . '">';
        echo '<label><input type="checkbox" name="image[]" value="' . $row->img_name . '"> ' . $row->img_name . '</label>';
    }
}

对于处于活动状态的行,复选框处于选中状态,对于非活动状态,则处于未选中状态。 在提交表格时我这样做:

    if(isset($_POST['image']) && is_array($_POST['image'])) {
        foreach($_POST['image'] as $imageName) {
            // here i want update table 
            // unchecked: set image to inactive
            // checked: set image to active
        }
    }

现在我的问题是,当我取消选中一个已选中的(因为在数据库中它是活动的,因此在页面加载时它被选中)并提交表单时,它没有 post。

我建议您创建一个名为 status 的列,并将其设为值为 1 的 tinyint,如果图像状态为 0,则表示它未激活,如果为 1,则表示它处于激活状态,然后您可以使用单选按钮而不是像这样的复选框:

<input type="radio" name="status" value="0"<?php if ($row["status"] == 0) { echo "checked"; } ?> />

<input type="radio" name="status" value="1"<?php if ($row["status"] == 1) { echo "checked"; } ?> />

在你的 while 循环中,你也可以这样做来显示文本而不是数字,并在你想要或需要的地方回显它:

$stat = $row['status'];
    if($stat == 0) {
       $status = "Disabled";
    } else {
        $status = "Active";
    }

尚不清楚为什么需要隐藏字段,但如果您要使用,请给它们一个不同的名称:

while($row = mysqli_fetch_object($images)) {
    echo '<input type="hidden" name="allimage[]" value="' . $row->img_name . '">';
    echo '<label><input type="checkbox" name="image[]" value="' . $row->img_name . '" ' . ($row->img_status == 'active' ? 'checked' : '') . '> ' . $row->img_name . '</label>';
}

然后,当您获得 return 值时,$_POST['allimage'] 拥有所有图像,$_POST['image'] 拥有被检查的图像。那么:

array_intersect($_POST{'allimage'], $_POST['image']);

已检查所有图像,并且

array_diff($_POST{'allimage'], $_POST['image']);

returns 一个包含所有未检查名称的数组。然后,您可以根据需要将它们的状态设置为 "Active" 或 "Disabled"。