web-dev-qa-db-ja.com

1つずつ実行できないcodeigniterで複数のクエリを実行する

「イベント」テーブルがあります。簡単にするために、階層カテゴリのようにする必要があると想像できます。 入れ子集合モデルを使用します( 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_


このコードを修正して機能させるにはどうすればよいですか?最初の問題の解決策を見つけられれば幸いです。

13
Mohammad Naji

多分トランザクションを使用しますか?

$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

14
webmaster_sean

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();
}
3
sanmai

クエリ内の変数をパラメータとして、上記のすべてのSQLを実行するストアドプロシージャを作成してみませんか。次に、ストアドプロシージャを単一のSQLステートメントとして呼び出すだけです。

$sql = "CALL some_sp($param1, $param2...etc)";
3
Skittles
$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);