如何在Codeigniter中一次运行多个查询?

时间:2018-07-10 04:58:18

标签: mysql codeigniter phpmyadmin mysqli-multi-query dynamic-queries

$sql = "
        DELETE FROM `products` WHERE id = 123456; 
        INSERT INTO `products` SET `name` = 'abc', `price` = 100;
        DELETE FROM `survey` WHERE id = 2522; 
        INSERT INTO `survey` SET `survey_name` = 'bla bla', `date` = 10-07-2018;
       ";

当我从 phpmyadmin 运行它时,它就可以工作了。但是,当我从 Codeigniter以$this->db->query($sql); 的身份运行它时...那时候它不起作用了。

我该如何解决?

注意:在 $ sql 变量中有大量查询。我想一次查询大量的服务器。然后服务器一一执行这些查询。我从不想再打PHP了。

4 个答案:

答案 0 :(得分:1)

也许使用交易?

$this->db->trans_start();
$this->db->query('DELETE FROM `products` WHERE id = 123456');
$this->db->query('INSERT INTO `products` SET `name` = 'abc', `price` = 100');
$this->db->query('DELETE FROM `survey` WHERE id = 2522');
$this->db->query('INSERT INTO `survey` SET `survey_name` = 'bla bla', `date` = 10-07-2018');
$this->db->trans_complete(); 

相关问题:https://stackoverflow.com/a/17358652/5566169

答案 1 :(得分:1)

根据CodeIgniter Docs,如果要运行多个查询,则应进行事务处理。但是这个解决方案已经得到解决,我不再写了。

但是我想展示一下,您仍然可以将查询写在一个变量中,并使用for循环来一一拆分和执行:

$sqls = explode(';', $sql);
array_pop($sqls);

foreach($sqls as $statement){
    $statment = $statement . ";";
    $this->db->query($statement);   
}

This code piece属于github用户Relequestual,我在其要旨上使用了他的示例代码,为您提供了另一种方法。

编辑:如果您想一次将多个查询传递给数据库,则应使用事务,事务将在此之后处理并为您执行。所以代码应该是这样的:

$sqls = explode(';', $sql);
array_pop($sqls);

$this->db->trans_start();
foreach($sqls as $statement){
    $statment = $statement . ";";
    $this->db->query($statement);   
}
$this->db->trans_complete(); 

答案 2 :(得分:0)

您可以使用Union来加入查询:

这在Codeinginter中对我有用:

$result = $this->db->query($query1 .' UNION '. $query2)->result_array();

答案 3 :(得分:-1)

将交易用作波纹管

$this->db->trans_start();
$this->db->query("DELETE FROM products WHERE id = 123456");
$this->db->query("INSERT INTO products SET name = 'abc', price = 100;");
$this->db->query("DELETE FROM survey WHERE id = 2522");
$this->db->query("INSERT INTO survey SET survey_name = 'bla bla', date = '10-07-2018'");
$this->db->trans_complete();