$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中多次命中。
可能使用事务?
$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
根据CodeIgniter文档,如果您想运行多个查询,则应该进行交易。但这个解决方案已经得到了答案,我不会再写了。
但我想展示的是,您仍然可以在一个变量中编写查询,并使用for循环逐个拆分和执行:
$sqls = explode(';', $sql);
array_pop($sqls);
foreach($sqls as $statement){
$statment = $statement . ";";
$this->db->query($statement);
}
这段代码属于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();
使用以下交易-
$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();
您可以使用Union
加入查询:
这适用于我在编码编辑器:
$result = $this->db->query($query1 .' UNION '. $query2)->result_array();