Скажите, пожалуйста, как лучше поступать, после отправки данных на сервер
например:
- заполняем форму
- нажимаем сохранить
- данные пишутся в БД
- выходит сообщение - "Данные успешно сохранены"
Нужна защита от F5.
Раньше у меня был redirect на другую страницу и надпись "Данные успешно сохранены". Но эта надпись зависела от переменной сессии, мне это не нравится.
Думаю, может быть сделать страницу "успеха" с задержкой, а потом redirect.
Вы как реализовываете?
Спустя 1 час, 6 минут, 29 секунд (24.08.2012 - 08:27) phz написал(а):
Как вариант:
После нажатия кнопки сохранять и ведём на эту же страницу или на список всех данных и к ссылки добавляем &status=ok
После нажатия кнопки сохранять и ведём на эту же страницу или на список всех данных и к ссылки добавляем &status=ok
if (isset($_GET['status']))
{
$info[] = 'Данные успешно сохранены';
}
Спустя 26 минут, 52 секунды (24.08.2012 - 08:54) zvezda_t написал(а):
phz, я использую CodeIgniter, там вообще Get запрещены
Спустя 3 минуты, 55 секунд (24.08.2012 - 08:58) zvezda_t написал(а):
А если сделать alert("Ваши данные успешно сохранены!") перед redirect.
пользователь нажимает ok и переходит.
Или так плохо? Лишнее действие - это не очень?
пользователь нажимает ok и переходит.
Или так плохо? Лишнее действие - это не очень?
Спустя 5 минут (24.08.2012 - 09:03) TMake написал(а):
zvezda_t для этого CodeIgniter нужно немного допиливать http://habrahabr.ru/post/42172/ что бы GET можно было использовать
Спустя 20 минут, 8 секунд (24.08.2012 - 09:23) Игорь_Vasinsky написал(а):
можно и в сессии хранить результат, а после вывода - очищать сразу
Спустя 30 минут, 57 секунд (24.08.2012 - 09:54) zvezda_t написал(а):
Игорь_Vasinsky, значит оставлю как было) спасибо
Спустя 1 минута, 32 секунды (24.08.2012 - 09:56) Placido написал(а):
Цитата (Игорь_Vasinsky @ 24.08.2012 - 10:23) |
можно и в сессии хранить результат, а после вывода - очищать сразу |
Для этого в CI есть такая штука, как flashdata
CodeIgniter поддерживает "flashdata" — данные сессии, которые доступны только для следующего запроса, и затем автоматически удаляются.
Это может быть полезно для отображения статусных сообщений.
http://cidocs.ru/210/libraries/sessions.html
Спустя 43 секунды (24.08.2012 - 09:56) Invis1ble написал(а):
Цитата |
можно и в сессии хранить результат, а после вывода - очищать сразу |
да. Как раз так и делаю в проекте, над которым работаю в данное время. Т.н. Flash Messages
Цитата |
Для этого в CI есть такая штука, как flashdata |
О. А я к кохане модуль отдельный написал для этого.
Спустя 3 минуты, 22 секунды (24.08.2012 - 10:00) ваыв написал(а):
zvezda_t,
1) header('location:site.ru');
2) Каптча;
3) Проверка на существование записи;
1) header('location:site.ru');
2) Каптча;
3) Проверка на существование записи;
Спустя 44 минуты, 18 секунд (24.08.2012 - 10:44) sergeiss написал(а):
Цитата (ваыв @ 24.08.2012 - 12:00) |
1) header('location:site.ru'); |
Не успел написать об этом
Только еще лучше будет header( "Refresh......"); с указанием времени на показ страницы. На мой взгляд, самое лучшее решение, потому что пофиг на сессии и куки, не зависит от них.
Спустя 4 минуты, 22 секунды (24.08.2012 - 10:48) johniek_comp написал(а):
Invis1ble
гонишь
?get=111
гонишь
$this->request->query('get');
?get=111
Спустя 10 минут, 37 секунд (24.08.2012 - 10:59) Invis1ble написал(а):
johniek_comp
Цитата |
гонишь |
Где это интересно я гоню? Обоснуй.
Спустя 6 минут, 5 секунд (24.08.2012 - 11:05) zvezda_t написал(а):
а чем
header( "Refresh......");
отличается от
header( "location......"); ?
sergeiss, я правильно тебя поняла:
после сохранения делаем редирект на страницу успеха, задержка, потом возвращаемся на страницу формы? Или нет?
header( "Refresh......");
отличается от
header( "location......"); ?
sergeiss, я правильно тебя поняла:
после сохранения делаем редирект на страницу успеха, задержка, потом возвращаемся на страницу формы? Или нет?
Спустя 23 минуты, 8 секунд (24.08.2012 - 11:28) pak написал(а):
header('Refresh: 3; URL=http://phpforum.ru');
// перенаправит через 3 секунды
Спустя 6 минут, 30 секунд (24.08.2012 - 11:35) sergeiss написал(а):
Цитата (zvezda_t @ 24.08.2012 - 13:05) |
а чем header( "Refresh......"); отличается от header( "location......"); ? |
Разница в одном: рефреш делает переадресацию с задержкой в течение указанного времени, а локейшн - сразу же.
Алгоритм такой (хотя об этом говОрено на форуме уже много раз!):
1. Переходим на страницу обработки полученных в форме данных, лучше всего, если это та же страница. Лучше - потому что если ошибки есть в исходных данных, то можно заново выдать эту же форму с уже введенными данными и предложить их скорректировать. И лучше, если будут ПОСТ-данные отправлены.
2. Если данные верны, то сохраняем их (файлы, БД - куда угодно). Затем делаем header( "Refresh..."), в процессе показываем инфо о том, что данные приняты. И в этом рефреше указываем ту страницу, куда надо попасть в итоге. Тут можно указать GET-данные для правильности перехода.
Если ты хочешь посмотреть, как это работает, то обрати внимание на то, как наш форум работает после нажатия кнопки "Отправить" Именно так и работает, как я описал чуть выше.
Спустя 3 минуты, 46 секунд (24.08.2012 - 11:39) Invis1ble написал(а):
у варианта с refresh есть один "фатальный" недостаток - это время, после которого редирект идет. Т.е. если юзер в момент перед редиректом отвернется или покурить пойдет - он не увидит волшебную надпись "данные сохранены" )
Спустя 4 минуты, 43 секунды (24.08.2012 - 11:43) zvezda_t написал(а):
sergeiss, спасибо, что еще раз затронул эту тему!
Один момент, только не поняла:
Один момент, только не поняла:
Цитата |
в процессе показываем инфо о том, что данные приняты. |
это как - в процессе?
Спустя 5 минут, 32 секунды (24.08.2012 - 11:49) Invis1ble написал(а):
Цитата |
это как - в процессе? |
простейший пример
header('Refresh: 3; URL=http://example.com');
echo 'Данные сохранены';
Спустя 4 минуты, 45 секунд (24.08.2012 - 11:54) Игорь_Vasinsky написал(а):
аяксом, аяксом выводить результат в div c кнопочкой "x"
Спустя 14 минут, 16 секунд (24.08.2012 - 12:08) zvezda_t написал(а):
Invis1ble
попробовала) прикольно) Спасибо!!!
попробовала) прикольно) Спасибо!!!
Спустя 29 минут, 6 секунд (24.08.2012 - 12:37) sergeiss написал(а):
Цитата (Invis1ble @ 24.08.2012 - 13:49) |
простейший пример header('Refresh: 3; URL=http://example.com'); echo 'Данные сохранены'; |
Добавлю только, что еще надо обязательно exit(); сделать Иначе возможен вариант, что скрипт еще что-то выводит на страницу в течение того времени, что предназначено для переадресации.
Цитата (Invis1ble @ 24.08.2012 - 13:39) |
если юзер в момент перед редиректом отвернется или покурить пойдет - он не увидит волшебную надпись "данные сохранены" |
Значит, ему не повезло... Клювом клац-клац нихт! Опять же, можно сделать длительное время на переадресацию + разместить ссылку типа "Всё пучкОм, щас мы вас переадресуем, но если не хотите ждать, то жмякните тут...."
Спустя 18 минут, 25 секунд (24.08.2012 - 12:55) zvezda_t написал(а):
Placido, а ничего что в CodeIgniter данные сессии через куки организованы?
Если куки будут отключены - проблем у меня с сохранением не будет?
Если куки будут отключены - проблем у меня с сохранением не будет?
Спустя 39 минут, 7 секунд (24.08.2012 - 13:34) johniek_comp написал(а):
zvezda_t
сессии вообще на куках построены, и CI тут ни причем
сессии вообще на куках построены, и CI тут ни причем
Спустя 4 минуты, 40 секунд (24.08.2012 - 13:39) zvezda_t написал(а):
johniek_comp, на сколько я понимаю обычные $_SESSION[] храняться на сервере, а в CI - используются куки хранящиеся у клиента.
Спустя 11 минут, 41 секунда (24.08.2012 - 13:51) killer8080 написал(а):
Цитата (sergeiss @ 24.08.2012 - 12:35) |
Разница в одном: рефреш делает переадресацию с задержкой в течение указанного времени, а локейшн - сразу же. |
Что помешает юзеру во время ожидания рефреша нажать F5?
Спустя 21 минута, 57 секунд (24.08.2012 - 14:13) sergeiss написал(а):
Цитата (killer8080 @ 24.08.2012 - 15:51) |
Что помешает юзеру во время ожидания рефреша нажать F5? |
Психология помешает. Потому что одно дело, когда он видит готовую страничку с данными, а другое дело, когда только сообщение о том, что данные приняты и что его просят подождать чуть-чуть либо прямо предлагают нажать уже имеющуюся на этой странице ссылку. Мало кто будет нажимать Ф5 в такой ситуации.
Вот я сейчас нажму "Отправить" и увижу небольшой прямоугольник в центре экрана, с подобной надписью. При этом не появляется желания нажать Ф5.
PS. Можно и куки использовать дополнительно. Но куки могут не сработать, если отключены. А рефреш сработает всегда.
Спустя 4 минуты, 14 секунд (24.08.2012 - 14:17) killer8080 написал(а):
Цитата (sergeiss @ 24.08.2012 - 15:13) |
Психология помешает. |
Не самое лучшее решение, надятся что у юзера мышление такое же как разработчика Вероятность остаётся. Здесь я предлагал способ защиты от F5, а попутно и CSRF
Спустя 5 минут, 33 секунды (24.08.2012 - 14:22) zvezda_t написал(а):
а что правда $_SESSION[] это и есть куки? У меня что то мозг взрывается...
Спустя 2 минуты, 43 секунды (24.08.2012 - 14:25) killer8080 написал(а):
zvezda_t
стандартный механизм сессий использует куки для передачи идентификатора сессии (хотя это не единственный способ).
стандартный механизм сессий использует куки для передачи идентификатора сессии (хотя это не единственный способ).
Спустя 8 часов, 24 минуты, 1 секунда (24.08.2012 - 22:49) Invis1ble написал(а):
johniek_comp
Ну так что там насчет моего гона? Или лишь бы ляпнуть?
Ну так что там насчет моего гона? Или лишь бы ляпнуть?
Спустя 7 часов, 43 минуты, 42 секунды (25.08.2012 - 06:33) Guest написал(а):
Когда это было, чтобы с отключенными куками сессии не работали?
Спустя 22 минуты, 32 секунды (25.08.2012 - 06:55) Invis1ble написал(а):
всегда. $_GET['PHPSESSID'] например
_____________
Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)