「イベント」テーブルがあります。簡単にするために、階層カテゴリのようにする必要があると想像できます。 入れ子集合モデルを使用します( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysqlに投稿してくれたMark Hillyerに感謝します) / )
私のコード:
_$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:
$ queryを$ this-> db-> query($ query);;で実行できませんでした。
動作しなかった解決策1:
I。mysqlidbエンジンを使用します。
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
_
このコードを修正して機能させるにはどうすればよいですか?最初の問題の解決策を見つけられれば幸いです。
多分トランザクションを使用しますか?
$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
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();
}
クエリ内の変数をパラメータとして、上記のすべてのSQLを実行するストアドプロシージャを作成してみませんか。次に、ストアドプロシージャを単一のSQLステートメントとして呼び出すだけです。
$sql = "CALL some_sp($param1, $param2...etc)";
$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);