LinuxForum.Fans
Тема

Cookie-корзина на PHP

Автор: metra 15 сообщений 7378 просмотров
#217277

Мне нужно сделать корзину интернет-магазина на cookie'ах, т.е. без регистрации.

Теория: в куки надо вставлять значение-массив с двумя значениями - id товара и кол-во. Т.е. по сути cookie должна представлять собой двумерный массив.

Практика: все что смог сделать

text
<?php
    $i = 0;
    
    // Ищем, есть ли уже такой товар в корзине.
    do {
        $key = array_search($_POST['id'], $_COOKIE['cart['.$i.']']);
        $i++;
    } while ($key == false);
    
    // Если есть, то добавляем к счетчику кол-ва +1.
    if($key <> false) {
        $f = $_COOKIE['cart['.$key.'][1]']
        setcookie('cart['.$key.']', 'array[]',time()+(604800));
    }
?>

Вот именно на вставке кук я и застопорился (последняя осмысленная строчка кода не закончена) и голова пошла кругом. Подскажите, кто в курсе.

#217281

metra, для начала, проверь, есть у твоего посетителя кука? может это новый?

text
     // может юзер имеет куку?
     if(isset($_COOKIE['xid']))
     {

потом с ней работай:

text

     ·   $xid = $_COOKIE['xid'];

ну а если куки нет, то её сделай.

text
·   $xid = $remember ? md5("рррррр" . $date . $user_id) : NULL;
|    ·   if($xid)
|    ·   {
|    ·   ·   $xed = $date + COOKIE_EXPIRE;
|    ·   ·   setcookie('xid', $xid, $xed);
|    ·   }
|  
#217282

metra, кука == паспорт, который выдаёт клиенту твой сервер.

Если клиент успешно залогинился, ему следует дать куку.
Перед логином следует эту куку потребовать
Если она есть, то следует не логинить по новой, а работать с ним как со старым, ибо это СВОЙ.

#217287

drBatty,
Спасибо, но я спрашивал вообще не про это smile
Я не могу понять, как работать с двумерным массивом кукисов в контексте корзины интернет-магазина.

#217289

metra, зачем? храните свой массив в своей базе. А в куке только идентификатор к базе.

#217291

drBatty, т.е. вы предлагаете при заходе юзера на сайт давать ему уникальный ID в куки, а когда он добавляет товар в корзину - добавлять строчку в базу вида id | user_id | item_id ? Идея так-то...

#217301
metra написал:
т.е. вы предлагаете при заходе юзера на сайт давать ему уникальный ID в куки, а когда он добавляет товар в корзину - добавлять строчку в базу вида id | user_id | item_id ? Идея так-то...

ну да. чем это вам не нравится?

#217326

дядяБатя, спасибо, все работает как часы... Т.е. показывает время и тикает wink шучу)
Как мне эта идея в голову сразу не пришла - Х3 (хочу знать).

Кому интересно, вот код файла-обработчика запроса (клик по кнопке "Добавить в корзину"):

Показать
<?php

// Тут все настройки.
include("core.php");

session_start();

// Это моя функция, которая просто подключает скрипт к БД.
db_connect();

if(!isset($_COOKIE['id'])) {
$res = mysql_query("SELECT num FROM m_users WHERE id = '1'");
$obj = mysql_fetch_array($res, MYSQL_ASSOC);

setcookie ('id', $obj['num']+1, time()+315360000);
$e = $obj['num']+1;

mysql_query("UPDATE m_users SET num = '".($obj['num']+1)."' WHERE id =1;");
} else {
$e = $_COOKIE['id'];
}

$item = mysql_real_escape_string($_POST['id']);
$res1 = mysql_query("SELECT id, amount FROM m_orders WHERE item_id = '".$item."'");
if(mysql_num_rows($res1) > 0) {
$obj1 = mysql_fetch_array($res1, MYSQL_ASSOC);
mysql_query("UPDATE m_orders SET amount = '".($obj1['amount']+1)."' WHERE id = '".$obj1['id']."';");
} else {
mysql_query("INSERT INTO m_orders(item_id, user_id) VALUES('".$item."', '".$e."')");
}

Header("Location: ".$_SERVER['HTTP_REFERER']);
?>
#217328
metra написал:
дядяБатя

you make my day :D

#261622

как вариант: почему бы не использовать в качестве идентификатора, ip пользователя?

#261670
tiron_alexey написал:
как вариант: почему бы не использовать в качестве идентификатора, ip пользователя?

1. Топику уже полгода.
2. У меня статический IP. У меня дома потенциально в интернет могут зайти 6 устройств (плюс к файфай еще тыща друзей подключиться) Полезем разом, но каждый для себя заказывать на этот магазин.... И корзина будет общей.
3. Есть динамические ip. Есть шибко умные провайдеры имеющие дурную привычку делать периодический рекконект.......

И нафига все это?

#261671
voral написал:
[quote=tiron_alexey]как вариант: почему бы не использовать в качестве идентификатора, ip пользователя?

1. Топику уже полгода.
2. У меня статический IP. У меня дома потенциально в интернет могут зайти 6 устройств (плюс к файфай еще тыща друзей подключиться) Полезем разом, но каждый для себя заказывать на этот магазин.... И корзина будет общей.
3. Есть динамические ip. Есть шибко умные провайдеры имеющие дурную привычку делать периодический рекконект.......

И нафига все это?[/quote]

Да человек знает все это, просто сообщения набивает.

#261749
"voral" написал:
Полезем разом, но каждый для себя заказывать на этот магазин.... И корзина будет общей.

А какова вероятность того, что вместе полезете?:)

"metra" написал:
Да человек знает все это, просто сообщения набивает.

Не нужно мне сообщения набивать.
Прост столкнулся с похожим вопросом, подумал, что можно попробовать таким образом реализовать.

#261769
"tiron_alexey" написал:
А какова вероятность того, что вместе полезете?:)

Вы знаете я по опыту разработки приложений знаю: если есть вероятность, что определенная ситуация "врятли сложится, но может".... Она точно сложится.
Ну а про ситуацию с одним IP вообще легко. Возьмем не меня, а большую фирму с кучей компьютеризированных клерков :) Ну прикиньте, Вася в курилке показываете новый айфон и говорит, что купил его "прям через интернет, да в 10 раз дешевле". А все друзья тоже мечтают об этом гаджете. Ну и? А плох тот магазин, который не мечтает о таких ситуациях. :)

В случае динамического IP ситуация еще интереснее. По большому счету эта идентификация только на один сеанс работы посетителя. Тогда вообще теряет смысл эта привязка по IP. Т.к. есть переменные сессии, идентификатор сессии.

#261812

я уже на сообщении:

"voral" написал:
Полезем разом, но каждый для себя заказывать на этот магазин.... И корзина будет общей.
был согласен, что этот подход не совсем хорош, но эго заставило "холивариться" до конца :)
Спасибо за помощь
Войдите или зарегистрируйтесь, чтобы ответить.