Выполнение нескольких запросов в codeigniter, которые не могут быть выполнены один за другим - PullRequest
12 голосов
/ 25 января 2012

У меня есть таблица "событий". Для простоты вы можете представить, что это должно быть похоже на иерархическую категорию . Он использует модель вложенного набора (Спасибо Марку Хиллеру за его пост в 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 - это массив, который заполнил пользователь.


Задача 1:

Я не смог выполнить $ query с $ this-> db-> query ($ query); ;

Решение 1, которое не сработало:

I. Используйте mysqli db engine.

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


Как я могу исправить этот код для работы? Я был бы даже рад найти решение для первой проблемы.

Ответы [ 4 ]

14 голосов
/ 28 июня 2013

Может быть, использовать транзакции?

$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

3 голосов
/ 27 января 2012

Пользовательские переменные в 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 голосов
/ 27 января 2012

Почему бы просто не написать хранимую процедуру, которая выполняет все перечисленные выше SQL, принимая переменные в ваших запросах в качестве параметров. Затем просто вызовите хранимую процедуру как один оператор SQL;

$sql = "CALL some_sp($param1, $param2...etc)";
0 голосов
/ 06 февраля 2018
$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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...