Дублирование значений и удаление значений переменной сессии

PapaKitson

Новичок
Дублирование значений и удаление значений переменной сессии

В процессе написания скрипта с использованием PHP + MySQL для интернет магазина понадобилось написать модуль корзины покупок.
Это подразумевает следующие функции: добавление товара в корзину, удаление товара из корзины + еще несколько фичей с которыми проблем не возникло. Корзина построена с использованием механизма сессий и работает следующим образом:

- клиент видит изображение товара + описание + цену. Для того чтобы добавить товар в корзину он кликает по кнопке "ADD TO CART".
Происходит добавление значения в определенную переменную сессии. Ну и далее в том же духе ... в процессе чего формируется массив значений переменной сессии с идентификаторами продуктов. Тут проблем собственно тоже не возникло.

НО! Если к примеру клиент щелкнул по одному и тому же товару несколько раз - этот товар столько раз и добавляется в корзину, т.е. идет дублирование однотипного товара, что и является первой проблемой, помочь в решении которой я и прошу. Теперь это все в коде:

Когда клиент щелкает по кнопку добавления, в адресной строке прописывается следующее:

_http://www.ХХХ.com/cart.php?add=18&PHPSESSID=06216ff994e8879fbb2e48e611c00927

в ней, add=18 - это добавление в корзину товара с идентификатором 18. Идентификатор получаеи из таблицы базы данных MySQL

Код в скрипте, отвечающий за добавление товара приведен ниже

PHP:
session_start();


  if (isset($add))
    	{
            //***********************************************************


            if (!isset($_SESSION["products"]))
            {
                $_SESSION["products"] = array();

            }
                $_SESSION["products"][] = $add;

            //***********************************************************
        }
Короче говоря в переменную сесии "products" записывается новое значение из $add

Вот именно здесь и надо прописать код, который бы отвечал за контроль дублей продуктов, т.е. если пользователь еще раз или десять раз решил бы добавить товар с идентификатором 18, он в корзину бы не добавлялся, т.е. в переменной сессии не было бы нескольких значений 18.


Следующая проблема - когда мы уже имеем сформированную корзину продуктов, т.е. массив значений переменной "products", пользователь к примеру передумал, и решил некий продукт из корзины удалить.
По идее решение проблемы сводится к удалению из массива определенного указанного значения. Замечу, что массив состоит из т.н. ключа + значение:
(key + value). Так вот надо некое значение из массива и удалить.

Теперь в коде - возле каждого продукта имеется ссылка DELETE. После клика по такой ссылке в адресной строке прописывается следующее

_http://www.ХХХ.com/cart.php?del=14&PHPSESSID=06216ff994e8879fbb2e48e611c00927

В ней del=14 - это признак удаления из корзины товара с идентификатором 14

PHP:
        if (isset($del))
    	{

        	unset($_SESSION["products"][$del]);

        }
Вот это я собственно только и написал, посему понял, что чтото делаю не то, так как "[$del]" в данном случае читается скриптом как ключ а не значение. Ну и естественно товар с номером 18 не удаляется...

Поскольку с сессиями у меня всегда бошка не дружила :) я полез в мануал. Но мануал ничего нового мне не дал.

-~{}~ 02.10.05 16:57:

С первой частью вопроса уже разобрался самостоятельно ...
Осталась вторая - удаление ...
 

sayber

Новичок
Чтобы исключить дубликаты, при добавлении товара можно воспользоваться функцией in_array:

if(!in_array($add, $_SESSION['products'])) {
array_push($_SESSION['products'], $add);
}

Для удаления позиции нужно найти сначала ключ значения

$key=array_search($del, $_SESSION['products']);
а потом уже удалять
unset($_SESSION["products"][$key]);
 

PapaKitson

Новичок
Удаление работает не совсем так как хотелось бы.
К примеру есть массив значений в виде:

ключ / значение
[0] = 18
[1] = 19
[2] = 20

При использовании предложенного варианта

$key=array_search($del, $_SESSION['products']);
unset($_SESSION["products"][$key]);

замечены проблемы ...

Вот только что додумался прописать в скрипт принт результатов обработки на экран и вот чего получается:

До запуска процесса удаления имеем:

PHP:
print_r($_SESSION["products"]);
Результат "Array ( [0] => 18 [1] => 19 [2] => 20 )"
т.е. ключам 0, 1, 2 прописаны соответственно продукты 18,19,20.

Удаляем продукт 19 - в коде это я так понимаю выглядит так

PHP:
// ***** уже подставлены значения

1=array_search(19, $_SESSION['products']);
unset($_SESSION["products"][1]);
Результат после удаления "Array ( [0] => 18 [1] => 20 )"


Все вроде правильно и отлично ...

НО! Если раньше на странице отображалось 3 продукта, то после удаления отображается всего один с номером 18 вместо должных двух - 18-го и 20-го.

Кстати, если обновить страницу нажатием кнопки в браузере Рефреш, выдается интересный результат:

Array ( [0] => 18 [2] => 20 )


Т.е. имеем дырку в виде первого ключа ...

Что посоветуете уважаемые знатоки ...
 

alexhemp

Новичок
Храните корзину в сессии в виде
идентификатор товара => количество

Тогда несложно проверять есть ли товар в таблице, не будет дублей. Для запроса можно взять все идентификаторы ф-цией array_keys

Добавление товара элементарно

$_SESSION["products"][$add] = 1;

Если таки решите в будущем разрешить клиенту заказывать 2 и более товара одного наименования (что вообще-то норма), то измените код на

$_SESSION["products"][$add]++;

И главное при таком подходе не нужно ничего в массиве искать.
 

PapaKitson

Новичок
Ребята, с добавлением и дублированием проблемы уже нет. Как я написал в конце первого поста - с добавлением и дублями уже разобрался самостоятельно.

Нужно вот эту проблему с удалением решить - второй мой пост в этом топике ...
 

crocodile2u

http://vbolshov.org.ru
PapaKitson
А может быть, все же прислушаться к совету? Ведь так же лучше будет. И удобнее...
Я имею в виду совет alexhemp.
 

PapaKitson

Новичок
2 crocodile2u - В моем случае использовать ассоциативный массив, думаю, не имеет смысла, т.к. магазин специфический и количество товара одного типа всегда равно единице. Т.е., например, чайник может быть положен в корзину только один ... фонарик - тоже только один и т.д.
Хотя совет от alexhemp заслуживает внимания - я согласен - он проще от того что я пытался сотворить :).

Подожду еще чуток - если никто ничего не предложит в плане по сдвигу ключей, то задействую предложенное alexhemp.
 

alexhemp

Новичок
PapaKitson

Ничего проще ты не придумаешь, не пытайся. Сделай по человечески. И потом это ты сейчас думаешь что товаров будет 2, потом может все поменяться.
 

PapaKitson

Новичок
Ребяты, всем огромное спасибо! Попробовал в двух вариантах - оба работают отлично!

Еще раз благодарю всех кто приобщился к решению проблемы!
 
Сверху