如何编写条件来检查不在codeigniter数据库表中的csv文件数据?

Posted

技术标签:

【中文标题】如何编写条件来检查不在codeigniter数据库表中的csv文件数据?【英文标题】:how to write condition to check csv file data which is not in the database table in codeigniter? 【发布时间】:2016-12-11 18:28:33 【问题描述】:

我的控制器看起来

public function importcsv() 


    $data['menu'] = $this->AdminModel->get_menu();
    $data['error'] = '';    //initialize image upload error array to empty

    $config['upload_path'] = './assets/uploads/';
    $config['allowed_types'] = 'csv';
    $config['max_size'] = '1000';

    $this->load->library('upload', $config);


    // If upload failed, display error
    if (!$this->upload->do_upload())
    
        $data['error'] = $this->upload->display_errors();

        $this->load->view('csvindex', $data);
     
    else 
    
        $file_data = $this->upload->data();
        $file_path =  './assets/uploads/'.$file_data['file_name'];

        if ($this->csvimport->get_array($file_path)) 
        

            $csv_array = $this->csvimport->get_array($file_path);
            foreach ($csv_array as $row) 
            


                $data1['mid']=$row['mid'];
                $data1['category']=$row['category'];
                $data1['name']=$row['name'];
                $data1['price']=$row['price'];
                $data1['description']=$row['description'];


                    if($this->db->where('mid', $data1['mid']))
                    

                         $this->db->update('menu', $data1);
                    
                        if($this->db->where("mid <>",$data1['mid']))
                        


                            $this->db->insert('menu', $data1);
                        



                    

            $this->session->set_flashdata('success', 'Csv Data Imported Succesfully');
            redirect(base_url().'Admin/menu');

         
        else 
        
            $data['error'] = "Error occured";
            $this->load->view('csvindex', $data);
        

    

使用条件

   if($this->db->where('mid', $data1['mid']))
    

         $this->db->update('menu', $data1);
    

我可以更新 mid 等于 csv 文件 mid ($data1['mid'] 的 menu 表格内容)。它的工作正常。

我的需要是当 midcsv 文件 中而不是在 菜单表 中时,我必须插入记录。为此我使用了一个条件

    if($this->db->where("mid <>",$data1['mid']))
    
        $this->db->insert('menu', $data1);
    

但它不起作用,它就像 csv 文件中的 mid 不在 菜单表 中一样,然后它插入整个csv 文件内容到表中。

我需要只插入不在菜单表中的记录。那个条件怎么写。我正在研究它很长一段时间我对这种情况很陌生。提前致谢。

【问题讨论】:

【参考方案1】:

首先我想提出一些建议,

您在 foreach 循环中执行大量数据库操作,这对性能因素不利。您应该先准备查询,然后立即触发。

另外一件事是您正在通过 php 代码检查数据库中的记录并触发查询。而不是你应该只检查 mysql

以下是您可以根据自己的参数实施的解决方案的粗略想法。

您可以编写一个查询来检查表中的现有记录,如果不存在,然后将其插入到表中。

WHERE NOT EXISTS

这可以在您的查询中使用。

另外,您可以使用 codeigniter 的insert_batch 函数附加更多查询并立即触发它。

粗略的结构就像

foreach(x as y) 
     //push all data to array $queries;

$this->db->insert_batch('menu',$queries);

【讨论】:

以上是关于如何编写条件来检查不在codeigniter数据库表中的csv文件数据?的主要内容,如果未能解决你的问题,请参考以下文章

如果在 jquery 和 codeigniter 中检查和取消选中复选框的其他条件

使用 codeigniter 中的 where 条件计算非空值

检查 codeigniter 查询错误,而不是向用户显示它们

Mysql查询使用codeigniter检查用户名和密码

使用 CodeIgniter 的 MySQL 查询问题

Codeigniter - 具有多个 Where 条件的批量更新