Добавление в таблицу избранного PHP,SQL
Я начинающий прогер и работаю джуном всего неделю.У меня стоит задача сделать "Избранное" на сайте.С помощью сессий я сделал сохранение флага в сессию с помощью PHP.Работает он правильно.Код ниже:
if (empty($_SESSION['favorite'][(int)$_POST['id']])) {
$_SESSION['favorite'][(int)$_POST['id']] = 1;
} else {
unset($_SESSION['favorite'][(int)$_POST['id']]);
}
Сейчас стоит задача : Товар добавлен в избранное если он добавлен через сессию, либо есть строчка в этой табличке. т.е. нужно при записи писать и в сессию, и в БД. а при чтении работает условие или.
Я реализовал это следующим образом,но работает некорректно, при неоднократном обновлении страницы ,строчки в таблице дублируются и если убрать флажок избранного на странице товара и перейти обратно в каталог товаров,то товар останется выделен Избранным и не будет удален из таблицы, удален будет только тогда когда я перезагружу страницу.Надеюсь доходчиво объяснил. Помогите пожалуйста у меня мало опыта,а проект очень большой. Подумываю может даже о найме и сотрудичестве с ментором.
Код на странице каталога товаров (директиву не прикрепляю)
<div class="favoriteContainer" vg-favorite data-id="<?= $good['id'] ?>" data-is-full="true"
data-is-favorite="<?= $_SESSION['favorite'][$good['id']] ?>"></div>
Код на странице товара:
<div vg-favorite data-id="<?= $id ?>" data-is-full="true"
data-is-favorite="<?= !empty($_SESSION['favorite'][$id]) ?>"></div>
<div>
PHP код
$favorite = $_SESSION['favorite'][$id];
$userId = $_SESSION['currentUser'];
$favoriteCatalog = $_SESSION['favorite'][$good['id']];
$goodId = $good['id'];
if (empty($_SESSION['favorite'][(int)$_POST['id']])) {
$_SESSION['favorite'][(int)$_POST['id']] = 1;
if (empty($favorite)) {
mysqli_query(DB::db(), "DELETE FROM users_goods WHERE GOOD_ID = '$id'");
} else {
mysqli_query(DB::db(), "INSERT INTO users_goods (GOOD_ID,USER_ID) VALUE ('$id','$userId')");
}
if (empty($favoriteCatalog)) {
mysqli_query(DB::db(), "DELETE FROM users_goods WHERE GOOD_ID = '$goodId'");
} else {
mysqli_query(DB::db(), "INSERT INTO users_goods (GOOD_ID,USER_ID) VALUE ('$goodId','$userId')");
}
} else {
unset($_SESSION['favorite'][(int)$_POST['id']]);
}
Ответы (2 шт):
Накидал пример на коленке. Переделаете, проверите на ошибки, доведете до ума и закончите мысль уже самостоятельно. Максимум для чего я бы юзал сессию - для хранения идентификатора авторизованного юзера для сравнений и проверок..но не для другого
Страница с товаром
<?
//проверяете, есть ли данный артикул у юзера в избранных. Если нет, то
echo '<button class="add" data-article="2212">Добавить в избранное</button>';
//Иначе
echo '<button class="remove" data-article="2212">Удалить из избранных</button>';
?>
JS НА СТРАНИЦЕ С ТОВАРОМ
$('.add').click(function(){
var article = $(this).attr('data-article');
addRelated(article);
});
function addRelated(article) {
var uid = "<?= $ИДЕНТИФИКАТОР_ТЕКУЩЕГО_ЮЗЕРА ?>";
var article = article;
var url = "ПУТЬ_ДО_ОБРАБОТЧИКА"
$.ajax({
url: url,
type: "POST",
dataType: "json",
cache: 0,
data: {
"uid": uid,
"action" : "addRelated",
"article": article,
},
success: function(data) {
if (data.error == false)
{
console.log(data.message); //Сообщение без ошибки выводится в консоль
разработчика.
// тут же если необходимо, визуальные красоты делаете.. меняете
содержимое и т.п.
}else{
console.log(data.message); //Сообщение с ошибкой
}
},
error: function(data) {}
})
}
PHP обработчик
// Углубляться не буду. По основам
// Представим, что наш $_POST['uid'],$_POST['article'] состоит только из целых чисел.
// Как вариант, экранируем через preg_replace. В данном примере удалятся абсолютно все символы, кроме цифр..
$uid = preg_replace('/[^\d]/u', '',$_POST['uid']);
$article = preg_replace('/[^\d]/u', '',$_POST['article']);
if ($_POST['action'] == 'addRelated') //Если мы добавляем в избранное
{
$bds = new mysqli(...);
// Теперь, зная о том, какой пользователь нажал кнопку и какой артикул товара он хочет добавить в избранное, действуем.
// Для примера я буду писать все в 1 ячейку столбца, хотя, это не всегда хорошее действие...но для примера подойдет
// Сначала достаем все данные с ячейки и делаем строку массивом
$query = $bds->query("SELECT related FROM users WHERE user_id='$uid'");
$getArray = $query->fetch_array();
$getRelatedList = explode(',',$getArray[0]);
//Проверяем, нет ли такого товара уже в избранных, чтобы нельзя было дублировать и т.п.
if (!in_array($article,$getRelatedList))
{
array_push($getRelatedList,$article); //Добавляем данный артикул в массив избранных
$getList = implode(',',$getRelatedList); //Делаем из массива обратно строку
$bds->query("UPDATE users SET related='$getList' WHERE user_id='$uid'");
//Возвращаем уведомление юзеру, что все ок
echo json_encode(['error'=>false,'message'=>'Товар добавлен в избранное']);
return;
}else{
//Возвращаем ошибку, что товар уже есть
echo json_encode(['error'=>true,'message'=>'Товар уже был добавлен ранее']);
return;
}
}
В общем реализовано таким образом:
$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']);
}
}