За последние 24 часа нас посетили 17494 программиста и 1725 роботов. Сейчас ищут 1527 программистов ...

Добавление в таблицу избранного PHP,SQL

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

Метки:
  1. scared1995

    scared1995 Новичок

    С нами с:
    14 авг 2020
    Сообщения:
    6
    Симпатии:
    1
    Я начинающий прогер и работаю джуном всего неделю.У меня стоит задача сделать "Избранное" на сайте.С помощью сессий я сделал сохранение флага в сессии

    PHP:
    1. if (empty($_SESSION['favorite'][(int)$_POST['id']])) {
    2.     $_SESSION['favorite'][(int)$_POST['id']] = 1;
    3. } else {
    4.     unset($_SESSION['favorite'][(int)$_POST['id']]);
    5. }
    Сейчас стоит задача : Товар добавлен в избранное если он добавлен через сессию, либо есть строчка в этой табличке.
    т.е. нужно при записи писать и в сессию, и в БД. а при чтении работает условие или.

    Я реализовал это следующим образом,но работает некорректно, при неоднократном обновлении страницы ,строчки в таблице дублируются и если убрать флажок избранного на странице товара и перейти обратно в каталог товаров,то товар останется выделен Избранным и не будет удален из таблицы, удален будет только тогда когда я перезагружу страницу.Надеюсь доходчиво объяснил. Помогите пожалуйста у меня мало опыта,а проект очень большой. Подумываю может даже о найме и сотрудичестве с ментором.

    Код на странице каталога товаров(директиву не прикрепляю)
    PHP:
    1.         <div class="favoriteContainer" vg-favorite data-id="<?= $good['id'] ?>" data-is-full="true"
    2.              data-is-favorite="<?= $_SESSION['favorite'][$good['id']] ?>"></div>
    Код на странице товара:

    PHP:
    1. <div vg-favorite data-id="<?= $id ?>" data-is-full="true"
    2.                      data-is-favorite="<?= !empty($_SESSION['favorite'][$id]) ?>"></div>
    3.                 <div>
    PHP код :
    PHP:
    1. $favorite = $_SESSION['favorite'][$id];
    2. $userId = $_SESSION['currentUser'];
    3. $favoriteCatalog = $_SESSION['favorite'][$good['id']];
    4. $goodId = $good['id'];
    5.  
    6. if (empty($_SESSION['favorite'][(int)$_POST['id']])) {
    7.     $_SESSION['favorite'][(int)$_POST['id']] = 1;
    8.     if (empty($favorite)) {
    9.         mysqli_query(DB::db(), "DELETE FROM users_goods WHERE GOOD_ID = '$id'");
    10.     } else {
    11.         mysqli_query(DB::db(), "INSERT INTO users_goods (GOOD_ID,USER_ID) VALUE ('$id','$userId')");
    12.     }
    13.     if (empty($favoriteCatalog)) {
    14.         mysqli_query(DB::db(), "DELETE FROM users_goods WHERE GOOD_ID = '$goodId'");
    15.     } else {
    16.         mysqli_query(DB::db(), "INSERT INTO users_goods (GOOD_ID,USER_ID) VALUE ('$goodId','$userId')");
    17.     }
    18. } else {
    19.     unset($_SESSION['favorite'][(int)$_POST['id']]);
    20. }
     
    #1 scared1995, 14 авг 2020
    Последнее редактирование модератором: 14 авг 2020
  2. denis01

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

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

    Надо делать отладку, чтобы выяснить в чём причина
     
    scared1995 нравится это.
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Выглядит грязно. Сессия не нужна. И, сдаётся мне, не надо в одном обработчике и удалять, и добавлять.

    Сделай два "экшена": для добавления и для удаления из избранного. Передавай туда нужные параметры НЕ через сессию, а через $_GET или $_POST.
     
  4. scared1995

    scared1995 Новичок

    С нами с:
    14 авг 2020
    Сообщения:
    6
    Симпатии:
    1
    У меня есть только 1 коллега и он же мой босс, который поставил данную задачу и отказал в помощи , сказав : "Думай.Нужно сделать"
    --- Добавлено ---
    Я бы с радостью,но мне сказано сделать именно таким образом, а по скольку я неопытен, знаний не так много и это моя первая работа программистом, то выбора у меня нету,как только делать,то что мне говорят....
     
    denis01 нравится это.
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Подозреваю, что имелось в виду зависимость от авторизации.
     
  6. scared1995

    scared1995 Новичок

    С нами с:
    14 авг 2020
    Сообщения:
    6
    Симпатии:
    1
    Реализовано следующим образом


    $id = (int)$_POST['id'];

    $user = User::user();

    if (empty($_SESSION['favorite'][$id])) {

    $_SESSION['favorite'][$id] = 1;

    if( !empty( $user ) ){

    mysqli_query(DB::db(), "INSERT INTO users_goods (GOOD_ID,USER_ID) VALUE ('$id','$user[id]')");
    }

    } else {

    unset($_SESSION['favorite'][$id]);

    if( !empty( $user ) ){

    mysqli_query(DB::db(), "DELETE FROM users_goods WHERE GOOD_ID = '$id' AND USER_ID = " . $user['id']);
    }
    }