【问题标题】:Post Multiple Checkbox from Table To Database Using Codeigniter使用 Codeigniter 将多个复选框从表发布到数据库
【发布时间】:2016-08-31 06:41:04
【问题描述】:

我无法将复选框发布到数据库。请帮帮我...

这是我的看法:

<table>
    <tr>
        <td>
            <input type='hidden' name='userid[]' value='1'>
            <input type='text' name='username[]' value='username1'> 
        </td>
        <td>
            <input type='checkbox' name='as_admin[]' value=1>
        </td>
    </tr>
    <tr>
        <td>
            <input type='hidden' name='userid[]' value='2'>
            <input type='text' name='username[]' value='username2'> 
        </td>
        <td>
            <input type='checkbox' name='as_admin[]' value=1>
        </td>
    </tr>
</table>

这是我的控制器:

$this->Model_user->insert_user();

这是我的模型:

function insert_user(){
    $user_count = count($this->input->post('userid'));
    $userid     = $this->input->post('userid');
    $username   = $this->input->post('username');
    $as_admin   = $this->input->post('as_admin');

    for ($i=0; $i < $user_count; $i++){
        $info_user = array(
            'user_id'   => $userid[$i],
            'user_name' => $username[$i],
            'as_admin'  => $as_admin[$i],
        );
        $this->db->insert($info_user);
    }
}

问题是当 'username2' 标记为 admin(选中第二行复选框)时,数据库中将是这样的:

|user_id|user_name|as_admin|
|   1   |username1|   1    |
|   2   |username2|   0    |

应该是这样的:

|user_id|user_name|as_admin|
|   1   |username1|   0    |
|   2   |username2|   1    |

现在有没有人如何保存那些东西,拜托...

提前谢谢...

【问题讨论】:

  • 您是否同时选中两个复选框?
  • @d.coder 看起来是这样,用收音机代替。
  • 当我检查第二行时,复选框值保存到第一行
  • 如果没有,那么你必须使用收音机。
  • 不能使用收音机,因为两者都可以作为管理员

标签: php mysql codeigniter checkbox


【解决方案1】:

试试这个,在你看来,使用用户 ID 作为 as_admin 的键

<table>
    <tr>
        <td>
            <input type='hidden' name='userid[]' value='1'>
            <input type='text' name='username[]' value='username1'> 
        </td>
        <td>
            <input type='checkbox' name='as_admin[1]' value=1>
        </td>
    </tr>
    <tr>
        <td>
            <input type='hidden' name='userid[]' value='2'>
            <input type='text' name='username[]' value='username2'> 
        </td>
        <td>
            <input type='checkbox' name='as_admin[2]' value=1>
        </td>
    </tr>
</table>

在你的模型中

function insert_user(){
    $user_count = count($this->input->post('userid'));
    $userid     = $this->input->post('userid');
    $username   = $this->input->post('username');
    $as_admin   = $this->input->post('as_admin');

    for ($i=0; $i < $user_count; $i++){
        $info_user = array(
            'user_id'   => $userid[$i],
            'user_name' => $username[$i],
            'as_admin'  => isset($as_admin[$userid[$i]]) ? 1 : 0,
        );
        $this->db->insert($info_user);
    }
}

您遇到此问题是因为,如果您只想选中 1 个复选框,则只会传递选中的值,因此如果您计算 $as_admin,您将只得到 2 个 as_admin 中的 1 个。

如果您只将 admin 设为 username2

那么您的帖子将如下所示

Array
(
    [userid] => Array
        (
            [0] => 1
            [1] => 2
        )

    [username] => Array
        (
            [0] => username1
            [1] => username2
        )

    [as_admin] => Array
        (
            [2] => 1
        )
)

【讨论】:

  • 复选框名称as_admin[1]不需要设置索引。但是,您已经这样做了,那么您确定您的 for 循环会正确设置 as_admin 吗? isset($as_admin[$userid[$i]]) ? 1 : 0 循环从 0 迭代到小于 $user_countas_admin 索引不一样。
  • 我已经更新了我的答案,你会从中得到答案。我们使用用户 ID 作为 as_admin 的键
  • 哦,我完全错过了。
【解决方案2】:

问题是未选中的复选框未发布,并且可能没有选中任何框。如果选中了某些内容,则需要一种将复选框与用户 ID 关联的方法。这个答案要求userid[] 的值是复选框的value。所以html就改成这个了。

<table>
  <tr>
    <td>
      <input type='hidden' name='userid[]' value='1'>
      <input type='text' name='username[]' value='username1'> 
    </td>
    <td>
      <input type='checkbox' name='as_admin[]' value=1>
    </td>
  </tr>
  <tr>
    <td>
      <input type='hidden' name='userid[]' value='2'>
      <input type='text' name='username[]' value='username2'> 
    </td>
    <td>
      <input type='checkbox' name='as_admin[]' value=2>
    </td>
  </tr>
</table>

本质上,如果 'userid' 是 $_POST['as_admin'] 中的值,控制器函数将设置 $info_user['as_admin'] = 1,如果不是,则设置 $info_user['as_admin'] = 0

此答案使用$this-&gt;db-&gt;insert_batch,而不是重复调用$this-&gt;db-&gt;insert。数组$data 是一个由$info_user 数组组成的数组。

function insert_user()
{
    //get the all of $_POST from $this->input
    //eliminates multiple calls to $this->input
    $posted = $this->input->post();

    //It's possible that no "admin" boxes are checked, if none provide empty array
    $as_admin = isset($posted['as_admin']) ? $posted['as_admin'] : array();

    $data = array();
    if(isset($posted['userid']))
    {
        foreach($posted['userid'] as $key => $value)
        {
            $info_user = array(
                'user_id' => $value,
                'user_name' => $posted['username'][$key],
                'as_admin' => in_array($posted['userid'][$key], $as_admin) ? 1 : 0,
            );
            $data[] = $info_user;
        }
        $this->db->insert_batch('some_table', $data);
    }
}

【讨论】:

  • 我试过这个,但它似乎不适用于复选框(或者我的代码可能有误),但无论如何谢谢......我从你的代码中学到了很多关于插入批处理的东西......
  • 我对此进行了测试,它确实有效。需要仔细检查的一个非常重要的项目是,在每个&lt;tr&gt; 中,复选框的值必须与隐藏字段的值相同。换句话说,如果&lt;input type='hidden' name='userid[]' value='2'&gt; 那么你必须在该表行中有&lt;input type='checkbox' name='as_admin[]' value=2&gt;
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多