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

Форум PHP

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

 

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

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

тема: Открытая сессия + кеширование значений input'ов при history.back() - как ?!
 
 автор: DDK   (30.01.2006 в 14:58)   письмо автору
 
 

Как известно, если открыта сессия, то при нажатии кнопки назад или выполнении JS-команды history.go(-1) введённые перед отправкой формы значения input-боксов (текст, чекбоксы, радиокнопки) сбрасываются. Если же не открывать сессию, то при откате по истории назад введённые значения сохраняются... А возможно ли как-то заставить их не сбиваться и при открытой сессии ? Просто есть форма с огромным кол-вом полей ввода и обработчик. Обработчик проверяет введённые значения полей на соответствие форматам и если хоть одно поле заполнено неверно, то выводится сообщение об ошибке и кнопка Назад.

   
 
 автор: XPraptor   (30.01.2006 в 15:01)   письмо автору
 
   для: DDK   (30.01.2006 в 14:58)
 

Нельзя ничего обработать по команде отката.
Значения полей запоминаются принудительно при загрузке страницы и всегда подставляются в идентификаторы value элемента.
Например:
<input type="text" name="text1" value="<?php print $value1; ?>">

   
 
 автор: DDK   (30.01.2006 в 15:41)   письмо автору
 
   для: XPraptor   (30.01.2006 в 15:01)
 

Вы не поняли вопрос.

   
 
 автор: XPraptor   (30.01.2006 в 16:02)   письмо автору
 
   для: DDK   (30.01.2006 в 15:41)
 

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

   
 
 автор: Loki   (30.01.2006 в 16:40)   письмо автору
 
   для: DDK   (30.01.2006 в 15:41)
 

Просто страница должна ссылаться сама на себя. Если данные правильные - обрабатываем их и редиректимся. Неправильные - вот она форма, вот они данные.
Ради интереса, можете стереть имя и пароль при ответе: этот форум именно так и работает.

   
 
 автор: DDK   (30.01.2006 в 17:11)   письмо автору
 
   для: Loki   (30.01.2006 в 16:40)
 

Да нет же... мы всё же говорим о разных концах разных палок. Имя и пароль в примере этого форума вставляются в поля ещё на стадии генерации страницы скриптом и берутся из сессионных переменных. Хотите встречный пример ? - Сотрите сейчас имя и пароль, но напишите в поле ввода сообщения какой-нибудь текст. А теперь отправьте это сообщение. Когда загрузится страница с ошибкой о том, что не введено имя не идите по ссылкам, которые там предложены (Вернуться в тему, бла бла бла...), а нажмите просто кнопку "Назад" в браузере. Ага ! Текст сообщения-то не сохранился, неправда ли ? А почему ? А потому, что сессия открыта. А вот если бы сессии не было (не было бы в скрипте session_start() ), то текст сообщения при откате на страницу назад сохранился бы в поле ввода сообщения. Или я опять не прав и не знаю, о чём говорю, господа ?!...

   
 
 автор: DDK   (30.01.2006 в 17:15)   письмо автору
 
   для: DDK   (30.01.2006 в 17:11)
 

Ну, правда, этот форум - плохой пример для моего вопроса, т.к. тут ещё и кеширование напроч отключено Мета-тегом.

   
 
 автор: XPraptor   (30.01.2006 в 17:28)   письмо автору
 
   для: DDK   (30.01.2006 в 17:15)
 

Вы опять не понимаете принципа.
Неважно есть сессии или нет их, не может быть на странице никакого "назад".
Всегда только в эту страницу и ни вперед ни назад.

вот код страницы с первой строки:

<?php
global $ar_reg, $printstring;
$printstring="";
$ar_reg["textlogin"]="";
$ar_reg["textpassword"]="";

if(isset($_POST["sbm_send"]) && !empty($_POST["sbm_send"]))
{
$ar_reg["textlogin"]=$_POST["textlogin"];
$ar_reg["textpassword"]=$_POST["textpassword"];
//проверяем правильность
if(правильно){
header("Location: index.php");
}else{
//неправильно
$printstring="Вы не верно заполнили поле...<br>\n";
}

}
?>
<html>
<body>
Вот тут и будет строка о том что не так заполнено, но значения в полях остануться те что юзер ввел или пустые если первый заход на эту страницу
<?php print $printstring; ?>
<form name="form_register" action="" method="post">
Enter login:<br>
<input type="text" name="textlogin" value="<?php print $ar_reg["textlogin"]; ?>"><br>
Enter login:<br>
<input type="text" name="textpassword" value="<?php print $ar_reg["textpassword"]; ?>"><br>
<input type="submit" name="sbm_send" value="send><br>
</form>

   
 
 автор: Loki   (30.01.2006 в 17:37)   письмо автору
 
   для: DDK   (30.01.2006 в 17:15)
 

гм... а я и забыл как тут сделано:)
я имел ввиду как раз то, что говорит XPraptor

   
 
 автор: DDK   (30.01.2006 в 17:50)   письмо автору
 
   для: Loki   (30.01.2006 в 17:37)
 

Так... хорошо... сейчас буду объяснять на пальчиках :) Уважаемые, попробуйте у себя на локалях выполнить вот такой скрипт:

<?
//session_start();
if(!isset($_GET['do'])) {
    echo 
"Введём любой текст в textarea и нажмём-ка мы кнопку Отправить !
    <form action='"
.$_SERVER['PHP_SELF']."?do' method='post'>
    <textarea name='sometext'></textarea>
    <br><input type='submit' value='Отправить'>
    </form>"
;
} else {
    echo 
"А теперь вернёмся на страницу назад по событию history.go(-1)<br>
    и посмотрим, сохранился ли введённый в textarea текст...
    <br><input type='Button' value='&lt; Назад' onclick='history.go(-1);'>"
;
}
?>


А потом выполните этот же скрипт, но раскомментировав вызов функции session_start()... Ага ?!

   
 
 автор: Loki   (30.01.2006 в 18:13)   письмо автору
 
   для: DDK   (30.01.2006 в 17:50)
 

Так не пользуйтесь таким способом. Вам же сказали: поместите форму и обработчик в один файл. Если данные прошли проверку - включаем обработчик. Если нет - выводим форму с заполненными полями.

   
 
 автор: DDK   (30.01.2006 в 18:20)   письмо автору
 
   для: Loki   (30.01.2006 в 18:13)
 

Так... ладно... Может тов. Хеопс что скажет. На последок: у меня в скрипте в зависимости от значения переменной сессии загружается та или иная форма. По-этому не могу не открывать сессию как не крути. Я уже думал над таким вариантом.

   
 
 автор: cheops   (30.01.2006 в 18:26)   письмо автору
 
   для: DDK   (30.01.2006 в 18:20)
 

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

   
 
 автор: DDK   (30.01.2006 в 18:28)   письмо автору
 
   для: cheops   (30.01.2006 в 18:26)
 

Да, я начал было именно так и делать (загонять всё в сессии), но правда, уж больно это геморрно :( Ну что ж, придётся всё-таки так и делать...

   
 
 автор: XPraptor   (01.02.2006 в 14:34)   письмо автору
 
   для: DDK   (30.01.2006 в 18:28)
 

Вам никто не мешает в зависимости от сессии отобразить ту или иную форму, на принципе и работе указанного мною примера это никак не отразится.

<?php
if($_SESSION["какая то"]=чег то){
?>
<form name=form1>
</form>
<?php
}elseif($_SESSION["какая то"]=чег то){
?>
<form name=form2>
</form>
<?php
}
?>

   
 
 автор: Kusuk   (01.02.2006 в 14:42)   письмо автору
 
   для: DDK   (30.01.2006 в 18:28)
 

Хеопс посоверовал самый лучший вариант!
Всё просто по тупому, зато работает на все 100%

   
Rambler's Top100
вверх

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