[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сессия, как организовать
masson
Объясняю поэтапно как организовал многостраничную регистрацию и как запутался с сессиями ... возможно на уровне организации косяки (?), потому как в пхп я далеко не асс, а если и асс - то не тот :huh:

Вопщем на index.php имеется ссылка "Регистрация", которая ведет на reg.php, все дальнейшие операции происходят только в reg.php. Открываю его в отдельном окне, через window.open(), в котором скрываю все панели и кнопки, оставляю только кнопку "Продолжить"

В самом начале файла открываю сессию
session_start();
if (!isset($_SESSION['j_addr']))
{
$_SESSION['j_user'] = array() ;
$_SESSION['j_job'] = array() ;
$_SESSION['j_addr'] = array();
}


В массиве j_user храним общие данные о пользователе, в j_job о том какие работы-услуги оказывает, в j_addr почтовые адреса. Т.к. работ и адресов м.б.несколько, то это массивы трехмерные.

Дальше файл reg.php вызывает форму f_user на которой кнопочка "Продолжить", потом форму f_job на которой уже 2 кнопочки - "Продолжить" и "добавить еще услугу". С f_addr - тоже самое, 2 кнопки "Завершить" и "добавить еще адрес".
При каждом нажатии "Добавить еще" в массивы добавляется новая строка

На кнопке "Завершить" записываю данные в MySQL и закрываю сессию
$_SESSION = array();
session_destroy();


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

Например завел 3 услуги (а надо 2 например), потом крестик (возврат на index.php), потом опять жмет "Регистрация", а там уже $_SESSION['j_job'] из трех строк ... как побороть?



Спустя 1 день, 31 минута, 41 секунда (9.02.2011 - 02:14) phpsc написал(а):
ООП примени..и проще будет тебе.

Спустя 1 час, 30 секунд (9.02.2011 - 03:15) inpost написал(а):
masson
Забей на сессии, все передаваемые данные отправляй в поле: type=hidden. Ну а если уж хочется сессии, не сразу пользуйся ими, а проверяй предыдущую страницу: (REFERER). Если та, которая должна быть - значит правильно идёт, если нет - кидай на начало регистрации с очищенной сессией =)

Спустя 22 минуты, 28 секунд (9.02.2011 - 03:37) two написал(а):
phpsc
Без ООП можно тоже много чего сделать smile.gif

Спустя 5 часов, 37 минут, 18 секунд (9.02.2011 - 09:14) masson написал(а):
phpsc
А ссылкочку на пример с ООП? если не затруднит. Ну или хоть на словах опиши как должно выглядеть


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

Спустя 1 день, 2 часа, 23 минуты, 34 секунды (10.02.2011 - 11:38) masson написал(а):
Пока решил вопрос так - в начале файла reg.php рисую :
session_start();

if (stripos($_SERVER['HTTP_REFERER'], $_SERVER['PHP_SELF']) == false)
{
$_SESSION = array() ;
$_SESSION['j_user'] = array();
$_SESSION['j_job'] = array();
$_SESSION['j_addr'] = array();
}


Вроде работает. Но все равно чуйствую что сама организационная идея кривая. Если например злобный юзер через правую клавишу вызовет Back - то вся регистрация к бубеням :unsure:

Если у кого есть красивый пример (или ссылка) многостраничной регистрации с заранее неопределенным количеством страниц - буду очень признателен

Спустя 5 часов, 51 минута, 7 секунд (10.02.2011 - 17:29) inpost написал(а):
masson
Конечно, так как надо через скрытые поля такое делать, а не так извращаться.

Спустя 18 минут, 29 секунд (10.02.2011 - 17:48) masson написал(а):
inpost
Нам бы схемку, аль чертеж ..... (с)

Не понимаю как. На словах можешь объяснить?
Например нужно 3 раза вызвать форму для заполнения адреса (2 поля для упрощения - улица-дом и № телефона) ... одно скрытое поле на форме держать? Как в него 3 адреса "нарастающим итогом" укладывать?

Потом нужно 3 раза вызвать форму для указания работ-услуг. Эти данные к паровозу с адресами прицеплять?

Спустя 2 часа, 20 минут, 22 секунды (10.02.2011 - 20:08) inpost написал(а):
1. <input type="text" name="value1" />
2. <input type="hidden" name="value1" value="<?php echo htmlspecialchars($_POST['value1']); ?>" />
3. <input type="hidden" name="value1" value="<?php echo htmlspecialchars($_POST['value1']); ?>" />
и так далее, цифра - номер страницы.

Спустя 1 день, 1 час, 33 минуты, 1 секунда (11.02.2011 - 21:41) alex12060 написал(а):
Все правильно инпост говрит. Надо через хиддены, если ты хочешь делать так. А то сессии грузить, не вариант.

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

Спустя 5 дней, 19 часов, 32 минуты, 9 секунд (17.02.2011 - 17:13) masson написал(а):
alex12060, я уже понял что "надо через хиддены", только не понял как :)

inpost, не понял, в чем разница №2 и №3? зачем две одинаковые строчки? ... не понял что значит "номер страницы" :unsure:


Видимо без кода никак. Вот собрал схематично, все лишнее включая проверки убрал, оставил только самое необходимое. Допустим надо собрать 3 вида работ и 3 адреса. Сейчас работает так :

f_job.php - форма заполнения работ-услуг
Вопрос №1 - сколько еще нужно хидденов и как их заполнять
<form name='f_job' action='reg.php' method='post' onsubmit="return false;">

<!-- Имя, по которому reg.php определит для какого массива собраны данные -->
<input type='hidden' name='prevform' value='f_job' />

<!-- Имя формы, которую reg.php будет запускать после заполнения массива -->
<!-- значение заполняется при нажатии кнопки (см.ниже) -->

<input type='hidden' name='nextform' value='' />

Наименование услуги <br />
<input
type="text" name="name" /> <br /><br />

Примечание <br />
<input
type="text" name="prim" /> <br /><br />
</form>


<input
type='button' name='morejob' value='Добавить еще услугу' onclick='f_job.nextform.value=\"f_job\"; f_job.submit();' />
<input
type='button' name='continue' value='Продолжить регистрацию' onclick='f_job.nextform.value=\"f_addr\"; f_job.submit();' />



f_addr.php - форма заполнения адресов
Вопрос №2 (по типу №1) - сколько еще нужно хидденов и как их заполнять
<form name='f_addr' action='reg.php' method='post' onsubmit="return false;">

<!-- Имя, по которому reg.php определит для какого массива собраны данные -->
<input type='hidden' name='prevform' value='f_addr' />

<!-- Имя формы, которую reg.php будет запускать после заполнения массива -->
<!-- значение заполняется при нажатии кнопки (см.ниже) -->

<input type='hidden' name='nextform' value='' />

Адрес (улица, дом) <br />
<input
type="text" name="name" /> <br /><br />

№№ Телефонов <br />
<input
type="text" name="phones" /> <br /><br />
</form>


<input
type='button' name='moreaddr' value='Добавить еще адрес' onclick='f_addr.nextform.value=\"f_addr\"; f_addr.submit();' />
<input
type='button' name='continue' value='Завершить регистрацию' onclick='f_addr.nextform.value=\"f_final\"; f_addr.submit();' />



reg.php - откуда все вызывается
Вопрос №3 - что прописывать вместо заполнения массива SESSION?
Вопрос №4 - Как сливать в MySQL?
session_start();

if (stripos($_SERVER['HTTP_REFERER'], $_SERVER['PHP_SELF']) == false)
{
$_SESSION = array() ;
$_SESSION['job'] = array();
$_SESSION['addr'] = array();
}

$prevform = $_POST['prevform'];
$nextform = $_POST['nextform'];


switch ($prevform)
{
case "f_job" :
$_SESSION['job'][] = array ('name' => $_POST['name'], 'prim' => $_POST['prim']) ;
break;

case "f_addr" :
$_SESSION['addr'][] = array ('name' => $_POST['name'], 'phones' => $_POST['phones']) ;
break;
}


switch ($nextform)
{
case "f_job" :
include ('./f_job.php') ;
break;

case "f_addr" :
include ('./f_addr.php') ;
break;

case "f_final" : // Здесь сливаем данные в MySQL
include ('./f_final.php') ;
break;
}

Спустя 10 дней, 16 часов, 21 минута, 1 секунда (28.02.2011 - 09:34) masson написал(а):
Ну что ж вы молчите, джентельмены ? unsure.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.