如何在Codeigniter中插入动态数据?

3

我只想将动态生成的输入字段数据插入到数据库中。我的数据库表有三个字段,id(自增)、product_name和rate。我正在尝试使用动态生成的输入字段将批量数据插入到数据库中,我可以手动添加/删除输入字段。

enter image description here

我创建了输入字段:

<input class="form-control" placeholder="Product Name" name="prodname[]" type="text">
<input class="form-control" placeholder="Product Rate" name="prodrate[]" type="text">

以下是我的控制器:

这是我的控制器代码:

function Act_AddProducts() {
        if ( $this->input->post( 'prodname' )&&$this->input->post( 'prodrate' )) {
            foreach ( $this->input->post( 'prodname' ) as $key => $value ) {

                $this->ProductModel->add_products( $value );
            }

        }

以下是模型功能

function add_products($val)
  {
      if($this->db->insert('tbl_product_master', array('product_name' => $val)))
      {
        return true;
      }
      else
      {
        return false;
      }
  }

现在的问题是每次只能插入一个值到数据库中,因此请帮我查找并解决代码中的问题。另外,我不太理解如何将prodrate[]的值插入到同一条插入查询中。

5个回答

4
希望这能帮到你: 您的控制器Act_AddProducts应该像这样:
function Act_AddProducts() 
{
   $prodnames = $this->input->post( 'prodname' );
   $prodrates = $this->input->post( 'rate' );
    if ( ! empty($prodnames) && ! empty($prodrates) ) 
    {
        foreach ($prodnames as $key => $value ) 
        {
            $data['product_name'] = $value;
            /* make sure product_rate columns is correct i just guess it*/
            $data['product_rate'] = $prodrates[$key];
            $this->ProductModel->add_products($data);
        }

    } 
}

您的模型add_products应该像这样:
function add_products($data)
{
   if ( ! empty($data))
   {
      $this->db->insert('tbl_product_master', $data);
   }
}

请确保 product_rate 列的名称为 product_rate,否则在控制器中更改它,因为您没有给出速率列名称。 - Pradeep
我尝试了你的代码,但只有第一个值被插入到数据库中。 - Sudhi Sr
产品费率的列名是什么?你有没有收到任何错误信息? - Pradeep
把以下與程式設計相關的內容從英文翻譯成中文。僅返回翻譯文本:抱歉忘記在 add_products($val) 中更改 $valadd_products($data),現在已更新我的答案,請檢查。 - Pradeep
在插入查询之前,在Act_AddProducts方法中执行print_r($data);die;,让我看看你得到了什么? - Pradeep
显示剩余9条评论

0

只需将输入值直接传递给模型,然后在模型内部使用foreach。

function add_products($val)
{
   foreach ( $val as $key => $value ) {

            $this->db->insert('tbl_product_master', array('product_name' => $value );
        }
}

好的,我会尝试。您能展示如何插入“Rate”吗? - Sudhi Sr
不行,它不起作用。只有第一个输入值被插入。 - Sudhi Sr
不要在模型中使用return insert foreach... 即使删除了模型,也只会插入一条数据... 我可以提供一个示例代码... 但是在这个代码中,我把所有东西都放在控制器中而不是模型中... 请仔细查看。 - Bergin

0
尝试一下:
控制器
function Act_AddProducts() {
$product_rate = $data = array();

$product_rate = $this->input->post( 'prodrate' );
$product_name = $this->input->post( 'prodname' )
        if ( !empty($this->input->post( 'prodname' ))&&!empty($this->input->post( 'prodrate' ))) {
            foreach ( $product_name as $key => $value ) {
            $data['product_name'] = $value;
            $data['product_rate'] = $product_rate[$key];
                $this->ProductModel->add_products($data);
            }

        }

model

      function add_products($data)
  {
        $product_name = $data['product_name'];
        $product_rate = $data['product_rate'];
      if($this->db->insert('tbl_product_master', array('product_name' => $product_name,'product_rate' => $product_rate)))
      {
        return true;
      }
      else
      {
        return false;
      }
  }

0

这只是供您参考...一个动态插入的简单示例代码。

defined('BASEPATH') OR exit('No direct script access allowed');
class Checking extends CI_Controller {
public function index()
{ 
echo "<form method='post' action='". base_url("Checking/save") ."'>";
    for($i=0;$i<=5;$i++)
    {
            echo "<input type='text' name='input_text[]'>";
    }
    echo "<button type='submit'>Submit</button></form>";
}

public function save(){
    foreach($this->input->post("input_text") as $Row){
        $this->db->insert("checking",array("input_text"=>$Row['input_text']));
    }
}
}

创建一个名为Checking.php的控制器,并运行它...你会有个想法。
关于数据库,
CREATE TABLE `checking` (
`ch` int(11) NOT NULL AUTO_INCREMENT,
`input_text` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ch`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

为了立即实现目的,我把所有东西都放在控制器里面了。只需将其作为示例以获得一些想法,因为您是新手。请在模型内完成插入部分。 - Bergin

0

如果您想上传批量记录,则应使用insert_batch而不是简单的insert,您的控制器应该如下:

function Act_AddProducts() 
{
$product_rate = $_POST['prodrate'];
$product_name = $_POST['prodname'];

if(!empty($product_rate) && !empty($product_rate)){
$data_array = array();
  foreach ($product_rate as $key => $value ) 
        { 
            $tmp_array = array();
            $tmp_array['product_name'] = $value;
            $tmp_array['product_rate'] = $product_rate[$key];
      $data_array[] = $tmp_array;
        }
   $this->ProductModel->add_products($data_array);
}

模型应该是

function add_products($data)
  {


      if($this->db->insert_batch('tbl_product_master', $data))
      {
        return true;
      }
      else
      {
        return false;
      }
  }

你在控制器中的哪里调用了模型? - Sudhi Sr
抱歉,我不小心忘记调用模型了,刚刚已经修改了代码。 - Rahul kalal
不,这不是变量名称的问题。它在foreach循环中没有转动或者没有从表单中获取数组。你认为我在视图中漏掉了什么吗? - Sudhi Sr
请将以下代码放在函数顶部,并在提交后分享屏幕截图:echo '<pre>'; print_r($_POST); exit; - Rahul kalal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接