Почему не удаляется куки?

mosquito

Новичок
Почему не удаляется куки?

Я делаю корзину товаров на куках.

Корзина сделана так:
$_COOKIE[name[]] - имена товаров
$_COOKIE[price[]] - цены товаров

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

PHP:
 $name = $_POST['name'];
 $price = $_POST['price'];
      
      // Проверка на наличие счетчика
      if (!isset($_COOKIE['counter']))
      {
         setcookie("counter" , 0);
      }
      $counter = $_COOKIE['counter'];
      setcookie("name[$counter]", $name, time()+3600*48);
      setcookie("price[$counter]", $price, time()+3600*48);
      // инкремент счетчика
      ++$counter;
      setcookie("counter",  $counter, time()+3600*48);
с этим все нормально

а вот с удалением конкретного товара из корзины проблемы:
возле каждого товара есть ссылка "удалить из корзины" в виде:
url?action=del&id='номер элемента в массиве $_COOKIE[name[]]'

PHP:
if (isset($_GET['action']) AND isset($_GET['id']) AND $_GET['action'] == 'del')
{
   $counter= $_COOKIE['counter'];
   $num = $_GET['id'];
   setcookie("$name[$num]", "", time() - 3600*48);
   setcookie("$price[$num]", "", time() - 3600*48);

   --$counter;
   setcookie("counter",  $counter);
}
После удаления какого-либо элемента из корзины получается, что элемент не удалился, вернее удалились только значения

Показываю корзину так:
PHP:
if (isset($_GET['action']) AND $_GET['action'] == 'show')
{
   if (isset($_COOKIE['name']))
      $names = $_COOKIE['name'];
   
   if (isset($_COOKIE['price']))
      $prices = $_COOKIE['price'];
   
   $counter = $_COOKIE['counter'];

   if ($counter != 0)
   {
       for($y=0; $y<$counter; $y++)
      {
        echo($names[$y]." ".$prices[$y]." ".<a href=basket.php?action=del&id=".$y.">Удалить из корзины</a>");
      }
      foreach($prices as $p=>$price)
      {
          $prices[$p] = intval($price);
      }
      echo("Товаров в корзине: ".$counter);
      echo("Итого: ".array_sum($prices));
   }
   else
      echo("корзина пуста");
}
 

DimbIch

Новичок
mosquito
вообще делать корзину на куках не советую.....
потому как потенциально больше возможностей взломать

имхо лучше делать корзины так...
1. основываясь на сессии... толи писать в базу что в корзину у юзера толи сразу в сессию...

НО пистаь нужно ТОЛЬКО ИД и количество товара ...
а когда выводишь корзину надо пересчитывать все из базы КАЖДЫЙ раз.. так ты убережешь себя от взлома хоть как то :)

а на счет ошибки ZPS прав... имхо
 

mosquito

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

Проблема с удалением осталась
к примеру: забил я в корзину 3 товара:

$_COOKIE[name[0]] = "tovar1";
$_COOKIE[price[0]] = 200;

$_COOKIE[name[1]] = "tovar2";
$_COOKIE[price[1]] = 300;

$_COOKIE[name[2]] = "tovar3";
$_COOKIE[price[2]] = 500;

print_r($_COOKIE):
Array ( [counter] => 3 [name] => Array ( [0] => tovar1 [1] => tovar2 [2] => tovar3 ) [price] => Array ( [0] => 200 [1] => 300 [2] => 500 ) )
все добавилось, нормально.

Теперь удаляю tovar2
basket.php?action=del&id=1

print_r($_COOKIE):
Array ( [counter] => 2 [name] => Array ( [0] => tovar1 [2] => tovar3 ) [price] => Array ( [0] => 200 [2] => 500 ) )
удалилось, спасибо

теперь снова добавляю tovar2
print_r($_COOKIE):
Array ( [counter] => 3 [name] => Array ( [0] => tovar1 [2] => tovar2 ) [price] => Array ( [0] => 200 [2] => 300 ) )
что случилось?
 

DimbIch

Новичок
mosquito
все логично.....
ты добавил tovar2 в name[2] вот и все..
увеличь счетчик...
 

mosquito

Новичок
DimbIch
только хотел тоже самое написать =)) догадался

тогда получается, что надо при удалении заново собирать массивы $_COOKIE[name[]] && $_COOKIE[price[]] в соответствии с номерами id, т.е. чтобы было по очереди 0,1,2, ... ???

-~{}~ 31.10.04 17:13:

или на ряду с counter вести еще и уникальный id, который будет увел-ся независимо от того удалили товар или добавили?

-~{}~ 31.10.04 17:24:

Ага, я все понял.
сделал counter уникальным идентификатором
а кол-во товаров в корзине считаю как count($_COOKIE[name])

ВСЕМ СПАСИБО =))
 

ZPS

electronics
У меня не стоит проблема защиты корзины, потому что она нужна только для подсчета стоимости товаров, инет-магазина как такового там нет.
не верный подход. нужно следить за безопасностью каждого скрипта не зависимо от того чем он занимается. Иначе проблемы могут появиться позже.
но это так... оффтопик.
 

Cid

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

DimbIch

Новичок
Cid
вот у него есть чего ломать :))
у него цена береться из базы и храниться в куке...
куку переписал и у тебя уже другая цена...
т.е. у него цена не обновляеться из базы каждый раз...
 

Cid

...двинутый новичок
Да, и действительно...

mosquito

setcookie("price[$counter]", $price, time()+3600*48);

никогда так не делай больше.

Храни только ID товара и количество. А при каждом показе страницы с корзиной пересчитывай общую стоимость в соответствие со значением цены из базы.
 

Cid

...двинутый новичок
Для пущего эффекту :) Копирайт не трогаем-с :)
 

mosquito

Новичок
Спасибо за советы, но как я уже говорил корзина нужна не для покупки через интернет, а просто для подсчета стоимости выбранных из каталога товаров по наличному расчету + подсчет стоиомсти по кредиту.
Т.е. никаких лишних примочек, тпиа хранения id и повышенной безопасности мне сейчас не надо. Но на будущее учту. Еще раз спасибо =)

Сабж темы продолжается =)) не удаляется нулевые элементы $_COOKIE[name[0]] и $_COOKIE[price[0]] из корзины при очистке всей корзины.

Вот так я очищаю корзину:
PHP:
// --------- Удаление все товары из корзины ------------

if (isset($_GET['action']) AND $_GET['action'] == 'delall')
{
   setcookie("counter", 0, time() + 3600*48);
   setcookie("kolvo", 0, time() + 3600*48);
 
   foreach($_COOKIE[name] as $n=>$name)
   { 
      setcookie("name[$n]", "", time() - 3600*48);
      setcookie("price[$n]", "", time() - 3600*48);
   }

   // пробовал даже так:
   //setcookie("name[0]", "", time() - 3600*48);
   //setcookie("price[0]", "", time() - 3600*48);

}
print_r($_COOKIE):
Array ( [counter] => 4 [kolvo] => 1 [name] => Array ( [0] => tovar3 ) [price] => Array ( [0] => 500 ) [PHPSESSID] => b931165e794dfd3ad0c0563488c72737 )

почему так?
 

Фанат

oncle terrible
Команда форума
потому, что кто-то дает кукам идиотские имена и при этом не может элементарно отладить свою программу.

СИЛ НЕТУ НА ЭТОТ ТОПИК СМОТРЕТЬ.

-~{}~ 01.11.04 11:43:

Чудило, если у тебя сессия есть - в ней не пробовал держать?
 

mosquito

Новичок
Фанат

Чудило, если у тебя сессия есть - в ней не пробовал держать?
Моя проблема изложена постом выше. А сессия у меня используетя исключительно для админской части сайта.

потому, что кто-то дает кукам идиотские имена
почесу идиотские? да и при чем здесь это?

з.ы. очень интеренсый стиль общения у модератора с незнакомыми людьми...
... наверно, бывает и такое...
 

Фанат

oncle terrible
Команда форума
Да, проблемы модератора у нас главные :)
Все решили, все сделали - сталось модератора обсудить. Больше нечего.
 
Сверху