2012-01-25 7 views
8

"イベント"テーブルがあります。簡単にするために、階層カテゴリのようにする必要があります。コードネイターで1つずつ実行できない複数のクエリを実行しています

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

との最後の挿入されたオブジェクトを更新するつもりです:それは、 入れ子集合モデルhttp://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/で彼のポストのためのマークHillyerのおかげで)

私のコードを使用しています

$dataは、ユーザーが入力した配列です。


問題1:

私は$クエリを実行できませんでしたます$ this-> DB->クエリ($クエリ)を持ちます。;動作しませんでした

解決方法1:

I.使用mysqliのデシベルエンジン。

II。 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

関連する問題