【问题标题】:How to insert multiple checkbox value in mysql using codeigniter如何使用codeigniter在mysql中插入多个复选框值
【发布时间】:2014-03-17 01:14:24
【问题描述】:

我是 codeigniter 的新手。我正在尝试插入多个新闻,其中包含一些复选框,其中的值是从数据库中循环的。但我不知道我应该在控制器和模型中为此编写什么代码来插入值。有人可以建议或帮助我编写代码吗?

查看 - content.php

//category name
<?php foreach($result as $aresult) { ?>
    <input type="checkbox" name="category_name[]" value="<?php echo $aresult->category_name;?>" /> <?php echo $aresult->category_name;?>
<?php  } ?>

控制器 - 新闻

public function savecontent()
{         
    $data=array();
    foreach($this->input->post('category_name') as $category_name) 
    {
       $data[] = array('category_name' => $category_name);
    }
    $data['content_headline']=$this->input->post('content_headline',true);
    $this->co_model->save_content($data);
}

型号:

public function save_content($data)
{
    $this->db->insert('content',$data);
}

数据库结构:

id(auto incr.), category_name(varchar 50),  content_headline(varchar 100) 

现在我应该改变什么来使用复选框插入多行?这里还有另一个文本框/列也插入到数据库中。但只有类别名称(复选框值)应更改为所有值。

【问题讨论】:

  • 我没有完全理解最后一部分。请与您的数据库结构一起发布整个相关代码。
  • 已编辑问题..请检查(geomagas)
  • 嗯,不是 qoute。显然,还有另一个包含类别的表,用于生成视图的表。我们也需要那个! :)

标签: php codeigniter


【解决方案1】:

首先你需要调整你的数据库结构。显然,contentcategory 之间存在 M:N 关系。更合适的架构是:

create table content (
  id int not null auto_increment primary key,
  content_headline varchar(100) not null
  );

create table category (
  id int not null auto_increment primary key,
  caregory_name varchar(100) not null
  );

create table content_category (
  content int not null references content,
  category int not null references category,
  primary key (content,category)
  );

然后,您需要调整代码以反映新架构。

假设您从select * from category 得到$result,您的视图将归结为:

<label>
  Headline:
  <input type='text' name='headline'>
</label>
<?php foreach($result as $aresult): ?>
  <label>
    <input type="checkbox" name="category[<?php echo $aresult->id; ?>]">
    <?php echo $aresult->category_name; ?>
  </label>
<?php endforeach; ?>

发布后,这将为您提供如下数组:

array(
  'headline'=>'War and Peace',
  'category'=>array(
    45=>'on',
    6=>'on'
    )
  );

...其中 45 和 6 是选中的类别 ID。请注意,如果未选中任何类别,则不会定义 category 数组。

所以控制器变成了:

public function savecontent()
  {         
  $post=$this->input->post();
  $selected_cats=(isset($post->category)?array_keys($post->category):array());
  $data=array(
    'headline'=>$post->headline,
    'category'=>$selected_cats
    );
  $this->co_model->save_content($data);
  }

最后是模型:

public function save_content($data)
  {
  $this->db->insert('content',array('content_headline',$data['headline']);
  $content=$this->db->insert_id(); // what we inserted
  foreach($data['category'] as $cat)
    $this->db->insert(
      'content_category',
      array(
        'content'=>$content,
        'category'=>$cat
        )
      );
  }

【讨论】:

  • 无需在一个循环中进行多次插入。一个插入语句可以采用多个值集。只需编写原始 sql,而不是使用 CI 的 AR 库。一次性插入的唯一损失是事务粒度,因此这取决于您是否担心错误。
  • 是的,我知道,但我选择按照 OP 的路线玩... ;)
  • 别担心,我通常也会走这条路。也总是喜欢提出替代方案:)
  • $selected_cats=(isset($post->category)?array_keys($post->category):array()); .....这条线是什么意思?
  • 这是一个ternary operator。如果设置了$post-&gt;category,则将array_keys($post-&gt;category) 分配给$selected_cats,否则为空数组。这是一种速记if
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多