Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Логин - ф5


Автор: fakeman 28.9.2009, 03:16
Хеллоу smile Как тока человек логинеться то если сразу сделать обновление страницы то выскачит табличка "To display this page, the application must send information that will reapeat ..." бла бла бла.. так вот. как это можно устранить ? Я сделал такой метод 

Код

if ($_POST['password'])
{
    if($_GET['lang']=='en'){
        header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?lang=en");
    }
    if($_GET['lang']=='ru'){
        header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?lang=ru");
    }
}


Работает исправно, вот тока если кто та введёт неверно пасс или логин или .... то он не выдаст моё сообшение об ошибки т.к. в начале странице идёт header а уже потом в середине моя форма с логином... Придётся выбирать между или может кто сможет помочь как сделать что бы после логина нажимая ф5 не выподала окна предупреждением и что бы если введено неверное поле при логине он высвечивал ошибку.. smile

Автор: youri 28.9.2009, 03:21
если понял о чем ты, то http://phpfaq.ru/na_tanke#http

Автор: fakeman 28.9.2009, 04:28
youri, это, да понятно.. крч.
у меня на сайте сама форма и обраб.код(проверки на лог и пасс, если что то не верно выводитьяс ошиба о том что не перно пасс или лог и т.д.) о логине находиться в середине сайта, значит что бы браузер не выкидывал окно с повторной отправкой надо после того как человек ввёл пасс и лог он обновил страницу, что бы это сделать надо header(.. прописать в самом верху, получаеться.. header вверху сайта а сам код в середине. Значит он не будет выводить мои ошибки о неправельно вводе лог и пасса, но зато при логине не будет появляться от браузера повторной отправки. так ? так... так вот как это обойти? чтобы он при логине-ф5 браузер не кидал окно с повторной отправкой и что бы он выводил ошибки если лог и пасс неверный..

Автор: MoLeX 28.9.2009, 05:49
Цитата(fakeman @  28.9.2009,  03:16 Найти цитируемый пост)
вот тока если кто та введёт неверно пасс или логин или .... то он не выдаст моё сообшение об ошибки т.к. в начале странице идёт header а уже потом в середине моя форма с логином...

Код

if ($_POST['password'] == 'pass')
{
...........
}
else
{
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?lang=ru&error=1");
}


if( $_GET['error'] = 1 )
   $error = 'Неправильный пасс';


идею понял?

Автор: Ипатьев 28.9.2009, 08:19
По хорошему, надо в любом случае делать "header". Поскольку после неправильного ввода он тоже может нажать ф5.

Но спеллчекер надо ставить пользователям этого сайта насильно. может быть правительство выпустит какой-нибудь закон...

Автор: youri 28.9.2009, 09:03
Цитата(fakeman @  28.9.2009,  04:28 Найти цитируемый пост)
что бы это сделать надо header(.. прописать в самом верху, получаеться

почему в самом верху?
Цитата(fakeman @  28.9.2009,  04:28 Найти цитируемый пост)
header вверху сайта а сам код в середине. Значит он не будет выводить мои ошибки о неправельно вводе лог и пасса

не важно где код, а где header

Автор: Gold Dragon 28.9.2009, 13:01
вопрос немного скомкан, может не до понял, но у меня вот какая логика..

1. Проверяем пришли данные из формы ($_POST['password'])
2. Если пришли, то отправляем данные на проверку.
3. Если данные соответствуют всем требованиям, то делаем
Код

print "<script>document.location.href='адрес_куда_нужно_перейти'</script>";exit;

4. Если данные не соответствуют, то  создаём некую переменную (массив) $error, например, 
Код

$error['pas'] = "пароль не верный";
$error['log'] = "логин не верный";

и выводим форму передав ей переменную $error
5. Если данные из формы не пришли то выводим форму

сама форма может выглядеть, например, так
Код

echo <<<EOF
<form action="index.php?pages=r2" method="post" name="fiew">
<div>{$error['log']}
<br />Логин: <input type="text" size="50" name="log" value="{$info['log']}">
</div>
<div>{$error['pas']}
<br />Пароль: <input type="text" size="50" name="pas" value="{$info['pas']}">
</div>
<input type="submit" value="Отправить" name="fiew">
</form>

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

Автор: youri 28.9.2009, 13:41
Gold Dragon, Ипатьев и MoLeX на самом деле уже ответили, причем в твоем описании все та же проблема с F5. И зачем делать переадресацию с помощью javascript, если ее можно сделать с помощью header

Автор: fakeman 28.9.2009, 13:44
MoLeX, Спасибо выручил smile

Спасибо всем smile

Автор: MoLeX 28.9.2009, 13:47
fakeman,  smile

Добавлено через 22 секунды
из спасибо шубы не сошьешь

Автор: Gold Dragon 28.9.2009, 14:10
youri, а какая проблема с F5?
Цитата(youri @  28.9.2009,  14:41 Найти цитируемый пост)
И зачем делать переадресацию с помощью javascript, если ее можно сделать с помощью header 
не знаю, мне так привычнее smile

Добавлено через 1 минуту и 34 секунды
да и проблем нет если у меня что-то вначале выводится

Автор: Ипатьев 28.9.2009, 14:30
Это-то и проблема.
Что советы даются не по стандарту, а "кому как привычнее". 

Автор: sTa1kEr 28.9.2009, 14:37
Цитата(Gold Dragon @  28.9.2009,  14:01 Найти цитируемый пост)
4. Если данные не соответствуют, то  создаём некую переменную (массив) $error, например, 

Цитата(Ипатьев @  28.9.2009,  09:19 Найти цитируемый пост)
По хорошему, надо в любом случае делать "header". Поскольку после неправильного ввода он тоже может нажать ф5.


Стоит либо сделать редирект на script.php?error=КОД_ОШИБКИ, а по коду ошибки выдавать сообщение, либо записывать сообщение об ошибке в сессию и после редиректа выводить, а затем удалять это сообщение.

Ну и http://php.net/outcontrol + http://php.net/header - это будет более правильное решение, чем через javascript. Т.к. во первых будет работать во всех браузерах, в т.ч. с отключенном js. Во вторых не придется отдавать контент. А в третьих будет корректно отрабатывать также для ajax и flash запросов.

Автор: Gold Dragon 28.9.2009, 14:51
ну так F5 если я правильно понял нужен чтобы приходящие данные из формы не выполнялись вторично.. Я понимаю если там идёт отсылка запросов в базу или что-то подобное, то однозначно нельзя такое допустить.. А в своём примере я показал что хоть пусть обнаживается, всё равно придёт на форму где нужно ввести данные.. и на этой же форме он увидет ошибки в конкретном поле.

Хотя это упрощённый вариант.. Конечно можно сделать отсылку на страницу ошибок, потом вернуть на страницу формы.. Хороший вариант передавать данные через ту же сессию. Но если форма простая или задача у неё простая, то можно и это использовать... smile
Цитата(sTa1kEr @  28.9.2009,  15:37 Найти цитируемый пост)
в т.ч. с отключенном js
ну я это просто игнорирую... Современный сайт без JS это не сайт. этот человек половину не увидит и половина функционала не будет работать smile

Цитата(sTa1kEr @  28.9.2009,  15:37 Найти цитируемый пост)
Во вторых не придется отдавать контент. 
поясни, что-то не совсем понял

Автор: sTa1kEr 28.9.2009, 15:03
Цитата(Gold Dragon @  28.9.2009,  15:51 Найти цитируемый пост)
ну я это просто игнорирую... Современный сайт без JS это не сайт. этот человек половину не увидит и половина функционала не будет работать smile

Одно дело, когда без js не работают дополнительные финтифлюшки и совсем другое когда сайт становится полностью неработоспособным. И потом это наплевательское отношение к пользователю.

Цитата(Gold Dragon @  28.9.2009,  15:51 Найти цитируемый пост)
поясни, что-то не совсем понял

Сервер отдает клиенту только заголовки, без контента. А в твоем же случае генерируется html(причем не валидный), браузеру приходится его загрузить, распарсить, починить, построить DOM и только затем (если повезет) начать выполнять твой js.

В общем, это моветон.

Автор: Ипатьев 28.9.2009, 15:04
В данном случае даже сессия не нужна. И сообщать какую бы то ни было информацию о правильности логина и пароля нежелательно. И уж тем более не надо писать пароль в value. 


Автор: sTa1kEr 28.9.2009, 15:05
Цитата(Gold Dragon @  28.9.2009,  15:51 Найти цитируемый пост)
А в своём примере я показал что хоть пусть обнаживается, всё равно придёт на форму где нужно ввести данные.. и на этой же форме он увидет ошибки в конкретном поле.

Я написал выше как это просто можно решить с помощью редиректа.

Добавлено через 4 минуты и 57 секунд
Цитата(Ипатьев @  28.9.2009,  16:04 Найти цитируемый пост)
В данном случае даже сессия не нужна.

Я написал для чего она нужна - для передачи сообщения между запросами. Это простейший способ.
Цитата(Ипатьев @  28.9.2009,  16:04 Найти цитируемый пост)
И сообщать какую бы то ни было информацию о правильности логина и пароля нежелательно.

Вы меня удивляете. Много вы видели сервисов, которые бы умалчивали об не успешной авторизации?

Добавлено через 9 минут и 23 секунды
Цитата(sTa1kEr @  28.9.2009,  16:05 Найти цитируемый пост)
Вы меня удивляете. Много вы видели сервисов, которые бы умалчивали об не успешной авторизации? 

Если же речь о том, что не нужно выдавать информацию, что не корректный логин. - Тогда, конечно, согласен. Но общее сообщение о том, что пользователь не был авторизован нужно выдать.

Автор: Gold Dragon 28.9.2009, 15:20
Цитата(sTa1kEr @  28.9.2009,  16:03 Найти цитируемый пост)
Одно дело, когда без js не работают дополнительные финтифлюшки и совсем другое когда сайт становится полностью неработоспособным
ну про красивости я и не говорю.. Тут к примеру, та же работа с формой, чтобы её проверить (заполняемость обязательных полей) то нужен JS.. А уж про сложные проверки например, средствами jquery я вообще молчу.. ДА и процент таких уж очень маленький... Я конечно что это наплевательское отношение к пользователю.. Хотя можно сказать что это наплевательское отношение пользователя smile Если допустим у него ч.б. монитор, то уж это его проблема что он не сможет отличить красный от синего.. Чтож.. приходится жертвовать этими сотыми процента.. 

А вот про контент согласен.. Даже как-то не подумал, что генерится ведь страница smile Хотя я понимаю что эту невалидность проглотит любой браузер да и генерация занимает не так много времени, но на будущее пожалуй переделаю свои "заготовки кода" smile Прям сразу переубедил, спасибо  smile

Добавлено через 2 минуты и 20 секунд
Цитата(Ипатьев @  28.9.2009,  16:04 Найти цитируемый пост)
И сообщать какую бы то ни было информацию о правильности логина и пароля нежелательно. И уж тем более не надо писать пароль в value. 
так я это к примеру.. формы то бываю разные smile Да и я возвращаю только то значение которое ввёл пользователь (это просто в коде я не показал).. Сам знаю, когда где-то ошибся, а потом мне выдаётся страница где нужно заново все поля вбивать.. ужас 

Автор: sTa1kEr 28.9.2009, 15:38
Прошу прощения за оффтоп.

Цитата(Gold Dragon @  28.9.2009,  16:20 Найти цитируемый пост)
ДА и процент таких уж очень маленький...

Не представляешь насколько сейчас популярен т.н. веб-серфинг на мобильниках smile Хотя некоторые браузеры (Opera Mini, браузер IPhone) как-бы поддерживают js, но как-правило на сайтах, которые не рассчитывают, что у пользователя может быть отключен js, все равно возникает очень много "непроходимых" ошибок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)