Jump to content
  • 0

использование сессии


Sserg-135
 Share

Question

Делаю с помощью сессии передачу переменных из ошибочно заполненной формы обратно на редактирование

Алгоритм обычной

Принимаю в обработчик через POST , проверяю и если есть ошибки ввода, то стартую сессию и передаю

$_SESSION['Check_order']['var1']=$var1;

$_SESSION['Check_order']['var2']=$var2l;

и делаю редирект на форму ввода Header ("Location: ../blankform.php");

в которой соответственно стартую сессию и принимаю переменные

$var1=$_SESSION['Check_order']['var1'];

$var2=$_SESSION['Check_order']['var2'];

Проблем нет все работает, но обратил внимание, что работа по такому алгоритму ведет к следующему:

если вводить данные (допустим в них будут обнаружены ошибки) в одной вкладке браузера, отправить на сервер - соответственно там откроется сессия, скрипт вернет на исправление и в это время в другой вкладке браузера проделать то-же самое(заполнить форму с ошибками чтобы она вернулась на редактирование), то сделав обновление страницы на первой вкладке,форма заполнится данными уже из второй вкладки- т.к. идентификатор у сессии получается один для одного юзера и соответственно массив $_SESSION['Check_order'] тоже один. Это допустимо? или надо что-то мудрить на вроде того что ввести в $_SESSION['Check_order'] ['var1']еще одну размерность, например $_SESSION['Check_order'] ['var1'][1] и $_SESSION['Check_order'] ['var1'][2] (хотя не представляю как потом узнать какая к какому относится)?

Или как-то каждый раз стартовать сессии с разными идентификаторами. но правда не понял как это можно сделать

(это http://php.su/functions/?cat=session -уже читал ) ).

Что скажут профи? может и зря я на это внимание обращаю?

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Я обычно делаю так:

if (!empty($_POST))
{
////Тут проверим на ошибки


if (!$error) // Если нет ошибок
{
mysql_query("INSERT ..");
header("Location: ...");
die();
}
else
{
/// Тут выведем сообщение об ошибке, а в поля вставим переменные из $_POST
}
}

И не парюсь

Link to comment
Share on other sites

  • 0
если вводить данные (допустим в них будут обнаружены ошибки) в одной вкладке браузера, отправить на сервер - соответственно там откроется сессия, скрипт вернет на исправление и в это время в другой вкладке браузера проделать то-же самое(заполнить форму с ошибками чтобы она вернулась на редактирование), то сделав обновление страницы на первой вкладке,форма заполнится данными уже из второй вкладки- т.к. идентификатор у сессии получается один для одного юзера и соответственно массив $_SESSION['Check_order'] тоже один. Это допустимо?

Да, допустимо:

Сессии используют стандартные, хорошо известные способы передачи данных. Собственно, других-то просто и нет.

Идентификатор - это обычная переменная. По умолчанию ее имя - PHPSESSID.

Задача PHP отправить ее браузеру, чтобы тот вернул ее со следующим запросом.

Переменную можно передать только двумя способами: в куках или POST/GET запросом.

PHP использует оба варианта.

За это отвечают две настройки в php.ini:

session.use_cookies - если равно 1, то PHP передает идентификатор в куках, если 0 - то нет.

session.use_trans_sid если равно 1, то PHP передает его, добавляя к URL и формам, если 0 - то нет.

Если включена только первая, то при старте сессии (при каждом вызове session_start()) клиенту устанавливается кука. Браузер исправно при каждом следующем запросе эту куку возвращает и PHP имеет идентификатор сессии. Проблемы начинаются, если браузер куки не возвращает. В этом случае, не получая куки с идентификатором, PHP будет все время стартовать новую сессию, и механизм работать не будет.

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

<a href="/index.php">Index</a> превращается в

<a href="/index.php?PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f">Index</a>

а к формам добавляется скрытое поле

<input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />

И браузер при клике на любую ссылку, или при нажатии на кнопку в форме, пошлет в запросе нужную нам переменную - идентификатор сессии!

По очевидным причинам идентификатор добавляется только к относительным ссылкам.

Насчет этого:

Или как-то каждый раз стартовать сессии с разными идентификаторами. но правда не понял как это можно сделать

Наверное можно генерировать случайно с помощью того же rand.

Только вопрос, оно это надо вам?

Edited by rus
Link to comment
Share on other sites

  • 0
Только вопрос, оно это надо вам?

хотелось предусмотреть разные варианты )) вдруг юзер захочет одновременно две формы заполнять и в обоих ошибется а затем нажмет рефреш в браузере. И форма загрузится другими пременными. - юзер может запутаться :)

Еще тогда по поводу сессий: идентификатор сессий, добавляемый PHPой к ссылкам иногда мешает в Ява-скриптовских ссылках:

есть код (формирую ява-скриптом некие ссылки)

<script language="JavaScript" type="text/javascript">
.....
var reff_offer='show.php?division='+number_divisions+'&id='+id;// ссылка на сохраненное в Блокноте
var delnote_rec='<A href=\'#\' TITLE=\'Удалить заметку из блокнота\' onClick=\'DelFromNotebook("'+reс_note+'");return false\';><IMG align=\'absmiddle\' width=17 height=16 SRC=\'image/delete.gif\'></A>';

screen=screen+'<SPAN id='+reс_note+'><A CLASS=\'OkMsg\' HREF='+reff_offer+'>'+name_href+' Предложение №'+id+'</A> '+delnote_rec+'</SPAN><BR>';
....
</script>

когда стартует сессия, то этот PHPSESSID прилепляется к переменной reff_offer и скрипт выдает ошибку.

Что можно здесь сделать? Где-то читал как обойти это , но забыл напрочь

Edited by Sserg-135
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy