Старт сессии для корзины и формирование массива добавленых продуктов

TRV23RUS

Новичок
Старт сессии для корзины и формирование массива добавленых продуктов

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

Почитав фак и немного форум решил сделать так как было предложенно на форуме:

if (!empty($_SESSION['products'])) session_start();

Сразу возник ряд вопросов. Удастся ли корректно проверить ($_SESSION['products']) если сама сессия еще не была запущенна? Или имено по этой причине эта переменная будет не определена? А как она будет определенна если сессия еще не запущена?

Будет ли корректной следующая проверка где $add_item является переменной продкта добавляемого в корзину?
if (!empty($_SESSION['products']) OR !empty($add_item)) session_start();
Или лучше для $add_item использовать isset и разнести проверку на две?

И еще я в сессии генерирую массив ключами переменных которого являются id продукта. В дальнейшем с помощью sizeof определяю величину массива, но вывести его не могу так как ключи не являются идущими по порядку.. Вот.. Можете меня конечно и в фак послать, где об этом толково написано, но из того что прочитал помогло не до конца. Какие у кого мысли по поводу вопросов?

Заранее благодарен.
 

Фанат

oncle terrible
Команда форума
if (!empty($_SESSION['products'])) session_start();
это где это ты увидел такое предложение? =)
но вывести его не могу так как ключи не являются идущими по порядку
в фак посылать не будем но ман уж в части управляющих структур прочесть ты обязан.
их не так много.
foreach
 

TRV23RUS

Новичок
Фанат
Сейчас точно не скажу. Но помню что там оно имело следующий вид:
if (empty($_SESSION['products'])) echo "продуктов в корзине нет";

НУ я собствено решил от обратного пойти, но чувствую что пошел куда то не туда... :)

За foreach огромное спасибо, ушел читать по нему ман.
 

Dreammaker

***=Ф=***
Автор оригинала: TRV23RUS

if (!empty($_SESSION['products'])) session_start();

Сразу возник ряд вопросов. Удастся ли корректно проверить ($_SESSION['products']) если сама сессия еще не была запущенна? Или имено по этой причине эта переменная будет не определена? А как она будет определенна если сессия еще не запущена?
В добавление к FAQам и манам :)
В данной ситуации более политкорректно будет использовать не if (!empty($_SESSION['variable'])) session_start();
а if (!isset($_SESSION['variable'])) session_start();
 

TRV23RUS

Новичок
Dreammaker
А в чем состоит полит корректность? Между делом в той теме тоже предлагалось два варианта, но чем один политкорректней чем другой я не уловил..

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

Кстати попутно вопрос. Как запихать вывод значений всех переменных массива в одну переменную?
Типа:
$result = for ($i=0;$i<sizeof($cart[]);$i++)
{
echo $cart[$i];
}

Выглядит смешно конечно. Но это что бы понятно было какой алгоритм приследуется. Что бы при echo $result отобразились все переменные массива cart[]..

-~{}~ 14.10.05 03:51:

Фанат
С each разобрался.. Правда я сделал не через foreach а через
while (list($productskey, $val) = each($_SESSION["products"]))

Такой способ не хуже?
 

Dreammaker

***=Ф=***
TRV23RUS, политкорректнее будет тем, что при иссет проверяется существование переменной, а при емпти - пустая ли она.
То есть, может вылезти предупреждение.
Кроме того,

$var=0;
echo $var2=(empty($var))?"TRUE":"FALSE";

Ты же не будешь отрицать, что что-то в твоей сессии может быть равно нулю. Например, количество твоих же продактсов. И сессия в твоём случае не стартанёт. Вот и политкорректность конкретно для твоего случая. Чтобы не было теорией :).
 

SiMM

Новичок
Dreammaker, садись, два. Выражение isset($_SESSION['variable']) до старта сессии лишено всякого смысла - можете его даже не проверять - такой переменной НЕТ.

> То есть, может вылезти предупреждение.
[m]empty[/m]
 

Фанат

oncle terrible
Команда форума
Феерический топик.
Человеку пишут про foreach - он делает each
Увидел где-то вывод сообщения о том, что корзина пустая - решил проверять таким же способом, есть корзина, или нету вовсе. То, что эта проверка нужна ему... для получения этой самой корзины, заставило его задуматься, но всё-таки не смутило.

Тут приходит второй. Ума палата. У вас тут, говорит, проверочка неправильная.
Я сначала подумал - шутит. Нет, на полном серьёзе доказывает.

TRV23RUS
Скажи, а какой фак ты читал и какой там был код - ты уже, конечно, тоже не помнишь?
 

Dreammaker

***=Ф=***
SiMM, признаю свою неправоту и насчёт первого и насчёт второго. Постараюсь ночью больше не отвечать. Вышло как в украинской поговорке "чую дзвин та не знаю де вин" (слышу звон ("колокол") но не знаю где он).
У меня самого идёт проверка немного по-другому: проверка на существование $_REQUEST['uid'] и если есть, то сессия стартуется.
При этом до страниц с такой поверкой есть страница login.php, где сессия стартует первоначально после проверки паролей и логинов.

Что может быть неправильно в таком варианте?

Так же согласен и со второй рекомендацией почитать ман. :)
 

SiMM

Новичок
Dreammaker, как стартовать сессию пользователю, у которого есть сессия, написано в FAQ'е. Имхо, таскать user_id - излишне. Если ты только не поддерживаешь авторизацию пользователя под несколькими никами одновременно.
 

Dreammaker

***=Ф=***
Из FAQ:
if (isset($_REQUEST[session_name()])) session_start();
таким образом, Мы стартуем сессию только тем, кто прислал идентификатор.

Ок. Значит у меня правильно. Просто я забыл упомянуть, что uid у меня это имя сессии, не айди юзера. В общем, сделал стандартную оплошность - понадеялся на телепатические способности :)
В принципе FAQ-вариант универсальнее... просто привык, что всегда сразу же переназначаю имя переменной сессии - не люблю PHPSESSID.
 

SiMM

Новичок
> Просто я забыл упомянуть, что uid у меня это имя сессии, не айди юзера.
Вообще-то пользовать session_name, имхо, целесообразней, нежели привязываться к конкретному имени идентификатора сессии. Это по крайней мере - гибче.

> Так же существование переменной сесии можно проверять с помощью
http://phpclub.ru/talk/showthread.php?postid=531478#post531478
 

Dreammaker

***=Ф=***
Автор оригинала: SiMM
Вообще-то пользовать session_name, имхо, целесообразней, нежели привязываться к конкретному имени идентификатора сессии. Это по крайней мере - гибче.
В принципе, да, хотя и не критично... Я выше об универсальности написал. Что ж вернём к старому варианту (session_name у меня использовалось первоначально, а потом было заменено на uid). Это относительно проверки на запуск сессии.
 

TRV23RUS

Новичок
Я вечером присоединюсь к обсуждению. Очень признателен что на мою проблему обратило внимание так много людей..
 
Сверху