У меня есть функция корзины покупок на моем веб-сайте, и я могу добавлять товары в корзину и удалять все товары, кроме первого, помещенного в корзину. Когда я нажимаю «удалить», страница перезагружается, но товар все еще находится в корзине. Любой другой товар, добавленный в корзину, будет удален, кроме первого. Вот мой код добавления в корзину:
<?php
session_start();
if (isset($_GET['id']) & !empty($_GET['id'])){
if (isset($_SESSION['cart']) & !empty($_SESSION['cart'])){
$items = $_SESSION['cart'];
$cartitems = explode(",", $items);
if (in_array($_GET['id'], $cartitems)){
header('location: cartIndex.php?status=incart');
}else{
$items .= "," . $_GET['id'];
$_SESSION['cart'] = $items;
header('location: cartIndex.php?status=success');
}
}else{
$items = $_GET['id'];
$_SESSION['cart'] = $items;
header('location: cartIndex.php?status=success');
}
}else{
header('location: cartIndex.php?status=failed');
}
?>
А вот мой код удаления из корзины:
<?php
session_start();
$items = $_SESSION['cart'];
$cartitems = explode(",", $items);
if (isset($_GET['remove']) & !empty($_GET['remove'])){
$delitem = $_GET['remove'];
unset($cartitems[$delitem]);
$itemids = implode(",", $cartitems);
$_SESSION['cart'] = $itemids;
}
header('location:cart.php')
?>
Вы уверены, что правильно обновляете сеанс? Вам нужно будет отладить и посмотреть, правильно ли вычислен $itemids и назначен ли сеансу.
Это нет - хороший способ хранить товары в тележке. Почему вы сохраняете их как строку и делаете все эти implode и explode? Просто сохраните их в массиве (или, что еще лучше, в постоянном хранилище в виде базы данных).






Как отмечали люди в комментариях, есть более эффективные способы управления тележками. Обычно веб-сайты хранят тележки в базе данных своих серверов с помощью таких сервисов, как MySQL или MongoDB, а затем выполняют вызовы XHR / AJAX для их обновления, когда продукт добавляется или удаляется из корзины. Но это ни здесь, ни там, вы хотите исправить свой код, поэтому я помогу с этим.
Проблема, с которой вы, скорее всего, столкнулись (я говорю, скорее всего, потому что трудно сказать, когда это может быть множество других вещей, связанных с самими значениями GET), связана с этой строкой:
unset($cartitems[$delitem]);
При этом выполняется поиск в массиве элемента $delitem в качестве ключа, а не значения, которое вы хотите сделать. Я предполагаю, что идентификатор $delitem, который вы пытаетесь удалить, равен 1, верно? Ну, массивы начинаются с 0, что означает, что он удаляет элемент во втором месте, а не элемент, идентификатор которого совпадает с $delitem.
Код, который я добавил:
if (($key = array_search($delitem, $cartitems)) !== false) {
unset($cartitems[$key]);
}
array_search() возвращает ключ найденного элемента, который можно использовать для удаления этого элемента из исходного массива с помощью unset(). Он вернет FALSE в случае ошибки, однако он может вернуть значение false-y в случае успеха (например, ваш ключ может быть равен 0), поэтому используется оператор строгого сравнения !==.
Оператор if () проверяет, вернула ли array_search () значение, и выполнит действие только в том случае, если оно вернулось.
Полный новый код:
<?php
session_start();
$items = $_SESSION['cart'];
$cartitems = explode(",", $items);
if (isset($_GET['remove']) & !empty($_GET['remove'])){
$delitem = $_GET['remove'];
if (($key = array_search($delitem, $cartitems)) !== false) {
unset($cartitems[$key]);
}
$itemids = implode(",", $cartitems);
$_SESSION['cart'] = $itemids;
}
header('location:cart.php');
?>
Что получается из
$_SESSION['cart'], когда у вас есть 1 предмет? При использованииissetвам не нужен!empty.