Как отобразить сообщение об успешном завершении отправки формы без изменения URL? - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть сайт PHP (с CodeIgniter), который включает в себя регистрационную форму.У меня есть страница с некоторыми подробностями, которая ссылается на форму на отдельной странице.Форма отправляет на третий URL-адрес, который выполняет обработку, и перенаправляет на первую страницу, если она прошла успешно (или страницу формы, если нет).

В настоящее время я добавляю параметр для успеха: example.com/page?success=1, который показываетсообщение об успехе.Проблема в том, что некоторые люди делятся этим URL (и нажимают кнопку «Нравится» в Facebook), поэтому, когда другой пользователь открывает этот URL, он видит сообщение «Спасибо за регистрацию!»что они, очевидно, еще не сделали.

Я думал, что это был стандартный способ создания форм (отправка на один URL и перенаправление на другой), но есть ли лучший способ?Я не хочу отправлять обратно на ту же страницу, потому что при попытке перезагрузить страницу вы получите предупреждение POSTDATA.

Ответы [ 5 ]

3 голосов
/ 15 февраля 2012

У вас есть три способа сделать это

  • То, как вы используете
  • На самом деле не перенаправляет, но отправляет запросы с AJAX
  • СЕССИЯ (или, в крайнем случае, печенье)

Если вы решите использовать SESSION, вы можете просто присвоить переменной сеанса значение true

$_SESSION['registered'] = true; 

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

if (isset($_SESSION['registered'])) { 
      unset($_SESSION['registered']); 
      // shot the message
}
2 голосов
/ 15 февраля 2012

Обычно вы устанавливаете свой флаг успеха в сеансе, чтобы отображать это сообщение при загрузке следующей страницы.Обычно это называется флэш-сообщением.Затем вы проверите значение / наличие этого флага сеанса и покажете свое сообщение или нет.В большинстве фреймворков для этого есть встроенная функциональность, которая включает в себя очистку флага при следующем запросе, так что сообщение отображается только после того, как было сгенерировано действие.

из CI Документация по сеансам :

CodeIgniter поддерживает «флэш-данные» или данные сеанса, которые будут доступны только для следующего запроса к серверу, а затем автоматически очищаются.Они могут быть очень полезны и обычно используются для информационных сообщений или сообщений о состоянии (например, «запись 2 удалена»).

Примечание: переменным Flash предшествует «flash_», поэтому избегайте этого префикса в своем собственном сеансеnames.

Чтобы добавить флэш-данные:

$this->session->set_flashdata('item', 'value');

Вы также можете передать массив в set_flashdata () так же, как set_userdata ().

Чтобы прочитатьПеременная flashdata:

$this->session->flashdata('item');

Если вы обнаружите, что вам необходимо сохранить переменную flashdata с помощью дополнительного запроса, вы можете сделать это с помощью функции keep_flashdata ().

$this->session->keep_flashdata('item');
0 голосов
/ 15 февраля 2012

HTML:

 <form method="post">
     <input type="text">
     <input name="submitted" type="submit">
 </form>

PHP:

if($_POST['submitted']{
    //post was submitted process it

    if(/*whatever you're doing to the form succeeds*/){
        //show success
    }
}

POST не будет отображать переменные в URL.

0 голосов
/ 15 февраля 2012

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

Кроме того, это может быть обработано через AJAX, но это будет вторым шагом к правильной проверке на странице обработки формы

0 голосов
/ 15 февраля 2012

Несколько решений здесь, одним из них было бы проверить отправку формы и, если она не была отправлена, перенаправить на страницу с формой на ней.

т.е.:

<?php
 if (isset($_POST['submit']))
    {
    // process the form
    }
else
    {
    //redirect to the form itself
    header( 'Location: http://www.yourform.com' ) ;
    }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...