перенаправить на текущую страницу, если пользователь щелкает назад или обновляет страницу - PullRequest
0 голосов
/ 24 января 2012

Извините, я отправил этот вопрос, и я все еще гуглил его. Я не могу решить эту проблему

У меня есть страница php, которая имеет форму, и когда пользователь нажимает кнопку Обновить или F5, она создает повторяющиеся значения в базе данных иТакже пользователю отправляется сообщение, указывающее, что повторная отправка может вставить повторяющиеся значения в базу данных. Мой босс не хочет, чтобы окно оповещения обозревателя пользователю, а также вставка повторяющихся значений в базу данных

Я знаю, что это header().Я прочитал много header() в руководстве по php, а также server_name функций, но все же я пытался во многих отношениях поставить верх, но не могу решить.это очень важно.Может кто-нибудь, пожалуйста, помогите мне с примером кода, объясняющим способ сделать. Любая помощь очень ценится.

 <form method="post" action"demo.php">
  <input name="fname" type="text">
  <input type="submit" value="submit">
 </form>
 demo.php
  <?php
   $firstname = $_POST['fname'];
   ?>

Скажите, что я должен добавить на странице demo.php, чтобы он не отправлял формуснова и снова, а также, если пользователь нажимает кнопку «Назад» в браузере, он не должен переходить на предыдущую страницу, он все равно должен перенаправлять на текущую страницу.

Поэтому, если пользователь нажимает кнопку «Обновить» или «Назад», он должен перенаправлять на текущую страницу.только и не должны вставлять дублирующиеся значения, а также окно предупреждения должно быть отключено. Пожалуйста, объясните мне, что делать здесь, я в глубокой помощи. Спасибо

Ответы [ 6 ]

1 голос
/ 24 января 2012

Вы должны опубликовать уникальный идентификатор (session_id) и сохранить его в базе данных. Когда вы регистрируетесь, проверьте, присутствует ли session_id. Если это так, отправьте сообщение пользователю. "Вы уже опубликовали эту форму"

код:

<?php session_start; ?>
    <form method="post" action"demo.php">
      <input name="fname" type="text">
      <input type="submit" value="submit">
      <input type="hidden" name="session_id" value="<?php echo session_id();?>">
     </form>
     demo.php
      <?php
      //test session_id in database
      $session_id = session_id();
      mysql_connect('localhost','xxx','xxx');
      mysql_select_db('xxx');
      $return = mysql_query("SELECT COUNT(*) AS nb_data FROM TABLENAME WHERE session_id='".session_id()."'");
      $data = mysql_fetch_assoc($return);
      if ($data['nb_data'] == 0){
            echo 'Your message';
      }
      else{       
            $firstname = $_POST['fname'];
            //.....
            header('location:xxx.php')?
      }
?>
1 голос
/ 24 января 2012

В вашем коде много чего плохого и много способов смягчить воздействие.

Во-первых, почему вы создаете дублирующиеся записи?Помимо проблемы плохих данных также подразумевается, что ваш сайт уязвим для CSRF.Прочтите о том, как предотвратить CSRF с помощью одноразовых токенов.

Если у вас проблемы с производительностью на вашем сайте, то пользователи часто нажимают на кнопку «Отправить» несколько раз.Решая проблему дублирования отправки в базе данных, используйте javascript, чтобы отключить ссылки отправки на странице и предоставьте визуальную информацию о том, что страница что-то делает.

Перенаправления не являются способом решения проблемы.

Мой босс не хочет, чтобы окно оповещения браузера

Вы говорите о двойном оповещении?Хотя вы можете обойти это с помощью PRG, это создает другие проблемы.

0 голосов
/ 24 января 2012

Я бы использовал функцию заголовка php для замены текущего местоположения, поэтому, если пользователь нажимает кнопку «Обновить», он не будет повторно отправлять информацию и сеанс для сохранения опубликованного значения и проверки повторных представлений.demo.php

<?php
session_start();
if($_POST)
{
    if(!isset($_SESSION[fname]))
    {
        //database queries here
    }
    $_SESSION[fname] = $_POST['fname'];
    header('location:demo.php', true);  //true replaces the current location
}elseif(!issset($_SESSION[fname])){
    header('location:form.php');
}

$firstname = $_SESSION[fname];

?>

form.php

<form method="post" action"demo.php">
  <input name="fname" type="text">
  <input type="submit" value="submit">
 </form>
0 голосов
/ 24 января 2012

То, что вы хотите - это вставить идентификатор сеанса в форму при его создании и отслеживать этот идентификатор сеанса на сервере.Затем, когда форма отправлена ​​и вы обрабатываете форму на сервере, если форма была отправлена ​​более одного раза, вы можете перезаписать первую отправку в вашей базе данных или ответить сообщением об ошибке или чем-то еще.(Показывать всплывающее окно только при первой отправке, что угодно.)

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

0 голосов
/ 24 января 2012

Решением будет перенаправление страницы после операций с базой данных, таких как вставка, обновление и удаление имя страницы: test.php

if(isset($_REQUEST['deleteBtn']))
{
$emp_id=$_REQUEST['emp_id'];
$count=mysql_query("delete from employees where emp_id=$emp_id");
header("location:test.php");
}

Таким образом, если вы нажмете F5 или кнопку «Назад», данные формы больше не будут опубликованы.

0 голосов
/ 24 января 2012

Вам нужен ON DUPLICATE KEY, это обновит запись, а не создаст ее копию: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html поэтому не имеет значения, нажмете ли они на обновление или повторную отправку, если запись уже существует, она просто обновится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...