Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: подскажите алгоритм запоминания последних просмотренных товаров
 
 автор: elenaki   (16.12.2010 в 10:02)   письмо автору
 
 

во время просмотра юзером товаров в магазине надо запоминать, какие товары он посмотрел, т.е. сходил на страницу конкретного товара.

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

делаю так: на странице товара (view_prod.php) устанавиваю куки:

$var = compact(intval($_GET["prod_id"]), $_SESSION["userid"], $_SESSION["interface_lang"],  mktime());
$arr = implode("&", $var);
setcookie('views', $arr, time()+86400); ///sytki


на других страницах, где мне надо, вытаскиваю куки, разбираю их и вывожу данные соответствующих товаров.

    if ($_COOKIE["views"]){
        $arr =explode("&", $_COOKIE["views"]);
        
        if (is_array($arr)) {
            for ($i=0; $i<sizeof($arr);$i++) {
                                     $prodid_v[$i]= $arr[0];
                $userid_v[$i] = $arr[1];
                $lang_v[$i] = $arr[2];
                $date_v[$i] = $arr[3];
                
                
        
        if ($userid_v[$i] == $_SESSION["userid"] && ((mktime() - $date_v[$i]) <= 86400)) {    /// esli sovpadaet user i ne proshel den'
.....


только куки почему-то не устанавливаются ... соответственно и товар не вытаскивается...

  Ответить  
 
 автор: Trianon   (16.12.2010 в 12:24)   письмо автору
 
   для: elenaki   (16.12.2010 в 10:02)
 

compact() ,если это стандартная функция, как я понимаю, вернет пустой массив.
Она ведь значения переменных по их именам вытаскивает...

$arr в результате окажется пустой строкой,
setcookie будет вызвана с пустым значением.

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

  Ответить  
 
 автор: Trianon   (16.12.2010 в 13:36)   письмо автору
 
   для: Trianon   (16.12.2010 в 12:24)
 

Очень упрощенно, я бы сделал как-то так:
<?

$user 
$_SESSION['userid'];      // ключ клиента

$old_goods = @$_COOKIE['goods'][$user];                      // товары, ранее просматривавшиеся 
if(!empty($old_goods))$old_goods explode(','$old_goods); // этим клиентом (если есть)

$new_goods = array(......);  // товары, просмотренные в данном сеансе (из прайса) 

if(empty($old_goods)) $old_goods = array();  // сливаем массивы, убирая дубли
$o_goods implode(','array_unique(array_merge($old_goods$new_goods)));

setcookie("goods[$user]",$o_goodstime()+24*60*60);  // запоминаем под этим клиентом

  Ответить  
 
 автор: elenaki   (16.12.2010 в 14:05)   письмо автору
 
   для: Trianon   (16.12.2010 в 13:36)
 

спасибо. куки записались. Ho при попытке вывести из них данные намертво завис браузер. где-то с циклами напортачила..

  Ответить  
 
 автор: Trianon   (16.12.2010 в 14:38)   письмо автору
 
   для: elenaki   (16.12.2010 в 14:05)
 

тут, правда, такой аспект еще есть...
Если клиент заходит чаще раза в сутки, эти товары будут копиться не устаревая.
Если нужно , чтобы товары устаревали, придется делать не двумерный (пользователь, набор_товаров), а трехмерный (пользователь, время, набор_товаров)

  Ответить  
 
 автор: elenaki   (16.12.2010 в 14:55)   письмо автору
 
   для: Trianon   (16.12.2010 в 14:38)
 

я же саму куку храню сутки. вот за сутки и пусть накапливаются.

  Ответить  
 
 автор: Саня   (16.12.2010 в 15:25)   письмо автору
 
   для: elenaki   (16.12.2010 в 14:55)
 

В куках не может храниться большое количество информации. Говорят не более 64 КБ. А если пользователь настолько активен, что за сутки превысит этот предел?

  Ответить  
 
 автор: Trianon   (16.12.2010 в 15:50)   письмо автору
 
   для: elenaki   (16.12.2010 в 14:55)
 

>я же саму куку храню сутки. вот за сутки и пусть накапливаются.
да. Но из вчера установленной куки (которая сегодня еще читается, а завтра уже не должна) попадут товары в куку сегодня установленную (которая еще будет читаться завтра)
Так что метки придется все же держать.
И здесь проблема в том, что метки времени более громоздкие, чем сами ключи.
Если бы можно было ослабить ограничение суточного хранения, например, так:

пользователю видны товары, которые он смотрел в пределах 1-2 суток,

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

  Ответить  
 
 автор: sim5   (16.12.2010 в 14:39)   письмо автору
 
   для: elenaki   (16.12.2010 в 14:05)
 

И до какого максимума будут накапливаться товары?

  Ответить  
 
 автор: Саня   (16.12.2010 в 14:59)   письмо автору
 
   для: elenaki   (16.12.2010 в 10:02)
 

Я бы порекомендовал хранить это не "снаружи", а "внутри" (в базе данных на сервере, например). Это более контролируемое решение и может быть полезно в будущем при анализе пользовательских предпочтений или чего-то ещё.

  Ответить  
 
 автор: elenaki   (16.12.2010 в 15:20)   письмо автору
 
   для: Саня   (16.12.2010 в 14:59)
 

нет. базу я сразу отмела. зачем мне этот мусор?

  Ответить  
 
 автор: Саня   (16.12.2010 в 15:24)   письмо автору
 
   для: elenaki   (16.12.2010 в 15:20)
 

Сейчас это мусор, а завтра нет.

  Ответить  
 
 автор: elenaki   (16.12.2010 в 15:25)   письмо автору
 
   для: Саня   (16.12.2010 в 15:24)
 

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

  Ответить  
 
 автор: Саня   (16.12.2010 в 15:26)   письмо автору
 
   для: elenaki   (16.12.2010 в 15:25)
 

Вы забудете, а маркетологи нет. Тем более про базу данных я сказал "например".

  Ответить  
 
 автор: Trianon   (16.12.2010 в 17:44)   письмо автору
 
   для: Саня   (16.12.2010 в 15:24)
 

пока оно в кукисах - это мусор.
А на сервере оно - повод накатить иск о неправомерной обработке персональных данных :)

Не то что бы это вообще нельзя делать.
Но подобного рода рояли в кустах как минимум должны быть описаны в соглашении о конфиденциальности.

  Ответить  
 
 автор: Саня   (16.12.2010 в 18:12)   письмо автору
 
   для: Trianon   (16.12.2010 в 17:44)
 

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

  Ответить  
 
 автор: Ирбис   (16.12.2010 в 16:00)   письмо автору
 
   для: elenaki   (16.12.2010 в 10:02)
 

Как вариант можете использовать для этих целей локальное хранилищие.
Алгоритм может быть следующий: после получения браузером страницы с товаром, удаляете из хранилища все товары, которые находятся в хранилище более суток, далее, с помощью AJAX получаете от сервера данные всех товаров, которые находятся в хранилище и добавляете их на страницу (можно, конечно, вообще всё хранить в хранилище и AJAX-запросы не отправлять, но тогда есть риск рассинхронизации с сервером - допустим товар вы из базы удалили, а в хранилище он осталься и пользователь его увидит ).
Ну и после этого проверьте сохранён ли текущий товар в хранилищи или нет. Если сохранён, то ничего делать не нужно, если нет - добавляете его туда.

Минус этого подхода заключается в том, что он, в чистом виде, работать с IE7 и IE6 не будет (т.к. эти браузеры не поддреживают работу с локальным хранилищем). Но, в принципе, это ограничение легко обойти: вначале проверить доступно ли хранилище, если да - используем его, если нет - используем куки. Или же можно вообще эту рутину переложить на плечи плагина jStorage.

  Ответить  
 
 автор: Trianon   (16.12.2010 в 17:16)   письмо автору
 
   для: Ирбис   (16.12.2010 в 16:00)
 

заноза в пальце.
Если есть микроскоп, лучше электронный - используем его.
Если нет - обходимся увеличительным стеклом.
:))

  Ответить  
 
 автор: Ирбис   (17.12.2010 в 08:57)   письмо автору
 
   для: Trianon   (16.12.2010 в 17:16)
 

ну, типа того ))
но наш микроскоп весьма удобен, прост в использовании и потребляет всего несколько ватт электроэнергии. С лупой примерно тоже самое, только возможностей у неё меньше, но в принципе, и этих возможностей здесь достаточно.

А на деле решение может оказаться весьма удобным.
Псюс ко всему - это возможность пощупать на практике возможности HTML5.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования