PhP_Raz
@PhP_Raz
Web - developer

Не получается удалить записи из таблицы!?

Здравствуйте!

Этот вопрос скорее идет как продолжение/дополнение моего предыдущего вопроса, вот этого, хотя его можно рассматривать и как отдельный вопрос.
Задача.
Реализовать прием комментариев от посетителей сайта. Комментарии разделяются по категориям. Посетитель может оставить комментарий в нескольких категориях одновременно. Администратор сайта может добавлять, редактировать и удалять категории.
Схема бд:
ef0c3c524ad9499cb8ac07a565db9a1f.jpg
При удалении админом одной из категорий нужно удалить связанную с ней запись(или записи) из таблицы cat_id. Если комментарий имел только одну категорию, то нужно вместе с записью из таблицы cat_id удалить связанную с ней запись из таблицы comment. Так вот, записи из таблицы cat_id удаляются вместе с категорией, а связанная с ней запись из таблицы comment не удаляется. Не могу понять в чем проблема.
Для всего этого были созданы три класса: Category, Comment и Category_Comment.
Category
class Category
{
    public function delete($id)
    {
        $sql = 'DELETE FROM `category` WHERE id = "' . $id . '"';
        $result = $this->mysqli->query($sql);
        if (!$result) {
            die($this->mysqli->error);
        } else {
            $cat_com = new Category_Comment();
            $cat_com->delete($id);
            return true;
        }
    }
}

Comment
class Comment
{
    public function delete($id)
    {
        $sql = 'DELETE FROM `comment` WHERE id = "' . $id . '"';
        $result = $this->mysqli->query($sql);
        if (!$result) {
            die($this->mysqli->error);
        }
    }
}

Category_Comment
class Category_Comment
{
    public function findComId($id)
    {
        $sql = 'SELECT comment_id FROM `category_comment` WHERE category_comment.category_id = ' . $id;
        $result = $this->mysqli->query($sql);
        if (!$result) die($this->mysqli->error);
        return $result->fetch_all(MYSQLI_ASSOC);
    }
    public function findCatId($id)
    {
        $sql = 'SELECT category_id FROM `category_comment` WHERE category_comment.comment_id = ' . $id;
        $result = $this->mysqli->query($sql);
        if (!$result) die($this->mysqli->error);
        return $result->fetch_all(MYSQLI_ASSOC);
    }
    public function delete($id)
    {
        $com_id = $this->findComId($id);
        $com = new Comment();
        foreach ($com_id as $key => $value) {
            $cat_id = $this->findCatId($value['comment_id']);
            if (count($cat_id) == 1 and $cat_id[0]['category_id'] == $id) {
                $com->delete($value['comment_id']);
                $this->delete_cat_com($id);
            } elseif(count($cat_id) > 1) {
                $this->delete_cat_com($id);
            }
        }
    }
    private function delete_cat_com($id)
    {
        $sql = 'DELETE FROM `category_comment` WHERE category_id = "' . $id . '"';
        $result = $this->mysqli->query($sql);
        if (!$result) {
            die($this->mysqli->error);
        }
    }
}

В методе delete() класса Category вызывается метод delete() класса Category_Comment. В методе delete() класса Category_Comment происходит поиск всех комментариев связанных с удаляемой категорией. Дальше в этом методе подсчитывается количество категорий у каждого комментария, если у комментария только одна категория, удаляемая, то удаляется и сам коммент из таблицы comment и запись из таблицы cat_id. Если категорий больше чем одна, то удаляется только запись. Так вот, из таблицы comment что то ничего не удаляется или удаляется только первый коммент из нескольких. Может кто подскажет в чем причина.
  • Вопрос задан
  • 531 просмотр
Решения вопроса 1
@OVK2015
Если есть несколько комментариев. у кот. категория одна и она удаляется, то дело может быть в том, что при итерации с 1-ым комментарием вы удаляете саму категорию. И, соответственно при следующих итерациях findCatId ее уже не найдет. Проверка count($cat_id) == 1 не пройдет,- такой категории уже нет
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MadridianFox
Web-программист, многостаночник
Нужно сначала удалять связи комментариев и категорий а только потом удалять саму категорию.
Иначе получается что вы удалили категорию, а в другой таблице остался её id. СУБД этого не допускает и выдаёт ошибку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы