как отключить массив сообщений?

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

<?php if(isset($_POST['submit'])) { $name = $_POST['name']; echo "User name : <b> $name </b>"; } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="text" name="name"><br> <input type="submit" name="submit" value="Submit Form"><br> </form> 

Related of "как отключить массив сообщений?"

Если вы отправите форму и затем обновите результирующую страницу, браузер повторно разместит форму (обычно сначала запрашивает). Вот почему данные POST всегда присутствуют.

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

В форме:

 <input type="hidden" name="time" value="<?php echo $time; ?>" /> 

В PHP:

 session_start(); if(isset($_POST['submit'])) { if(isset($_SESSION['time']) && $_SESSION['time'] == $_POST['time']) { echo "User name : <b> $name </b>"; } } $time = $_SESSION['time'] = time(); 

Другим вариантом является перенаправление после обработки данных сообщения:

 if(isset($_POST['submit'])) { ... ... header('Location: ' . basename($_SERVER['PHP_SELF'])); exit(); } 

Из одной формы вы не сможете проверить, было ли это обновление, или первым отправить, независимо от использования метода GET или POST.

Чтобы обеспечить одно сообщение, вам необходимо:

а. перенаправлять пользователя в другое место после обработки запроса.

 if(isset($_POST['submit'])) { // process data header("Location: new-url"); } 

И отобразите сообщение на другом URL-адресе.

б. установите переменную cookie / session, в которой указано, что форма уже обработана.

 if(isset($_POST['submit']) && !isset($_SESSION['form_processed'])) { $_SESSION['form_processed'] = true; } 

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

Вам нужно сохранить состояние, показывающее, было ли $name уже отображено или нет. Самый простой способ – это сохранить это состояние в cookie браузера.

 <?php $nonce = $_COOKIE['nonce']; $new_nonce = mt_rand(); setcookie('nonce', $new_nonce); if(isset($_POST['submit']) && $_POST['nonce'] == $nonce) { $name = $_POST['name']; echo "User name : <b> $name </b>"; } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="hidden" name="nonce" value="<?php echo $new_nonce ?>"> <input type="text" name="name"><br> <input type="submit" name="submit" value="Submit Form"><br> </form> 

Проблемы

  • вы загрязняете пользовательскую «сессию» устаревшей переменной.
  • это сломается, если ваш пользователь откроет несколько окон (или вкладок) на одну и ту же страницу. Чтобы исправить это, вам придется изменить cookie nonce в массив nonces и обновить его соответствующим образом.

если вы хотите обновить страницу после подачи заявки

 <form method="get" 

конечно, если в вашей форме не так много данных, а также нужно использовать $ _GET вместо переменной $ _POST 🙂 правильный путь для вас, но эта логика не очень хорошая, нужно реорганизовать этот скрипт:

 <?php if(isset($_POST['submit'])) { $name = $_POST['name']; echo "User name : <b> $name </b>"; unset($_POST['submit']); } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="text" name="name"><br> <input type="submit" name="submit" value="Submit Form"><br> </form> с <?php if(isset($_POST['submit'])) { $name = $_POST['name']; echo "User name : <b> $name </b>"; unset($_POST['submit']); } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="text" name="name"><br> <input type="submit" name="submit" value="Submit Form"><br> </form>