2009-04-06 2 views
13

я следующий код на моем сайте (с помощью PHP и Smarty), чтобы попытаться избежать форм повторной передачи, когда я ударил f5:избежать форм повторной передачи в PHP при нажатии f5

if ($this->bln_added == false) { 
    if (isset($_POST['submit'])) { 
     $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']); 
     $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']); 
    } 
} else { 
    $this->obj_site->obj_smarty->assign('title', ''); 
    $this->obj_site->obj_smarty->assign('desc', ''); 
    unset($_POST); 
} 

bln_added ложен по умолчанию, но изменяется на true, как только форма успешно отправлена. Заголовки переменных smarty и desc используются в шаблоне, чтобы сохранить содержимое формы там, если есть ошибка пользователя, и им нужно изменить то, что они ввели.

Если форма отправлена ​​успешно, она устанавливает bln_added = true, поэтому второй бит кода должен не только очищать поля формы, но и пустые $ _POST. Но если я нажму f5, данные сообщения все еще там.

Любые идеи?

ответ

38

Ваш метод может работать в теории, но есть гораздо более простой способ.

После отправки формы выполните перенаправление. Неважно, где, но это очистит $ _POST.

header('Location: http://www.example.com/form.php'); 

В вашем случае это звучит так, будто вы хотите перенаправить на страницу, на которой вы уже находитесь. Добавьте URL-адрес $ _GET в URL-адрес, если вы хотите отобразить сообщение с подтверждением.

Надеется, что это помогает,

Том

+3

Великий ответ, PRG, безусловно, путь: http://en.wikipedia.org/wiki/Post/Redirect/Get –

+0

мне нужен полный URL для заголовка Do? – wheresrhys

+0

Просто попробовал, и это противоречит заголовку, установленному где-то еще в приложении. Я не писал все, поэтому не знаю, куда пойти, чтобы остановить его настройку. – wheresrhys

6

Лучший способ обработки форм - использовать самообучение и перенаправление. Что-то вроде этого:

if (isset($_POST)) { 
    // Perform your validation and whatever it is you wanted to do 
    // Perform your redirect 
} 

// If we get here they didn't submit the form - display it to them. 

Использование CodeIgniter framework:

function index() { 
    $this->load->library('validation'); 
    // Your validation rules 

    if ($this->form_validation->run()) { 
    // Perform your database changes via your model 
    redirect(''); 
    return; 
    } 
    // The form didn't validate (or the user hasn't submitted) 
    $this->load->view('yourview'); 
} 
0

Заголовка перенаправления после поста является необходимым, но недостаточным.

На стороне PHP после успешной отправки формы выполните перенаправление. Например. header ('Местоположение: http://www.example.com/form.php');

Но этого недостаточно. Некоторые пользователи дважды нажимают ссылки (doubleclick). Требуется JavaScript, который отключил бы кнопку отправки после первого щелчка.

1

Я решил эту (в РНР) по:

  1. в виде добавить уникальный идентификатор (ID + счетчик) не в зависимости от времени() (!!!)

  2. запись в отдельный файл (postform.PHP), который проверяется на сессию с этим уникальным идентификатором

  3. а) если сессия с уникальным идентификатором не найдена: запись в базу данных и заполнить сессию с уникальным идентификатором

    б) если была найдена сессия с уникальным идентификатором нет: ничего не делать

  4. после либо 3a/3b перенаправлять привести страницу с заголовком ('Location: http://mydomain.com/mypage')

Результат:
не повторите действия по оба обновлению/BackButton и только повторно предупреждение о двойном щелчке BackButton (но не Resubmit действия)

+0

Спасибо, Пауль, у меня есть основная идея, почему мы не должны использовать отправку формы на той же странице.Предыдущие времена я использовал форму submit на той же странице. После обработки формы я перенаправляю ее на себя с некоторым параметром get. –

1

Использование заголовка места после успешных после действия

header('Location: '.$_SERVER['HTTP_REFERER']); 
2

Вы можете переписать свою форму, не отправим в AJAX -путь. Если вам нужно показать HTML-контент, верните его в JSON-формате и вставьте с помощью JavaScript (например, jQuery).

1

Это работает для меня, если я использую либо заголовок(), либо exit() в конце моего кода , например, после сохранения некоторых данных.

1

Лучший способ, который я нашел, - использовать javascript и css. Общий заголовок метода перенаправления php ('Location: http://www.yourdomain.com/url); будет работать, но это вызовет предупреждение «Внимание: Не удается изменить информацию в заголовке - заголовки уже прислал» в различных структур и СЦИ, как WordPress, Drupal и т.д. Так что мое предложение следовать ниже код

echo '<style>body{display:none;}</style>'; 
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
exit; 

Тег стиль имеет важное значение в противном случае пользователь может почувствовать, что страница загружена дважды. Если мы используем тег стиля с дисплеем тела none, а затем обновляем страницу, то пользовательский интерфейс будет таким же, как и заголовок php («Местоположение: ....);

Я надеюсь, что это поможет :)

0

Попробуйте мою собственную, может быть, это не самое лучшее решение (сделано быстро), но я проверить его, и он работает. Протестировано в Chrome. Click to see how it looks BR

<?php 
session_start(); // Start session 
?> 
<html> 
<head> 
    <title> 
    Test 
    </title> 
</head> 
<body> 
    <form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post"> 
    <input type="text" name="name"><br> 
    <input type="submit" name="submit" value="Submit Form"><br> 
    </form> 

    <?php 

    if(isset($_POST['submit'])) 
    { 
    $_SESSION['name'] = $_POST['name']; // Assign $_POST value to $_SESSION variable 
     header('Location: refresh.php'); // Address of this - reloaded page - in this case similar to PHP_SELF 
    } else session_destroy(); // kill session, depends on what you want to do/maybe unset() function will be enough 

    if(isset($_SESSION['name'])) 
    { 
    $name = $_SESSION['name']; 

    echo "User Has submitted the form and entered this name : <b> $name </b>"; 
    echo "<br>You can use the following form again to enter a new name."; 
    } 
    ?> 
</body> 
</html> 
Смежные вопросы