|
|
|
| Столкнулся с задачкой такого рода. Есть форма регистрации (страница index.php), при ее заполнении и регистрации проверяются введенные значения (проверка происходит на странице regist.php), если они не верны перенаправляемся на index функцией header, где указываем что введены неверные данные. Но там же правильно введенные поля не должны пропадать как это бывает при обновление страницы.
Скажите как это сделать.
Я пробовал сохранять данные в сессии, но не могу сделать что б скрипт определял, что переадресация происходит из файла regist и показывать данные из сессии, иначе нет.
функция $_SERVER['PHP_SELF'] не показывает страницу скрипта когда переадресация происходит через header | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 15:54)
| | мой примитивный скрипт такой
страница index
(если однажды неправильно ввести данные, то они сохраняются в сессии и при последующем посещении страницы index они будут появляться, что мне не нужно. Как же определить, что скрипт неренаправил меня с regist и показывать ошибки или иначе их показывать не стоит?)
<form action="city.php" method="post">
<div class="reg_caption">Регистрация</div>
<div class="reg_font">Фамилия</div>
<div><input type="text" name="family" class="reg_form" value="<?php $_SESSION['family_error']; ?>"/><span class="reg_error"><?php echo $_SESSION['family_error']; ?></span></div>
<div class="reg_font">Имя</div>
<div><input type="text" name="name" class="reg_form" value="<?php $_SESSION['name_error']; ?>"/><?php echo $_SESSION['name_error']; ?></div>
<div class="reg_font">Пол</div>
<div id="align-left"><select name="pol" class="reg_form">
<option value="">Пол</option>
<option value="Мужской">Мужской</option>
<option value="Женский">Женский</option>
</select></div>
<div class="reg_font">Место жительства</div>
<div><input type="text" name="live_city" class="reg_form" value="<?php $_SESSION['live_city_error']; ?>"/><?php echo $_SESSION['live_city_error']; ?></div>
<div class="reg_font">Адрес электронной почты</div>
<div><input type="text" name="login" maxlength="20" class="reg_form" value="<?php $_SESSION['login_error']; ?>"/><?php echo $_SESSION['login_error']; ?></div>
<div class="reg_font">Пароль</div>
<div><input type="password" name="password" value="" maxlength="20" class="reg_form"/><?php echo $_SESSION['password_error']; ?></div>
<div class="reg_font">Повторите пароль</div>
<div><input type="password" name="password2" value="" maxlength="20" class="reg_form"/><?php echo $_SESSION['password2_error']; ?></div>
<div class="reg_regist"><center>
<input type="submit" class="reg_input_sendregist" name="sendregist" value="Присоединится"/></center></div>
</form>
страница regist
// Проверка на регулярные выражения
if(!preg_match("/[а-я]/i",$_POST['name'])){
$_SESSION['name_error']="Не правильно введено имя";
$error=true;
} else { $_SESSION['name']=$_POST['name']; }
if(!preg_match("/[а-я]/i",$_POST['family'])){
$_SESSION['family_error']="Не правильно введена фамилия";
$error=true;
} else { $_SESSION['family']=$_POST['family']; }
if(!preg_match("/[а-я]/i",$_POST['pol'])){
$_SESSION['pol_error']="Не правильно введен пол";
$error=true;
} else { $_SESSION['pol']=$_POST['pol']; }
if(!preg_match("/[а-я\\._ -]/i",$_POST['live_city'])){
$_SESSION['live_city_error']="Не правильно введен город";
$error=true;
} else { $_SESSION['live_city']=$_POST['live_city']; }
if(!preg_match("/[0-9a-z\\._ -]/i",$_POST['login'])){
$_SESSION['login_error']="Не правильно введен эл.адрес";
$error=true;
} else { $_SESSION['login']=$_POST['login']; }
if(!preg_match("/[0-9a-zA-Z\\. -]/",$_POST['password'])){
$_SESSION['password_error']="Не правильно введен пароль<br/>[0-9a-zA-Z.-]";
$error=true;
} else { $_SESSION['password']=$_POST['password']; }
if(!preg_match("/[0-9a-zA-Z\\. -]/",$_POST['password2'])){
$_SESSION['password2_error']="Не правильно введен пароль<br/>[0-9a-zA-Z.-]";
$error=true;
} else { $_SESSION['password2']=$_POST['password2']; }
}
if($error==true){
$_SESSION['error']='error';
header("Location: index.php");
exit;
} | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 16:01)
| | А чем этот вариант не нравится?
PS Понятно, что встает проблема очистки сессии, но если у вас отдельные страницы формы и обработчика, то пожалуй по другому и не реализовать, разве что на странице обработчика создавать HTML-форму состоящую полностью из скрытых полей и передавать значения через неё.
PPS Для таких задач лучше ввести префикс для сессии, т.е хранить данные не в корне массива $_SESSION, а в $_SESSION['prefix'], где prefix уникален для каждой из форм. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 16:32)
| | скажите пожалуйста, как применять префикс формы, я с этим не сталкивался. может быть у вас есть какой нибудь пример применения префикса.
Я думал в начале сделать скрипт, который бы проверял:
if(переход со страницы regist){ показать сессию }
else { не показывать }
но $_SERVER['PHP_SELF'] $_SERVER['REQUEST_URI'] $_SERVER['SCRIPT_NAME'] страницу перехода не показывают так как использую header()
Возможно префиксы мне помогут. Буду очень благодарен! | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 16:51)
| | Да тут нет никакой хитрости, просто используйте вместо $_POST['family'] - $_POST['prefix']['family'] | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 16:52)
| | честно говоря я не понял как ее применить! Мне ж главное нужно если данные неверны сессию показать иначе нет. А как префикс в этом поможет :-( | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 17:44)
| | Префикс использовать не обязательно, но он поможет вам избежать подстановки значений из других форм, если пользователь работает одновременно с двумя или более формами и у них есть общие поля. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 17:58)
| | ну это вроде двумерного массива. но мне сейчас нужно не это. нужно показать сессию если данные введены неверно, иначе не показывать. Сессия такая вещь что выводит данные всегда когда в ней они есть. А как различить что при вводе неправильных данных меня вернули со страницы regist на index и сессию показать нужно и что защел посетитель на index и ему сессию показывать не нужно.
Ведь у меня <input type="text" name="family" class="reg_form" value="<?php $_SESSION['family_error']; ?> и сессия показывается все время. | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 18:26)
| | Да вы поступите проще, не помещайте в сессию фраз вида "Не правильно введен эл.адрес". Если введено ошибочное значение, просто передавайте какой-нибудь флаг вроде -1. Если значение в сессии равно этому значению, в value вставляйте пустое значение, а в обработчик фразу о том, что введено неправильное значение. Вам даже править будет удобнее, когда весь текст, относящийся к полям, у вас будет в районе формы, а не разбросан по двум и более файлам. Обрабатывать отдельно разношерстные сообщения об ошибках в сессии действительно проблематично - нужен какой-то единый признак. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 18:37)
| | вы меня совсем не поняли? Кто то неправильно ввел данные и в сессия теперь хранятся данные введенные им. Следом заходит другой посетитель и он будет видеть данные введенные предыдущем посетителем. Вот как определить что это тот пользователь который ввел неправильные данные и его переадресовало с regist на index после чего отобразить ему эти данные и удалить эти переменные или это новый пользователь которому эти данные показывать не стоит | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.04.2011 в 19:01)
| | Он не может видеть данные другого пользователя - сессия привязывается через cookie к конкретному компьютеру. Если другой посетитель не подделает cookie и не введет SID пользователя, заполнявшего форму, у него будет свой собственный набор данных в $_SESSION, никак не пересекающийся с набор данных параллельного пользователя.
PS Попробуйте заполнить $_SESSION в одном браузере и зайти на страницу в другом (браузеры должны быть разных типов, например, Opera и FireFox) - данные заполненные в одном браузере, не доступны в другом. Сессии специально для такого поведения и задумывались. | |
|
|
|