Удаление товара из корзины

У меня есть функция корзины покупок на моем веб-сайте, и я могу добавлять товары в корзину и удалять все товары, кроме первого, помещенного в корзину. Когда я нажимаю «удалить», страница перезагружается, но товар все еще находится в корзине. Любой другой товар, добавленный в корзину, будет удален, кроме первого. Вот мой код добавления в корзину:

<?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')
?>

Что получается из $_SESSION['cart'], когда у вас есть 1 предмет? При использовании isset вам не нужен !empty.

chris85 22.04.2018 21:43

Вы уверены, что правильно обновляете сеанс? Вам нужно будет отладить и посмотреть, правильно ли вычислен $itemids и назначен ли сеансу.

tadman 22.04.2018 21:43

Это нет - хороший способ хранить товары в тележке. Почему вы сохраняете их как строку и делаете все эти implode и explode? Просто сохраните их в массиве (или, что еще лучше, в постоянном хранилище в виде базы данных).

elixenide 22.04.2018 21:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
960
1

Ответы 1

Как отмечали люди в комментариях, есть более эффективные способы управления тележками. Обычно веб-сайты хранят тележки в базе данных своих серверов с помощью таких сервисов, как 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');
?>

Другие вопросы по теме