каждый раз, когда я обновляю страницу, и получаю то же значение, которое хранится в массиве 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>
Если вы отправите форму и затем обновите результирующую страницу, браузер повторно разместит форму (обычно сначала запрашивает). Вот почему данные 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>
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>