Как избежать повторной отправки данных при обновлении в php

У меня есть страница index.php, где у меня есть ссылка под названием «add_users.php». В «add_users.php» я принимаю данные пользователя и возвращаюсь к той же странице «index.php», где информация поступает через пост-действие и вставляется в базу данных.

Когда я обновляю страницу или нажимаю кнопку «Назад», появляется окно повторной отправки. Я прошел через множество решений, где они попросили меня создать третью страницу. Я попытался сделать это следующим образом: после вставки значений в базу данных я перенаправил страницу как заголовок («Место: http://thisisawebsite.com/thankyou.php» , а в thankyou.php я снова перенаправил страницу на index.php. Но это привело к получению предупреждения как «Невозможно изменить информацию заголовка – заголовки, уже отправленные [….]»,

Что является лучшим решением?

Используйте ob_start (); в самой строке.

Приянка,

Ты на правильном пути. То, что вы пытаетесь реализовать, на самом деле является хорошо известным шаблоном, используемым в веб-разработке, называемым шаблоном POST / Redirect / GET . (Шаблон – это немного слова из-за шума, теперь, возможно, парадигма – лучшее слово для этого).

Обычная реализация этой модели / парадигмы состоит в том, чтобы просто иметь только одну точку входа.

Делая это, add_user.php теперь может выглядеть так (это все еще не самый элегантный, но, надеюсь, это даст вам представление о том, как его реализовать):

 <?php // is this a post request? if( !empty( $_POST ) ) { /* process the form submission and on success (a boolean value which you would put in $success), do a redirect */ if( $success ) { header( 'HTTP/1.1 303 See Other' ); header( 'Location: http://www.example.com/add_user.php?message=success' ); exit(); } /* if not successful, simply fall through here */ } // has the form submission succeeded? then only show the thank you message if( isset( $_GET[ 'message' ] ) && $_GET[ 'message' ] == 'success' ) { ?> <h2>Thank you</h2> <p> You details have been submitted succesfully. </p> <?php } // else show the form, either a clean one or with possible error messages else { ?> <!-- here you would put the html of the form, either a clean one or with possible error messages --> <?php } ?> 

Итак, как это работает в основном:

  • Если запрос к сценарию НЕ является запросом POST (т. Е. Форма не была отправлена), и нет ?message=success прилагаемого к URL-адресу, а затем просто показать чистую форму.
  • Если запрос, сделанный сценарию, является POST-запросом, обработайте форму.
    • Если обработка формы прошла успешно, снова перенаправляйтесь к тому же сценарию и добавьте ?message=success
      • Если запрос к скрипту – это запрос с ?message=success добавленным к нему, только покажите сообщение благодарности, не показывайте форму.
    • Если обработка формы завершилась неудачно, то пусть она «провалится» и снова отобразит форму, но на этот раз с некоторыми описательными сообщениями об ошибках и элементами формы, заполненными тем, что пользователь уже заполнил.

Надеюсь, это, наряду с примером, который я вам дал, имеет достаточный смысл.

Теперь причина, по которой вы получали печально известное Warning: headers already sent сообщения, объясняется в этом ответе, я задал другой вопрос о том, почему некоторые php-вызовы лучше поставить наверху скрипта (на самом деле это необязательно быть на вершине, но он должен быть вызван до выхода ANY (даже случайного) пробела).

Но получение предупреждения как нельзя изменить информацию заголовка – уже отправленные заголовки

Что-то не так с использованием буферизации вывода? Почему ваша страница отправляет заголовки, даже если она работает только в базе данных? У вас есть пробел или новая линия перед первым "

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

Я считаю, что использование сеансов – лучший способ предотвратить эту проблему

 session_start(); if(!isset($_SESSION['s'])){ $_SESSION['s'] = true; }; if( !empty( $_POST ) && ($_SESSION['s']) ) { //your code $_SESSION['s'] = false; } 

Впоследствии вы можете использовать unset($_SESSION['s']) или destroy_session() если вы хотите, чтобы пользователи могли публиковать что-то снова.

Тот же вызов, с которым я столкнулся, используя окно комментариев, я сделал, чтобы перенаправить страницу на ту же страницу и на конкретный «якорь». Пример:

 <form id="myForm" action="<?php echo $_SERVER['PHP_SELF'];?>#myForm" method="post"> <!--Stuff for form in here --> </form> 

Тогда для кода PHP у меня есть:

 <?php //Do your stuff and when finished... $reloadpage = $_SERVER['PHP_SELF']."#myForm"; header("Location:$reloadpage"); exit(); ?> 

Это позволяет избежать повторной отправки F5 данных из формы

Использовать meta refresh

<% meta http-equiv = "refresh" content = "5; url = http://example.com/ " /> "во время вашего успешного сообщения после добавления данных в БД.

может быть его трюк, чтобы избежать перезагрузки.

Тханкс, Гоби.

Использовать это

window.location.href = 'название вашей страницы'