У меня есть эта функция в моей модели, которая должна выполнять два запроса в транзакции, но запрос на обновление не работает.
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;
}
}
}
Быстрое исправление может выполнять обновление перед удалением;
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;
}
}
}
Условие запроса на обновление; он ищет данные, которых нет, потому что вы их удалили. Поэтому, если вы выполните обновление (тогда ваш запрос найдет результат, предполагая, что условие выполнено правильно), он обновится ..
Было бы невозможно обновить то, чего нет. В первом запросе, ваш запрос на удаление, вы удаляете из заемных книг WHERE id = '$id'
, но затем сразу после этого вы пытаетесь обновить те записи заимствованных книг с тем же идентификатором, and a.id = '$id'
, Он не будет обновляться, потому что обновлять нечего.
Чтобы прояснить, во втором запросе, a.id
ссылается на идентификатор таблицы loaned_books, но в запросе на удаление (первый запрос) вы только что удалили ту же самую запись loaned_books, поэтому присоединять нечего.
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;
}
}
}