Як запобігти повторному надсиланню форми під час оновлення сторінки (F5 / CTRL + R)


132

У мене проста форма, яка подає текст до моєї таблиці SQL. Проблема полягає в тому, що після подання користувачем тексту він може оновити сторінку, і дані надходять знову, не заповнюючи форму знову. Я можу перенаправити користувача на іншу сторінку після надсилання тексту, але я хочу, щоб користувачі залишалися на одній сторінці.

Я пам’ятаю, що читав щось про те, щоб дати кожному користувачеві унікальний ідентифікатор сеансу та порівняти його з іншим значенням, яке вирішило проблему, яку я маю, але забув, де він є.



1
Чому ви не хочете перенаправляти користувача на іншу сторінку?
Адам

@Adam: Оскільки це зайве, щоб зробити ще один запит на сервер, який, у свою чергу, знову отримає деякі дані з БД. Але це витрачається на ресурси, оскільки ми вже отримуємо всі необхідні дані під час обробки POSTзапиту
Євген Конков

@EugenKonkov у шаблоні PRG, ви просто перенаправляєте на сторінку, на якій відображається повідомлення про успіх. Подальше отримання даних з БД не потрібно.
Адам

@Adam: Ви також можете відобразити весь запис, створений за допомогою POSTданих. У цьому випадку вам потрібно SELECTвід DB. Наприклад, коли ви створюєте рахунок-фактуру, ви переспрямовуєтесь, на /invoices/53яку відображаєте весь рахунок-фактуру, а не лише "успіх"
Євген Конков

Відповіді:


96

Використовуйте шаблон публікації / перенаправлення / отримання. http://en.wikipedia.org/wiki/Post/Redirect/Get

На своєму веб-сайті я зберігатиму повідомлення у файлі cookie чи сесії, перенаправлятимуся після публікації, читатиму файли cookie / сеансу, а потім очищатимуть значення сеансу чи змінної cookie.


1
Це робить хром непридатним для розвитку, де бізнес вимагає лише посади!
Джон Петерс

26
Якщо ви використовуєте шаблон PRG, то ви фактично залишаєте сторінку правильно? Не було питання, як змусити роботу працювати, коли не перенаправлятись?
Адам

1
Мені здається, що якщо ви перенаправляєте на ту саму сторінку, тоді $ _POST буде очищено. Наскільки я розумію, це був бажаний ефект. У будь-якому випадку це був МОЙ бажаний ефект. Я думаю, що відповідь була б кращою, якби вона зробила це явним.
donutguy640

Добре працює, моя єдина рекомендація - переконатися, що ви включите суворе тестування на помилки, щоб ви ловували помилки локально під час розробки, інакше вони можуть залишитися непоміченими.
Моріс

Не відповідає на запитання. Не впевнений, чому це прийнята відповідь.
YungGun

124

Я також хотів би зазначити, що ви можете використовувати підхід javascript, window.history.replaceStateщоб запобігти повторній подачі на оновлення та кнопку назад.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

Доказ концепції тут: https://dtbaker.net/files/prevent-post-resubmit.php

Я б все-таки рекомендував підхід Post / Redirect / Get, але це нове рішення JS.


1
Дякую, @dtbaker, це приголомшливо :)
Гуфран Хасан

1
Tks, ця робота ідеально підходить для мене, просто потрібно було створити сторінку 404, щоб уникнути непорозумінь з користувачем
tess hsu

Просто дивовижно. Thankyou
user4906240

2
він не працює в сафарі, він змінив href, але все одно зберігає дані з поштовим запитом для подання
Vo Thanh Tung

Це працювало для мене дякую! Чому ви рекомендуєте підхід до PRG?
iJassar

16

Ви дійсно повинні використовувати шаблон для перенаправлення на пост, щоб отримати справу з цим, але якщо ви якось опинилися в положенні, де PRG не є життєздатним (наприклад, сама форма знаходиться в включенні, запобігаючи переадресації), ви можете хешировать деякі параметри запиту створити рядок на основі вмісту, а потім перевірте, чи ви його ще не надіслали.

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

Дякуємо, що поділилися, але це, здається, не працює. Оновлення сторінки дійсно повторно подає форму для мене. Можливо, мені щось не вистачає?
aLearner

Оновлення сторінки повторно подасть все, але ми вирішимо лише обробити дані подання, якщо вони відрізняються від даних, надісланих минулого разу (які ми зберігаємо в сесії var 'messageIdent'). Ви обробляєте подання форми в пункті "якщо messageIdents відрізняються" (тобто де "do_your_thang ()"?
Moob

Спасибі за Вашу відповідь. Я в кінцевому підсумку просто реалізував шаблон "Повідомлення / переадресація / отримання", тож зараз я не пам'ятаю, що саме мене спонукало. Ще раз дякую за обертання назад.
aLearner

Цей метод не призначений для блокування повторної подачі ... але для виявлення повторної подачі, щоб ви могли змінити код, щоб він не робив те, що ви робили, якби це було новим поданням. Іншими словами: за допомогою цього методу ви можете виявити "оригінальне" подання та розмістити свої дані. Якщо воно НЕ оригінальне, не розміщуйте свої дані. Або покажіть попередження "спроба обдури" або, можливо, замість цього покажіть "підтвердження"
TheSatinKnight

Для цього ви повинні розпочати сеанс, додавши session_start();на початку файлу. w3schools.com/php/php_sesions.asp говорить Примітка. Функція session_start () повинна бути першим у вашому документі. Перед будь-якими тегами HTML.
wkille

16

Я використовую цей рядок JavaScript для блокування спливаючого вікна з проханням про повторну подачу форми на оновлення після подання форми.

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

Просто розмістіть цей рядок у нижній частині нижнього колонтитулу свого файлу та побачите магію


Була б непогана версія цього варіанту, яку неможливо відключити з боку клієнта, але вона коротка, проста, швидка ... і робити все, що для цього потрібно. Зберігає історію, щоб користувач міг повернутися назад, не відсилаючи публікацію.
Péter Vértényi

16

Ви можете запобігти повторному надсиланню форми за допомогою змінної сеансу.

Спочатку потрібно встановити rand()в текстовому полі та $_SESSION['rand']на сторінці форми:

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

Після цього перевірте значення $_SESSION['rand']текстового поля, $_POST['randcheck']як це:

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

3
ми можемо використовувати <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />замість цього
Микола Бронський

Так, ми можемо використовувати microtime (), а також time () також замість rand (), будь-яку функцію чи змінну, яка дає інше значення, ми можемо використовувати. Але переконайтесь, що ви встановили це значення на змінну SESSION. тут СЕСІЯ повинна перевірити поле randcheck та не допустити повторної подачі форми.
Савоо

чи не слід очищати змінну сеансу після перевірки, чи відповідають сеанс і пост vars?
DeNoise

1
@denoise Я вважаю, що ідея @Savoo полягає в тому, що після $_POSTданих форми ця сторінка перезавантажує повторно налаштування змінних сеансу та публікації. Також створення змінних має відбуватися після перевірки відповідності змінних. Тому unsetне потрібно.
Півмісяця

13

Коли форма обробляється, ви перенаправляєте на іншу сторінку:

... process complete....
header('Location: thankyou.php');

Ви також можете перенаправити на ту саму сторінку.

якщо ви робите щось на зразок коментарів і хочете, щоб користувач залишався на одній сторінці, ви можете використовувати Ajax для обробки форми подання форми


12

Я знайшов наступне рішення. Ви можете уникнути перенаправлення після обробки POSTзапиту, маніпулюючи historyоб'єктом.

Отже, у вас є форма HTML:

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

Коли ви обробляєте цю форму на своєму сервері, ви замість того, щоб перенаправляти користувача /the/result/page, встановивши Locationзаголовок так:

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

введіть тут опис зображення

Після обробки POSTданих ed ви отримуєте невеликий <script>результат/the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

<script>Ви повинні надавати:

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

Результат:

введіть тут опис зображення

як ви бачите, дані форми POSTредагуються до process.phpсценарію.
Цей скрипт опрацьовує POSTдані та /the/result/pageодночасно рендерінг із:

  1. немає перенаправлення
  2. немає оновлених POSTданих під час оновлення сторінки (F5)
  3. немає POSTпереходу на попередню / наступну сторінку через історію браузера

UPD

В якості іншого рішення я прошу функцію запитувати команду Mozilla FireFox, щоб дозволити користувачам налаштувати NextPageзаголовок, який буде працювати як Locationзаголовок і зробити post/redirect/getшаблон застарілим.

Коротко. Коли сервер обробляє POSTдані успішно, це:

  1. NextPageЗаголовок налаштування замістьLocation
  2. Надайте результат обробки POSTданих форми так, як це відображатиметься для GETзапиту за post/redirect/getшаблоном

Браузер по черзі бачить NextPageзаголовок:

  1. Відрегулюйте window.locationза NextPageзначенням
  2. Коли користувач оновить сторінку, браузер узгодить GETзапит NextPageзамість того, щоб повторно POSTформувати дані

Я думаю, що це було б чудово, якби це було здійснено, чи не так? =)


11
  1. Використовуйте заголовок і перенаправляйте сторінку.

    header("Location:your_page.php"); Ви можете перенаправити на одну і ту ж сторінку або іншу сторінку.

  2. Скасуйте $ _POST після вставлення його в базу даних.

    unset($_POST);


54
Скасування $ _POST взагалі не впливає на повторне надсилання форми, принаймні, не в Chrome.
Гевін

2
Це не спрацює. Коли користувач переходить на задню сторінку, він знову виконує налаштування змінних POST.
Сандху

У чому причина використання unset? Будь ласка, додайте до своєї відповіді якесь пояснення, щоб інші могли дізнатися з нього
Ніко Хааз,

7

Досить впевненим способом є реалізація унікального ідентифікатора в публікації та кешування його в

<input type='hidden' name='post_id' value='".createPassword(64)."'>

Потім у своєму коді зробіть це:

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

Я насправді просто написав щось подібне до цього, але не зіткнувся з проблемою створення пароля, я просто перерахував свої форми (наприклад: кроки 1-5), тож якщо вони рівні, ми круті рухатися далі, інакше не економте на db або надсилайте електронні листи. Але нехай користувач приземлиться, куди б він його забрав.
Фернандо Сільва

1
Я думаю, що це краще рішення, ніж перезавантажити сторінку, оскільки я показую повідомлення, коли повідомлення буде успішним та перезавантаженим, видалить повідомлення. це працює за мене, ви також можете використовувати uniqid
Julio Popócatl

6

Цей метод працює для мене добре, і я думаю, що це найпростіший варіант, який можна зробити цю роботу.

Загальна ідея - перенаправити користувача на деякі інші сторінки після подання форми, що зупинить повторну подачу форми на оновлення сторінки. Все-таки, якщо після подання форми вам потрібно утримувати користувача на одній сторінці, ви можете це зробити кількома способами, але тут я описую метод javascript.

Метод Javascript

Цей метод досить простий і блокує спливаюче вікно з проханням про повторну подачу форми на оновлення після подання форми. Просто розмістіть цей рядок коду javascript у нижній частині нижнього колонтитулу вашого файлу та побачите магію.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>


Це допомагає і мені
Анкіт

4

Javascript

Цей метод досить простий і блокує спливаюче вікно з проханням про повторну подачу форми на оновлення після подання форми. Просто розмістіть цей рядок коду javascript у нижній частині нижнього колонтитулу вашого файлу та побачите магію.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

3

Просто перенаправляйте його на ту саму сторінку після використання даних форми, і вона працює. Я спробував це.

header('location:yourpage.php');

4
Це просто повторення тієї ж відповіді, яку хтось дав роками раніше. (Насправді ще двоє!)
Нік Райс

Якщо ви дублюєте відповіді інших людей, вам слід хоча б додати трохи пояснень у свою відповідь, щоб зробити їх цікавими
Ніко Хааз,

3

Вдосконалена версія публікації Moob. Створіть хеш-код POST, збережіть його як cookie сеансу та порівняйте хеші кожного сеансу.

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

2

По суті, вам потрібно перенаправлятись із цієї сторінки, але це все ще може створити проблеми, коли ваш Інтернет повільний (перенаправлення заголовка з боку сервера)

Приклад базового сценарію:

Клацніть на кнопку подання двічі

Спосіб вирішення

  • Сторона клієнта

    • Вимкнути кнопку для надсилання після натискання на неї клієнта
    • Якщо ви використовуєте Jquery: Jquery.one
    • PRG Шаблон
  • Сторона сервера

    • Використання диференційованої хешування часової позначки / часової позначки при надсиланні запиту.
    • Використовуйте запити жетонів. Коли основні навантаження завантажуються, призначають тимчасовий запит на токен, який у разі повторення ігнорується.

2

Як запобігти повторному надсиланню форми php без перенаправлення. Якщо ви використовуєте $ _SESSION (після session_start) та форму $ _POST, ви можете зробити щось подібне:

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

У вашій формі html розмістіть це:

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

Отже, кожного разу при подачі форми формується новий акт, зберігається в сесії та порівнюється з актом після публікації.

Ps: якщо ви використовуєте форму Get, ви можете легко змінити всі POST за допомогою GET, і це також працює.


1

Після вставлення його в базу даних викличте метод unset (), щоб очистити дані.

unset ($ _ POST);

Щоб уникнути оновлення даних, зробіть перенаправлення сторінки на ту саму сторінку чи іншу сторінку після вставки запису.

заголовок ('Місцезнаходження:'. $ _ SERVER ['PHP_SELF']);


1
Будь ласка, додайте до своєї відповіді якесь пояснення, щоб інші могли дізнатися з нього - навіщо unsetпотрібен цей дзвінок? Що буде, якби ви пропустили його?
Ніко Хааз

0

Використання шаблону "Опублікувати / перенаправити / отримати" з відповіді Кеверва - хороша ідея. Однак ви не можете залишитися на своїй сторінці (а я думаю, що саме про це ви просили?) Крім того, іноді це може бути невдало :

Якщо веб-користувач оновлюється до завершення первинної подачі через відставання сервера, що призводить до повторного запиту HTTP POST у певних агентах користувача.

Іншим варіантом буде зберігання в сеансі, якщо текст повинен бути записаний у вашу базу даних SQL таким чином:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0

Як говорили інші, не можна використовувати пост / перенаправлення / отримати. Але в той же час зробити те, що ви хочете зробити на сервері, досить просто.

На своїй сторінці POST ви просто підтверджуєте вхід користувача, але не дієте на нього, а скопіюєте його в масив SESSION. Потім ви знову перенаправляєтесь на головну сторінку подання. Ваша основна сторінка подання починається з перевірки, чи існує масив SESSION, який ви використовуєте, і якщо це так, скопіюйте його в локальний масив і скасуйте його. Звідти ви можете діяти на це.

Таким чином ви виконуєте всю свою основну роботу лише один раз, досягаючи того, що хочете зробити.


0

Я шукав рішення, щоб запобігти повторній подачі у величезний проект згодом. Код дуже добре працює з $ _GET та $ _POST, і я не можу змінити поведінку елементів форми без ризику непередбачених помилок. Отже, ось мій код:

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

Це працює лише для того, щоб уникнути повторного надсилання $ _POST, а не $ _GET. Але це та поведінка, яка мені потрібна. Проблема повторного надсилання не працює з завантаженнями файлів!


0

Що для мене працює:

if ( !refreshed()) {
   //Your Submit Here
        if (isset( $_GET['refresh'])) {
            setcookie("refresh",$_GET['refresh'], time() + (86400 * 5), "/");
        }

    }    
}


function refreshed()
{
    if (isset($_GET['refresh'])) {
        $token = $_GET['refresh'];
        if (isset($_COOKIE['refresh'])) {
            if ($_COOKIE['refresh'] != $token) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}  


function createToken($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

?>

І у вашій формі

 <form  action="?refresh=<?php echo createToken(3)?>">



 </form>

0

Цей form.phpзразок показує, як правильно використовувати PRG (коли форма дійсна чи ні).

  • Він переспрямовується на ту саму сторінку, лише коли форма дійсна і виконується дія.
  • Перенаправлення захищає форму від повторного надсилання на оновлення сторінки.
  • Він використовує сеанс, щоб не втратити повідомлення про успіх, які ви хочете показати, коли форма дійсна.
  • Існує дві кнопки для тестування: "Дійсне подання", "Недійсне подання". Спробуйте обидва і оновіть сторінку після цього.
<?php
session_start();

function doSelfRedirect()
{
  header('Location:'.$_SERVER['PHP_SELF']);
  exit;
}

function setFlashMessage($msg)
{
  $_SESSION['message'] = $msg;
}

function getFlashMessage()
{
  if (!empty($_SESSION['message'])) {
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
  } else {
    $msg = null;
  }

  return $msg;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Validation primitive example.
  if (empty($_POST['valid'])) {
    $formIsValid = false;
    setFlashMessage('Invalid form submit');
  } else {
    $formIsValid = true;
  }

  if ($formIsValid) {
    // Perform any actions here.
    // ...

    // Cool!
    setFlashMessage('Form is valid. Action performed.');

    // Prevent form resubmission.
    doSelfRedirect();
  }
}
?>
<h1>Hello form</h1>

<?php if ($msg = getFlashMessage()): ?>
  <div><?= $msg ?></div>
<?php endif; ?>

<form method="post">
  <input type="text" name="foo" value="bar"><br><br>
  <button type="submit" name="invalid" value="0">Invalid submit</button>
  <button type="submit" name="valid" value="1">Valid submit</button>
</form>

-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

Будь ласка, додайте до своєї відповіді якесь пояснення, щоб інші могли навчитися з неї - звідки $everything_fineберуться?
Ніко Хааз

-3

Чому б просто не використовувати $_POST['submit']змінну як логічний вислів, щоб зберегти все, що є у формі. Ви завжди можете перенаправляти на ту ж сторінку (в разі , якщо вони освіжать, і коли вони потрапили go backв браузері, то відправити повідомлення Змінна не буде встановлено більше. Просто переконайтеся , що кнопка відправити має nameі idз submit.


1
Погляньте на en.wikipedia.org/wiki/Post/Redirect/Get ! Це правильний підхід
jan267
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.