2012-01-25 70 views
8

我有一个“事件”表。为了简单起见,您可以想象它应该像分层类别。它使用嵌套集模型(感谢马克Hillyer他在http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/后)在codeigniter中执行多个不能逐个执行的查询

我的代码:

$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是用户填充的数组。


问题1:

我无法执行$查询$这 - > DB->查询($查询);;

解决方案1,没有工作:

I.使用的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


如何纠正此代码的工作?我很乐意为第一个问题寻找解决方案。

+0

你可以有一个查询的数组,并在循环 – GordonM

+0

没有执行它们,你可以在这种情况下,看到执行作为单独的查询不起作用,因为它不记得'@ myRight'和'@ Level'从过去查询的结果变量 –

+0

直到断开连接后变量才被保留吗? – GordonM

回答

12

也许使用交易?

$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(); 

http://ellislab.com/codeigniter/user-guide/database/transactions.html

+0

谢谢。我现在不处于测试你的答案的状况。无论如何,因为它似乎是正确的,无忧无虑的,我接受它,直到我真正检查它是如何工作的。 –

2

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

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

MySQL中用户定义的变量是特定于连接的,并保留到您关闭连接。

$queryList = array(
    "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)", 
    false, // special value 
    "UNLOCK TABLES", 
) 

foreach ($queryList as $query) if ($query) { 
    mysqli_query($this->db->conn_id, $query); 
    // you should have error-checking here 
} else { 
    // we have the special value 
    $data['id'] = $this->db->insert_id(); 
} 
+0

我会补充说,你必须确保'system/application/config/database.php'中的dbdriver行被设置为'mysqli': '$ db ['default'] ['dbdriver'] =“mysqli “;'这篇文章正是我需要加快我的批量插入。非常感谢你。 –

0
$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); 
+0

你可以请格式化查询吗? – WhatsThePoint