我的控制器看起来
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 file mid ($ data1 ['mid'] )即可。它的工作正常。
我的需要是我必须在 csv文件中中而不是菜单表中插入记录。因为我使用条件
if($this->db->where("mid <>",$data1['mid']))
{
$this->db->insert('menu', $data1);
}
但它不起作用,如果 csv文件中的 mid 不在菜单表中,那么它就像在将csv文件内容放入表中。
我的需要是我只需要插入不在菜单表中的记录。如何写出那个条件。我正在研究它很长一段时间我不熟悉这种情况。提前感谢。
答案 0 :(得分:0)
首先,我想提出一些建议,
你在foreach循环中做了很多数据库操作,这对性能因素不利。您应首先准备查询,然后立即开火。
另一件事是你通过php代码检查数据库中的记录并触发查询。而不是你应该只检查MySQL。
以下是您可以根据自己的参数实施的解决方案的粗略概念。
如果不存在,您可以编写一个检查表中现有记录的查询,然后将其插入表中。
WHERE NOT EXISTS
这可以在您的查询中使用。
还可以使用insert_batch
codeigniter函数添加更多查询并立即触发查询。
粗糙的结构就像
foreach(x as y) {
//push all data to array $queries;
}
$this->db->insert_batch('menu',$queries);