CodeIgniter Transaction не работает должным образом

У меня есть эта функция в моей модели, которая должна выполнять два запроса в транзакции, но запрос на обновление не работает.

public function delete($id = null)
{
if($id) {
$delete = "DELETE FROM borrowed_books
WHERE id = '$id'; ";

$mod="UPDATE `books` b
INNER JOIN `borrowed_books` a
SET b.nr_copies=b.nr_copies+1
WHERE b.id_book=a.id_book AND a.id = '$id'; ";

$this->db->trans_start();
$this->db->query($delete);
$this->db->query($mod);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
return false;
} else {
return true;
}
}

}

0

Решение

Быстрое исправление может выполнять обновление перед удалением;

public function delete($id = null)
{
if ($id) {
$delete = "DELETE FROM borrowed_books
WHERE id = '$id'; ";

$mod="UPDATE `books` b
INNER JOIN `borrowed_books` a
SET b.nr_copies=b.nr_copies+1
WHERE b.id_book=a.id_book AND a.id = '$id'; ";

$this->db->trans_start();
// execute the update
$this->db->query($mod);
// then delete
$this->db->query($delete);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
return false;
} else {
return true;
}
}
}

Условие запроса на обновление; он ищет данные, которых нет, потому что вы их удалили. Поэтому, если вы выполните обновление (тогда ваш запрос найдет результат, предполагая, что условие выполнено правильно), он обновится ..

0

Другие решения

Было бы невозможно обновить то, чего нет. В первом запросе, ваш запрос на удаление, вы удаляете из заемных книг WHERE id = '$id', но затем сразу после этого вы пытаетесь обновить те записи заимствованных книг с тем же идентификатором, and a.id = '$id', Он не будет обновляться, потому что обновлять нечего.

Чтобы прояснить, во втором запросе, a.id ссылается на идентификатор таблицы loaned_books, но в запросе на удаление (первый запрос) вы только что удалили ту же самую запись loaned_books, поэтому присоединять нечего.

2

INNER JOIN не удается найти данные, которые вы уже удалили на первом этапе транзакции, вам нужно запросить конкретный borrowed_books данные и сохранить его в переменной, прежде чем удалить его. Кстати, я никогда не видел, чтобы люди использовали UPDATE, как это UPDATE .... INNER JOINв SQL, и это делает ваш код настолько запутанным, я немного изменить ваш код, я думаю, что это более понятно.

public function delete($id = null)
{
if ($id) {
$borrowedBook = $this->db->query('SELECT * FROM borrowed_books WHERE id=' . $id);

$delete = "DELETE FROM borrowed_books
WHERE id = '$id'; ";$mod = "UPDATE books SET nr_copies = nr_copies + 1 WHERE id_book = " . $borrowedBook->id_book;

$this->db->trans_start();
// execute the update
$this->db->query($mod);
// then delete
$this->db->query($delete);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
return false;
} else {
return true;
}
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector