Забыли пароль?
Запросите новый здесь.

Автор темы: Pisatel
ID темы: 1507
Информация:
Тема содержит 30 сообщения, была просмотрена 9435 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » PHP
 Распечатать тему
Пишем в сессию просмотренные товары- помощь
Pisatel
Мастера, всем доброго времени суток! Вновь нужна помощь. В общем, у себя в каталоге задумал сделать вывод просмотренных ранее пользователем товаров- через сессию. Слепил вот такой код:
Загрузить источник  GeSHi: PHP
  1. if(isset($tov_id)){
  2. $_SESSION['looked'].= $tov_id. " ";
  3.  
  4.  
  5. echo "Просмотренные товары:<br /> ".implode(' ', array_unique(explode(' ', $_SESSION['looked'])));
Добавлено за 0.031 секунд, используя GeSHi 1.0.8.10

Все работает, ид товаров пишутся и выводятся таким образом: 9 23 16 190. Вопрос в следующем: как мне теперь эти цифры сделать ссылками на товары? То есть, куда вставить, например, <a href="cat.php&tov_id=здесь число из массива">ссылка</a>? Буду признателен за подсказку.
 
Web
Polarfox
Делай второй уровень у массива и загоняй в него иды, проверяя на уникальность.
Выводить массив в разы удобней чем мучаться со строкой и пробелами.

$_SESSION['looked'][] = (int)$tov_id; //например

Есть вопросы?

Я вот хз если нет проверки, приводим насильно к интежеру (но это не совсем верное целое, хотя и валидное)
Изменил(а) Polarfox, 07.05.2013 11:51
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле.
Ежели кто забанен за спам, но не считает себя ботом: можете сообщить мне об этом, все будет хорошо.

PolarLab - вход для подопытных
 
Web
Pisatel
PolarFox, обязательно будут.:-) Спасибо, буду пробовать.
 
Web
mishqa35
Оффтопик Синтаксис...надоело читать кривой код.
up; tov_id через isset ag

 
Web
Pisatel
mishqa35, а что не так? Это условие, чтобы записанное выводилось только на страницах, где присутствует переменная $tov_id. Или можно по-другому?
 
Web
Rush
да нормально все. не вижу в иссет ничего плохого.
с одной стороны конечно не тру что есть неопределенность в коде, а с другой это фьюжн, так что пох
 
Web
Pisatel
Rush, это не фьюжн, это каталог товаров, почти написанный заново. Помогите мне понять ход ваших мыслей: как мне еще определить, что пользователь находится именно на странице с товаром, а не, например, в видеокаталоге или фотоальбоме? Только там, где идет вывод товаров, присутствует эта переменная, вот и взял я ее на проверку наличия. Что не так? Как вариант- можно делать проверку на присутствие в урл определенных параметров, но зачем, если с переменной проще? Если это можно сделать иначе- подскажите, буду благодарен.
 
Web
Serge Renard
А что, адрес самой страницы (без параметров) во всех случаях один и тот же?
В Интернете кто-то неправ!
 
Web
Pisatel
Для новостей, информации и товаров- да.
 
Web
Rush
по тру наверное надо метод/функция. вызываешь в нужном месте. и зачем использовать сессию, если можно использовать более долгоживущие кукисы
 
Web
Serge Renard
Pisatel написал:

Для новостей, информации и товаров- да.

Могу ошибаться, но мне это кажется методологически неправильным.
В Интернете кто-то неправ!
 
Web
Polarfox
В сессии можно хранить все, в печеньках - ничего.

Наши от сессий впрочем отказались, идеально было хранить в табличке, но если проще то пускай так.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле.
Ежели кто забанен за спам, но не считает себя ботом: можете сообщить мне об этом, все будет хорошо.

PolarLab - вход для подопытных
 
Web
Rush
сессия хранится пока открыта страница, кукисы - сколько угодно.
в базе - спорный вопрос
 
Web
Pisatel
Вот из этого следующий вопрос. Я сделал запись в сессию не только ид, а прямо адреса ссылок с картинками, все работает, вопрос в следующем: это как-то влияет на безопасность? Далее. Согласен, можно и в куки сделать, но зачем? Мне достаточно того времени, что пользователь находится на сайте, если он в следующий раз зайдет, например, через пять часов- пусть в сессию пишутся новые просмотренные товары. И еще: не получается обновлять запись первого товара после, например, пяти просмотренных. Делаю так: $array- массив сессии с товаром
Загрузить источник  GeSHi: PHP
  1. if (count($array) > 5) array_pop($array)
Добавлено за 0.028 секунд, используя GeSHi 1.0.8.10

Но все равно пишет и 6, и 7 товар...
Serge Renard, скорее всего, ты прав, и, возможно, в будущем руки дойдут до исправления этого. Для всего сделаю свои страницы. Изначально этот каталог был написан так, много чего исправил, до этого пока не добрался.
Изменил(а) Pisatel, 09.05.2013 05:04
 
Web
Polarfox
присвоения нет
$array = array_pop($array);
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле.
Ежели кто забанен за спам, но не считает себя ботом: можете сообщить мне об этом, все будет хорошо.

PolarLab - вход для подопытных
x1
 
Web
Pisatel
Мастера, хелп. Весь мозг уже вынес себе. Проблема в следующем: в сессию записываются просмотренные товары, я хочу их записывать всего пять, когда просмотрят более- удалять первый и так далее. Вот мой гкод, что не так делаю?
Загрузить источник  GeSHi: PHP
  1. $_SESSION['looked'] .= "<a title=\"$nazv\" href=\"skycat.php?mod=cat&cat_id=$cat_id&tov_id=$tov_id\">
  2. <img class=\"photo\" src=\"pic/tov/sm_$picture\"></a>";
  3.  
  4.  
  5. $array = array_unique(explode(' ', $_SESSION['looked']));
  6.  
  7. if (count($array) > 5){
  8. $arrayun = array_shift($array);
  9. unset($_SESSION['$arrayun']);
  10. }
  11.  
  12. if (!empty($array)){
  13.  
  14. echo "Просмотренные товары:<br /> ".implode(' ', $array);
  15. }
Добавлено за 0.036 секунд, используя GeSHi 1.0.8.10

Изменил(а) Pisatel, 10.05.2013 10:02
 
Web
Rush
#^*@ (да простят меня боги) сломал мозг пока читал этот код... ааааа
$_SESSION['looked'] - строка, которую ты эксплодишь по пробелу, на выходе массив вида
Скачать исходники  Код

array(
'<a title=\"$nazv\"',
'href=\"skycat.php?mod=cat&cat_id=$cat_id&tov_id=$tov_id\"><img',
'class=\"photo\"',
'src=\"pic/tov/sm_$picture\"></a>',
);




так этого мало, ты делаешь array_shift, в $arrayun у тя получается '<a title=\"$nazv\"' и ты делаешь unset($_SESSION['<a title=\"$nazv\"']); *PIPEZ**PIPEZ**PIPEZ**PIPEZ*

Скачать исходники  Код

$_SESSION['looked'] = array('link1','link2'.....);
$links = $_SESSION['looked'];

if (count($links)>5) {
array_shift($links );
$_SESSION['looked'] = $links;
}

//добавление
if (!in_array($new_link,$_SESSION['looked'])) {
$_SESSION['looked'][] = $new_link;
}




Изменил(а) Polarfox, 10.05.2013 11:56
 
Web
Pisatel
Я с массивами никогда не работал, про сессию слышал звон, та не знал, где он... Учусь. Все когда-то с чего-то начинали, верно? Благодарю, буду экспериментировать дальше.
UPD:
Мастера, с вашей помощью у меня получилось следующее:
Загрузить источник  GeSHi: PHP
  1. $_SESSION['looked'][] = '<a title="'.$nazv.'" href="skycat.php?mod=cat&cat_id='.$cat.'_id&tov_id='.$tov_id.'"><img class="photo" src="pic/tov/sm_'.$picture.'"></a>';
  2.  
  3.  
  4. $links = array_unique($_SESSION['looked']);
  5.  
  6.  
  7.  
  8.  
  9. if (count($links)>5) {
  10.  
  11.  
  12. array_shift($links );
  13.  
  14.  
  15. $_SESSION['looked'] = $links;
  16.  
  17.  
  18. }
  19.  
  20.  
  21.  
  22.  
  23. //добавление
  24.  
  25.  
  26. if (!in_array($new_link, $_SESSION['looked'])) {
  27.  
  28.  
  29. $_SESSION['looked'][] = $new_link;
  30.  
  31.  
  32. }
  33. foreach($links as $value){
  34. echo $value;
  35. }
Добавлено за 0.041 секунд, используя GeSHi 1.0.8.10

И все почти работает, но как-то нестабильно: то 4 последних просмотренных выведет, то пять... Похоже, причина вот в чем: когда жмешь на товар, который уже смотрел, он не добавляется, так как array_unique, а вот array_shift срабатывает и удаляет первую запись. Как обойти?
Изменил(а) Pisatel, 10.05.2013 15:19
 
Web
Polarfox
Первое что нужно сделать - продумать план как оно будет работать, с условиями.
Зовется алгоритм, вот задумайся над ним, и часть проблем будет исчезнута.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле.
Ежели кто забанен за спам, но не считает себя ботом: можете сообщить мне об этом, все будет хорошо.

PolarLab - вход для подопытных
 
Web
Pisatel
Все пока работает, просто я после правки не стартовал новую сессию, сейчас все гуд. Если возникнут проблемы- опишу. Спасибо за помощь, подсказки и терпение!
 
Web

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум:
Похожие темы
Темы Форум Ответов / Просмотров Последние сообщения
11. Здравотека - товары для здоровья  →  Конкурс на лучший сайт на PHP-Fusion 2013 12 / 5662 05.12.2013 15:13
Топ 5 пользователей форума
Alex Alex (1,196)   Zaxap Zaxap (1,078)   Vova Vova (877)   Pisatel Pisatel (678)   util util (666)