За последние 24 часа нас посетили 18143 программиста и 1651 робот. Сейчас ищут 1372 программиста ...

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

Тема в разделе "PHP и базы данных", создана пользователем mr_black_web, 8 авг 2016.

Метки:
  1. mr_black_web

    mr_black_web Новичок

    С нами с:
    8 авг 2016
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте!

    Задача.
    Реализовать прием комментариев от посетителей сайта. Комментарии разделяются по категориям. Посетитель может оставить комментарий в нескольких категориях одновременно. Администратор сайта может добавлять, редактировать и удалять категории.
    Схема бд:
    [​IMG]
    При удалении админом одной из категорий нужно удалить связанную с ней запись(или записи) из таблицы cat_id. Если комментарий имел только одну категорию, то нужно вместе с записью из таблицы cat_id удалить связанную с ней запись из таблицы comment. Так вот, записи из таблицы cat_id удаляются вместе с категорией, а связанная с ней запись из таблицы comment не удаляется. Не могу понять в чем проблема.
    Для всего этого были созданы три класса: Category, Comment и Category_Comment.
    Category
    PHP:
    1. class Category
    2. {
    3.     public function delete($id)
    4.     {
    5.         $sql = 'DELETE FROM `category` WHERE id = "' . $id . '"';
    6.         $result = $this->mysqli->query($sql);
    7.         if (!$result) {
    8.             die($this->mysqli->error);
    9.         } else {
    10.             $cat_com = new Category_Comment();
    11.             $cat_com->delete($id);
    12.             return true;
    13.         }
    14.     }
    15. }
    Comment
    PHP:
    1. class Comment
    2. {
    3.     public function delete($id)
    4.     {
    5.         $sql = 'DELETE FROM `comment` WHERE id = "' . $id . '"';
    6.         $result = $this->mysqli->query($sql);
    7.         if (!$result) {
    8.             die($this->mysqli->error);
    9.         }
    10.     }
    11. }
    Category_Comment
    PHP:
    1. class Category_Comment
    2. {
    3.     public function findComId($id)
    4.     {
    5.         $sql = 'SELECT comment_id FROM `category_comment` WHERE category_comment.category_id = ' . $id;
    6.         $result = $this->mysqli->query($sql);
    7.         if (!$result) die($this->mysqli->error);
    8.         return $result->fetch_all(MYSQLI_ASSOC);
    9.     }
    10.     public function findCatId($id)
    11.     {
    12.         $sql = 'SELECT category_id FROM `category_comment` WHERE category_comment.comment_id = ' . $id;
    13.         $result = $this->mysqli->query($sql);
    14.         if (!$result) die($this->mysqli->error);
    15.         return $result->fetch_all(MYSQLI_ASSOC);
    16.     }
    17.     public function delete($id)
    18.     {
    19.         $com_id = $this->findComId($id);
    20.         $com = new Comment();
    21.         foreach ($com_id as $key => $value) {
    22.             $cat_id = $this->findCatId($value['comment_id']);
    23.             if (count($cat_id) == 1 and $cat_id[0]['category_id'] == $id) {
    24.                 $com->delete($value['comment_id']);
    25.                 $this->delete_cat_com($id);
    26.             } elseif(count($cat_id) > 1) {
    27.                 $this->delete_cat_com($id);
    28.             }
    29.         }
    30.     }
    31.     private function delete_cat_com($id)
    32.     {
    33.         $sql = 'DELETE FROM `category_comment` WHERE category_id = "' . $id . '"';
    34.         $result = $this->mysqli->query($sql);
    35.         if (!$result) {
    36.             die($this->mysqli->error);
    37.         }
    38.     }
    39. }

    В методе delete() класса Category вызывается метод delete() класса Category_Comment. В методе delete() класса Category_Comment происходит поиск всех комментариев связанных с удаляемой категорией. Дальше в этом методе подсчитывается количество категорий у каждого комментария, если у комментария только одна категория, удаляемая, то удаляется и сам коммент из таблицы comment и запись из таблицы cat_id. Если категорий больше чем одна, то удаляется только запись. Так вот, из таблицы comment что то ничего не удаляется или удаляется только первый коммент из нескольких. Может кто подскажет в чем причина.
     

    Вложения:

    • Joxi.jpg
      Joxi.jpg
      Размер файла:
      122,1 КБ
      Просмотров:
      19
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. mr_black_web

    mr_black_web Новичок

    С нами с:
    8 авг 2016
    Сообщения:
    3
    Симпатии:
    0
    Мне кажется, что в самом коде нет ошибок, по крайней мере на первый взгляд. У меня обычно, если ошибка в php коде пишет что то типа fatal error... , а для отображения ошибок в sql запросах использую mysqli->error. Думаю что ошибка в логике, правда не могу понять какая.
    Спасибо за ссылки, полезная инфа.

    Спасибо, хотя сейчас вроде говорят что лучше использовать PDO.
     
  4. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    @mr_black_web, Не все так говорят. :)
    Я, апример, люблю mysqli. И использую библиотеку SafeMySQL. Которая внутри в себе тоже использует mysqli. А разработчик этой библиотеки (phpfaq.ru) говорил несколько плохих слов о PDO.
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @mr_black_web тоже люблю mysqli. Хотя участь модератора обязывает рекомендовать и PDO :D А ещё люблю чтоб обломавшийся запрос вылетал исключением вверх.
     
  6. mr_black_web

    mr_black_web Новичок

    С нами с:
    8 авг 2016
    Сообщения:
    3
    Симпатии:
    0
    PDO вроде позволяет гораздо менее болезненно перейти с одной СУБД на другую, не знаю правда как часто такая потребность в переходе возникает, но по мне это большой плюс.

    Можете дать ссылку, хотелось бы почитать про минусы использования PDO.

    Не совсем понял, что Вы имели ввиду под "запрос вылетал исключением вверх". Вы про try/catch?

    Ребята, тема все еще актуально.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    именно про это
     
  8. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    @mr_black_web, да, PDO могёт работать с несколькими типами баз. Это, конечно, плюс. Только у меня в практике оказалась только одна маленькая задачка, чтобы перейти с MySQL на PostgreSQL. Всё. Да и потом, я использую библиотеку для работы с БД. Мне никто не мешает добавить в неё возможность работать с любой другой базой.

    Цитата с https://habrahabr.ru/post/165069/
    Причём, эти типизированные плейсхолдеры оказались довольно удобной штукой.