【问题标题】:One checked check box only for each row每行只有一个选中的复选框
【发布时间】:2026-02-14 18:45:01
【问题描述】:

我有一个表,其中每行有 3 列:名称、启用、禁用。启用和禁用列有一个复选框,正如名称所述,我试图每行只勾选一个复选框。到目前为止,这些是我的代码(对于每一行和两列):

<?php foreach($customers as $customer):?>
<tr>
    <td align="center"><?php echo $customer;?></td>
    <?php
    $check = FALSE;
    if($user_customer != FALSE)
        foreach($user_customer as $object)
            foreach($object as $current_customer)
                if($current_customer == $customer)
                    $check = TRUE;
    ?>

    <td align='center'>
        <?php
            if($check == FALSE)
                $data = array('name' => 'enable[]', 'value' => $customer, 'checked' => FALSE);
            else
                $data = array('name' => 'enable[]', 'value' => $customer,  'checked' => TRUE);

            echo form_checkbox($data);
        ?>
    </td>
    <td align='center'>
        <?php
            if($check == TRUE)
                $data = array('name' => 'disable[]', 'value' => $customer, 'checked' => FALSE);
            else
                $data = array('name' => 'disable[]',  'value' => $customer, 'checked' => TRUE);

            echo form_checkbox($data);
        ?>
    </td>

</tr>
<?php endforeach?>

在我提交表单后,它会将值相应地存储到数据库中,但是我不希望用户能够同时勾选两个复选框。我尝试使用单选按钮,但这限制为每列一个检查。我正在尝试按行制作,有什么帮助吗?

附:我不喜欢使用任何 Javascript。

编辑,我为每一行添加了一个计数器,所以第一行将是 radio_1 等,这是我编辑的部分:

<td align='center'>
    <?php
        if($check == FALSE)
            $data = array('name' => "radio_$counter", 'value' => $customer, 'checked' => FALSE);
        else
            $data = array('name' => "radio_$counter", 'value' => $customer,  'checked' => TRUE);

        echo form_radio($data);
    ?>
</td>
<td align='center'>
    <?php
        if($check == TRUE)
            $data = array('name' => "radio_$counter", 'value' => $customer, 'checked' => FALSE);
        else
            $data = array('name' => "radio_$counter",  'value' => $customer, 'checked' => TRUE);

        echo form_radio($data);
    ?>
</td>

编辑 2,这就是我过去在控制器函数中检索它的方式:

// These were the arrays that I assigned to each checkbox according to the column
$enable = $this->input->post('enable');
$disable = $this->input->post('disable');

// I used it for inserting and deleting values
$insert = $this->home_model->insert_customer(array('user_id'=>$user_id, 'customer'=>$enable));
$delete = $this->home_model->delete_customer($user_id, $disable);

【问题讨论】:

  • 你应该只使用单选按钮并在每一行中更改它们的名称。可能会使用一些计数器或数据库 ID。
  • @NiranjanNRaju 我应该把名字改成什么?我使用了两个复选框,因为如果我使用一个复选框,我还想获得取消选中的值,如果可能的话。
  • 第一行的单选按钮名称 = >radio_1,第二行,radio_2...等
  • 如果需要,我会编辑/回答这个问题。
  • @NiranjanNRaju 我已经编辑了它,是的,请这样做。现在我被困在提交表单时如何检索所有值。如您所见,之前我使用数组作为名称。

标签: php codeigniter checkbox html-table


【解决方案1】:

最终我设法在不使用 javascript 的情况下解决了我的问题。

首先,在我看来,我在 td.xml 中使用了一个隐藏输入和一个复选框输入。正如您在下面看到的,有两个不同的数组。隐藏的输入数组命名为disable[],提交表单时包含所有选中复选框值的复选框数组命名为enable[]

隐藏的输入数组disable[] 无论如何都会提交值。所以现在我们在disable[] 数组中拥有了所有客户名称。

查看:

<td align='center'>
    <input type="hidden" value="<?php echo $customer?>" name='disable[]'>
    <?php
        if($check == FALSE)
        {
            $data = array('name' => 'enable[]', 'value' => $customer, 'checked' => FALSE);
        }
        else
            $data = array('name' => 'enable[]', 'value' => $customer,  'checked' => TRUE);

        echo form_checkbox($data);
    ?>
</td>

现在这是我操作数组以获得我想要的值的地方。就我而言,我的数据库表只有两列,即user_idcustomer。每次用户想要启用或禁用他/她的客户时,我都会添加和删除。这就是为什么我想同时获得这两个数组。

控制器:

// Array containing selected/checked customers
$enable = $this->input->post('enable');

// Array containing all customers
$disable = $this->input->post('disable');

// Loop through selected customers
foreach($enable as $index => $value)
{
    // Check if customer exists in database
    if( $this->home_model->check_customer($user_id, $enable[$index]) )
    {
        // If exists, unset from enable to prevent duplicate insert
        unset($enable[$index]);
    }

    /* Unset the remaining
    (or all selected customers if it doesn't exists in DB)
    selected customers from disable array */

    $key = array_search($value, $disable);
    unset($disable[$key]);
}

现在在同一个控制器中,只需进行 3 次简单检查,看看是否确保执行哪个查询,例如是否有客户要插入和删除,是否只有客户要插入,或者是否只有客户要删除

// Check enable and disable array are not empty
if( ! empty($enable) && ! empty($disable) )
{
    $insert = $this->home_model->insert_customer(array('user_id'=>$user_id, 'customer'=>$enable));
    $delete = $this->home_model->delete_customer($user_id, $disable);
}
// If enable array is not empty but disable is empty, insert only
elseif( ! empty($enable) && empty($disable) )
{
    $insert = $this->home_model->insert_customer(array('user_id'=>$user_id, 'customer'=>$enable));
}
// If enable is empty but disable is not empty, delete only
elseif( empty($enable) && ! empty($disable) )
{
    $delete = $this->home_model->delete_customer($user_id, $disable);
}

/*** Proceed with whatever you want to do like go to new page etc ***/

【讨论】: