在codeigniter中执行多个无法一一执行的查询

Posted

技术标签:

【中文标题】在codeigniter中执行多个无法一一执行的查询【英文标题】:Executing multiple queries in codeigniter that cannot be executed one by one 【发布时间】:2012-02-18 11:23:19 【问题描述】:

我有一个“事件”表。为简单起见,您可以想象它应该像一个分层类别。它使用嵌套集模型(感谢 Mark Hillyer 在http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 的帖子)

我的代码:

$query = 
"LOCK TABLE event WRITE;
SELECT @ParentRight := parent.rgt, @Level := parent.level FROM event AS parent WHERE parent.id = '$data['parent_id']';

UPDATE event SET rgt = rgt + 2 WHERE rgt > @ParentRight;
UPDATE event SET lft = lft + 2 WHERE lft > @ParentRight;

INSERT INTO event(lft, rgt, level) VALUES(@ParentRight, @ParentRight + 1, @Level);
UNLOCK TABLES;";

mysqli_multi_query($this->db->conn_id, $query);

$data['id'] = $this->db->insert_id();
return $this->db->update('event', $data);

然后我将使用$this->db->update('event', $data)更新最后插入的对象

$data是用户填写的数组。


问题一:

我无法使用 $this->db->query($query);;

执行 $query

无效的解决方案 1:

我。使用 mysqli 数据库引擎。

二。 mysqli_multi_query($this->db->conn_id, $query); 虽然我认为它有效,但它给出了以下错误:

Commands out of sync; you can’t run this command now.


问题 2:

$this->db->insert_id() 不起作用(返回 0)

问题 3:

$this->db->update('event', $data); 错误: Commands out of sync; you can't run this command now


如何更正此代码以使其正常工作?我什至很乐意为第一个问题找到解决方案。

【问题讨论】:

你可以有一个单一的查询数组并在一个循环中执行它们 不,正如您所见,在这种情况下,作为单独的查询执行是行不通的,因为它无法从过去的查询结果中调用 @myRight@Level 变量 在断开连接之前不会保留变量吗? 我所知道的是,在声明它们的查询离开后,这些变量是不可访问的。 哇,这很奇怪,因为我认为分号无论如何都会表示语句的结尾。 【参考方案1】:

也许使用交易?

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete(); 

https://www.codeigniter.com/user_guide/database/transactions.html

【讨论】:

不要忘记通过检查事务状态来检查所有查询是否执行 $this->db->trans_status() ***.com/a/34695559/5803974【参考方案2】:

为什么不编写一个存储过程来执行上面列出的所有 SQL,并将查询中的变量作为参数。然后只需将存储过程作为单个 SQL 语句调用即可;

$sql = "CALL some_sp($param1, $param2...etc)";

【讨论】:

Codeigniter 不允许在单个 $this->db->query($sql) 中运行具有多个语句的查询;函数调用。我们不能使用你提到的这一点。【参考方案3】:

您可以简单地使用以下内容:

 print_r($this->db->query("YOUR query NO 1") ? 'Success Q1' : $this->db->error());
 print_r($this->db->query("YOUR query NO 2") ? 'Success Q2' : $this->db->error());
 print_r($this->db->query("YOUR query NO 3") ? 'Success Q3' : $this->db->error());

【讨论】:

【参考方案4】:
$query1 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan`=1 AND `tamatar`=1 AND`active`=1 ORDER BY rand()  LIMIT 3");

$query2 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan`=2 AND `tamatar`=1 AND`active`=1 ORDER BY rand()  LIMIT 3");

$query3 = $this->db->query("SELECT * FROM `Wo_Products` WHERE `boost_plan` NOT IN (0,1) AND `tamatar`=1 AND`active`=1 ORDER BY rand()  LIMIT 6");

    $result1 = $query1->result();
    $result2 = $query2->result();
    $result3 = $query3->result();
    return array_merge($result1, $result2, $result3); 

【讨论】:

以上是关于在codeigniter中执行多个无法一一执行的查询的主要内容,如果未能解决你的问题,请参考以下文章

生成多个查询字符串并一一执行

如何在codeigniter中使用存储过程的结果集

进程管理

Codeigniter 选择用户电子邮件不在另一个表中执行时间太长

无法在 Codeigniter 中从模型获取查询结果到控制器

CodeIgniter 只执行默认控制器