Bagaimana mencegah pengiriman ulang formulir ketika halaman di-refresh (F5 / CTRL + R)

132

Saya memiliki formulir sederhana yang mengirimkan teks ke tabel SQL saya. Masalahnya adalah bahwa setelah pengguna mengirimkan teks, mereka dapat me-refresh halaman dan data akan dikirimkan lagi tanpa mengisi formulir lagi. Saya bisa mengarahkan pengguna ke halaman lain setelah teks dikirimkan, tetapi saya ingin pengguna tetap berada di halaman yang sama.

Saya ingat membaca sesuatu tentang memberikan setiap pengguna id sesi unik dan membandingkannya dengan nilai lain yang memecahkan masalah yang saya alami tetapi saya lupa di mana itu.

pengguna701510
sumber
1
Mengapa Anda tidak ingin mengarahkan pengguna ke halaman lain?
Adam
@ Adam: Karena ini berlebihan untuk melakukan permintaan lain ke server yang pada gilirannya akan mengambil beberapa data dari DB lagi. Tapi ini pemborosan sumber daya karena kami sudah mengambil semua data yang diperlukan saat memproses POSTpermintaan
Eugen Konkov
@EugenKonkov dalam pola PRG, Anda hanya perlu mengarahkan ulang ke halaman yang menunjukkan pesan sukses. Tidak perlu lagi mengambil DB.
Adam
@ Adam: Anda juga dapat menampilkan seluruh catatan yang dibuat dengan POSTmemasukkan data. Dalam hal ini Anda perlu SELECTdari DB. Misalnya ketika Anda membuat faktur, Anda diarahkan ke /invoices/53yang menampilkan seluruh faktur alih-alih hanya 'sukses'
Eugen Konkov

Jawaban:

96

Gunakan pola Post / Redirect / Get. http://en.wikipedia.org/wiki/Post/Redirect/Dapatkan

Dengan situs web saya, saya akan menyimpan pesan dalam cookie atau sesi, mengarahkan setelah posting, membaca cookie / sesi, dan kemudian menghapus nilai sesi atau variabel cookie itu.

Keverw
sumber
1
Ini membuat chrome tidak dapat digunakan untuk pengembangan di mana bisnis hanya membutuhkan pos!
John Peters
26
Jika Anda menggunakan pola PRG, maka Anda benar-benar meninggalkan halaman, bukan? Bukankah pertanyaannya bagaimana membuat hal-hal berfungsi ketika tidak mengarahkan?
Adam
1
Sepertinya saya bahwa jika Anda mengarahkan ulang ke halaman yang sama, maka $ _POST dihapus. Seperti yang saya pahami, itulah efek yang diinginkan. Lagipula, itulah efek yang diinginkanKU. Saya pikir jawabannya akan lebih baik jika dibuat eksplisit.
donutguy640
Berfungsi dengan baik, satu-satunya rekomendasi saya adalah untuk memastikan Anda mengaktifkan pengujian kesalahan yang ketat sehingga Anda menangkap kesalahan secara lokal saat mengembangkan, jika tidak mereka dapat diketahui.
Maurice
Tidak menjawab pertanyaan. Tidak yakin mengapa itu adalah jawaban yang diterima.
YungGun
124

Saya juga ingin menunjukkan bahwa Anda dapat menggunakan pendekatan javascript, window.history.replaceStateuntuk mencegah pengiriman kembali pada tombol refresh dan kembali.

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

Bukti konsep di sini: https://dtbaker.net/files/prevent-post-resubmit.php

Saya masih akan merekomendasikan pendekatan Post / Redirect / Get, tetapi ini adalah solusi JS baru.

dtbaker
sumber
1
Terima kasih, @dtbaker, ini luar biasa :)
Gufran Hasan
1
Tks, ini cocok untuk saya, hanya perlu membuat 404 halaman untuk menghindari kesalahpahaman pengguna
tess hsu
Cukup Luar Biasa. Terima kasih
user4906240
2
itu tidak bekerja di safari, itu berubah href tetapi tetap menyimpan data dengan permintaan posting untuk mengirimkan
Vo Thanh Tung
Ini bekerja untuk saya, terima kasih! Mengapa Anda merekomendasikan pendekatan PRG?
iJassar
16

Anda harus benar-benar menggunakan pola Post Redirect Get untuk menangani ini, tetapi jika Anda entah bagaimana berakhir pada posisi di mana PRG tidak layak (mis. Formulir itu sendiri termasuk, mencegah pengalihan), Anda dapat meng-hash beberapa parameter permintaan untuk membuat string berdasarkan konten dan kemudian memeriksa bahwa Anda belum mengirimnya.

//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!
    }
Moob
sumber
Terima kasih telah berbagi tetapi ini sepertinya tidak berhasil. Menyegarkan halaman memang mengirim ulang formulir untuk saya. Mungkin saya melewatkan sesuatu?
aLearner
Menyegarkan halaman akan mengirim ulang semuanya tetapi kami memilih hanya untuk memproses data pengiriman jika berbeda dari data yang dikirim terakhir kali (yang kami simpan di sesi var 'messageIdent'). Apakah Anda memproses pengiriman formulir dalam klausa 'jika messageIdents berbeda' (yaitu di mana 'do_your_thang ()' adalah)?
Moob
Terima kasih untuk balasan Anda. Saya akhirnya hanya menerapkan pola Post / Redirect / Get, jadi, saya tidak ingat sekarang apa yang sebenarnya membuat saya tersandung. Terima kasih lagi untuk berputar kembali.
aLearner
Metode ini tidak dimaksudkan untuk memblokir pengiriman ulang ... tetapi untuk Mendeteksi pengiriman ulang sehingga Anda dapat mengubah kode Anda untuk tidak "melakukan" apa pun yang akan Anda lakukan jika ini adalah pengiriman baru. Dengan kata lain: Dengan metode ini Anda dapat mendeteksi pengiriman "asli" dan menempatkan data Anda. Jika BUKAN asli, jangan tempatkan data Anda. Entah menampilkan peringatan "upaya penipuan" atau mungkin malah menampilkan "konfirmasi".
TheSatinKnight
Agar ini berfungsi, Anda harus sudah memulai sesi dengan menambahkan session_start();di awal file. w3schools.com/php/php_sessions.asp mengatakan Catatan: Fungsi session_start () harus menjadi hal pertama dalam dokumen Anda. Sebelum ada tag HTML.
wkille
16

Saya menggunakan baris javascript ini untuk memblokir pop up yang meminta pengiriman kembali form saat refresh setelah formulir dikirimkan.

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

Cukup letakkan baris ini di bagian bawah file Anda dan lihat keajaibannya

Mo'men Mohamed
sumber
Akan lebih baik versi ini yang tidak dapat dinonaktifkan dari sisi klien, tetapi pendek, mudah, cepat ... dan lakukan apa yang perlu dilakukan. Menyimpan riwayat sehingga pengguna dapat menavigasi kembali, tanpa mengirim ulang pos.
Péter Vértényi
16

Anda dapat mencegah pengiriman ulang formulir melalui variabel sesi.

Pertama, Anda harus mengatur rand()dalam kotak teks dan $_SESSION['rand']pada halaman formulir:

<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>

Setelah itu periksa $_SESSION['rand']dengan $_POST['randcheck']nilai kotak teks seperti ini:

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}
Savoo
sumber
3
kita dapat menggunakan <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />sebaliknya
Nikolay Bronskiy
Ya kita bisa menggunakan microtime () dan juga time () juga alih-alih rand (), fungsi atau variabel apa pun yang memberikan nilai berbeda kita bisa menggunakannya. TAPI pastikan bahwa Anda menetapkan nilai itu ke variabel SESI. di sini SESI adalah harus memeriksa dengan bidang randcheck dan untuk mencegah dari mengirimkan kembali formulir.
Savoo
bukankah variabel sesi harus dihapus setelah memeriksa apakah sesi dan post vars cocok?
denoise
1
@denoise Saya percaya idenya oleh @Savoo adalah setelah $_POSTdata formulir, halaman yang sama memuat ulang pengaturan ulang variabel sesi dan posting. Pembuatan variabel juga harus dilakukan setelah memeriksa apakah variabel cocok. Karena unsetitu tidak diperlukan.
Hmerman6006
13

Saat formulir diproses, Anda mengarahkan ulang ke halaman lain:

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

Anda juga dapat mengarahkan ke halaman yang sama.

jika Anda melakukan sesuatu seperti komentar dan Anda ingin pengguna tetap di halaman yang sama, Anda dapat menggunakan Ajax untuk menangani pengiriman formulir

Ibu
sumber
12

Saya menemukan solusi berikutnya. Anda dapat menghindari pengalihan setelah memproses POSTpermintaan dengan memanipulasihistory objek.

Jadi, Anda memiliki formulir HTML:

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

Saat Anda memproses formulir ini di server Anda, alih-alih mengarahkan pengguna /the/result/pagedengan mengatur Locationtajuk seperti ini:

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

masukkan deskripsi gambar di sini

Setelah mengolah POSTdata ed Anda membuat kecil <script>dan hasilnya/the/result/page

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

The <script>Anda harus membuat:

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

Hasilnya adalah:

masukkan deskripsi gambar di sini

karena Anda dapat melihat formulir data POSTdiedarkan ke process.phpskrip.
Script ini memproses POSTdata dan rendering /the/result/pagesekaligus dengan:

  1. tidak ada pengalihan
  2. tidak ada POSTdata saat Anda me-refresh halaman (F5)
  3. no re POSTketika Anda menavigasi ke halaman sebelumnya / berikutnya melalui riwayat browser

UPD

Sebagai solusi lain saya meminta fitur meminta tim Mozilla FireFox untuk memungkinkan pengguna untuk mengatur NextPageheader yang akan berfungsi sepertiLocation tajuk dan pembuatanpost/redirect/get pola usang.

Pendeknya. Ketika server memproses POSTdata dengan sukses, itu:

  1. Atur NextPagetajuk alih-alihLocation
  2. Berikan hasil pemrosesan POSTdata formulir karena akan membuat GETpermintaan dalam post/redirect/getpola

Browser pada gilirannya ketika melihat NextPagetajuk:

  1. Menyesuaikan window.location dengan NextPagenilai
  2. Saat pengguna me-refresh halaman, browser akan menegosiasikan GETpermintaan NextPagealih-alih kembaliPOST membentuk data

Saya pikir ini akan sangat baik jika diimplementasikan, bukan? =)

Eugen Konkov
sumber
11
  1. Gunakan tajuk dan arahkan ulang halaman.

    header("Location:your_page.php"); Anda dapat mengalihkan ke halaman yang sama atau halaman yang berbeda.

  2. Hapus $ _POST setelah memasukkannya ke Database.

    unset($_POST);

Prasanth Bendra
sumber
54
Tidak disetel $ _POST sama sekali tidak memengaruhi pengiriman ulang formulir, setidaknya tidak di Chrome.
Gavin
2
Itu tidak akan bekerja. Ketika pengguna kembali ke halaman belakang, ia melakukan pengaturan variabel POST sekali lagi.
Sandhu
Apa alasan penggunaannya unset? Silakan tambahkan beberapa penjelasan untuk jawaban Anda sehingga orang lain dapat belajar darinya
Nico Haase
7

Cara yang cukup pasti adalah dengan mengimplementasikan ID unik ke dalam pos dan menyimpannya di

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

Kemudian dalam kode Anda lakukan ini:

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;
}
Absolut
sumber
Saya sebenarnya hanya menulis sesuatu yang mirip dengan ini, tetapi tidak melalui kesulitan untuk membuat kata sandi, saya hanya menyebutkan formulir saya (misalnya: langkah 1-5), jadi jika mereka sama kita bisa bergerak, selain itu jangan simpan ke db atau mengirim email. Tapi biarkan pengguna mendarat di mana pun membawanya.
Fernando Silva
1
Saya pikir ini adalah solusi yang lebih baik daripada memuat ulang halaman, karena saya menunjukkan pesan ketika posting berhasil dan memuat ulang halaman akan menghapus pesan. ini bekerja untuk saya, Anda juga dapat menggunakan uniqid
Julio Popócatl
6

Metode ini bekerja dengan baik untuk saya, dan saya pikir ini adalah yang paling sederhana untuk melakukan pekerjaan ini.

Gagasan umum adalah untuk mengarahkan ulang pengguna ke beberapa halaman lain setelah pengiriman formulir, yang akan menghentikan pengiriman kembali formulir pada refresh halaman. Namun, jika Anda perlu menahan pengguna pada halaman yang sama setelah formulir dikirimkan, Anda dapat melakukannya dengan berbagai cara, tetapi di sini saya menjelaskan metode javascript.

Metode Javascript

Metode ini cukup mudah dan memblokir pop up yang meminta pengiriman kembali form pada refresh setelah formulir dikirimkan. Cukup letakkan baris kode javascript ini di bagian bawah file Anda dan lihat keajaibannya.

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

Tanmoy Datta
sumber
Ini membantu saya juga
Ankit
4

Javascript

Metode ini cukup mudah dan memblokir pop up yang meminta pengiriman kembali form pada refresh setelah formulir dikirimkan. Cukup letakkan baris kode javascript ini di bagian bawah file Anda dan lihat keajaibannya.

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

Arahkan ulang ke halaman yang sama setelah menggunakan data formulir, dan itu berfungsi. Saya sudah mencobanya.

header('location:yourpage.php');
Krsoni
sumber
4
Ini hanya mengulangi jawaban yang sama yang diberikan orang lain bertahun-tahun sebelumnya. (Faktanya dua lainnya!)
Nick Rice
Jika Anda menduplikasi jawaban orang lain, Anda setidaknya harus menambahkan beberapa penjelasan pada jawaban Anda untuk membuatnya menarik
Nico Haase
3

Versi halus dari posting Moob. Buat hash POST, simpan sebagai cookie sesi, dan bandingkan hash setiap sesi.

// 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
}
skibulk
sumber
2

Pada dasarnya, Anda perlu mengalihkan dari halaman itu tetapi masih dapat membuat masalah saat internet Anda lambat (Redirect header dari serverside)

Contoh skenario dasar:

Klik tombol kirim dua kali

Cara untuk memecahkannya

  • Sisi klien

    • Nonaktifkan tombol kirim setelah klien mengkliknya
    • Jika Anda menggunakan Jquery: Jquery.one
    • Pola PRG
  • Sisi server

    • Menggunakan timestamp hashing / timestamp berdasarkan diferensiasi ketika permintaan dikirim.
    • Gunakan token permintaan. Ketika utama dimuat menetapkan permintaan sementara untuk diputus yang jika diulang diabaikan.
ZenithS
sumber
2

Bagaimana mencegah pengiriman formulir php tanpa redirect. Jika Anda menggunakan $ _SESSION (setelah session_start) dan formulir $ _POST, Anda dapat melakukan sesuatu seperti ini:

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

Dalam formulir html Anda, taruh ini:

<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;
    }
}
?>

Jadi, setiap kali ketika formulir dikirimkan, tindakan baru dihasilkan, disimpan dalam sesi dan dibandingkan dengan tindakan posting.

Ps: jika Anda menggunakan formulir Get, Anda dapat dengan mudah mengubah semua POST dengan GET dan berfungsi juga.

Rômulo ZC Cunha
sumber
1

Setelah memasukkannya ke database, panggil metode unset () untuk menghapus data.

tidak disetel ($ _ POST);

Untuk mencegah penyisipan kembali data, lakukan pengalihan halaman ke halaman yang sama atau halaman berbeda setelah memasukkan catatan.

tajuk ('Lokasi:'. $ _ SERVER ['PHP_SELF']);

Thinesh
sumber
1
Harap tambahkan beberapa penjelasan untuk jawaban Anda sehingga orang lain dapat belajar darinya - mengapa unsetpanggilan itu diperlukan? Apa yang akan terjadi jika Anda melewatkannya?
Nico Haase
0

Menggunakan pola Post / Redirect / Get dari jawaban Keverw adalah ide yang bagus. Namun, Anda tidak dapat tetap berada di halaman Anda (dan saya pikir ini adalah apa yang Anda minta?) Selain itu, kadang-kadang mungkin gagal :

Jika pengguna web me-refresh sebelum pengiriman awal selesai karena kelambatan server, menghasilkan permintaan HTTP POST duplikat di agen pengguna tertentu.

Opsi lain adalah menyimpan dalam sesi jika teks harus ditulis ke database SQL Anda seperti ini:

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

    /* save $_POST values into SQL */
  }
}
Adam
sumber
0

Seperti yang dikatakan orang lain, tidak mungkin menggunakan post / redirect / get. Tetapi pada saat yang sama cukup mudah untuk melakukan apa yang ingin Anda lakukan di sisi server.

Di halaman POST Anda, Anda hanya memvalidasi input pengguna tetapi tidak menindaklanjutinya, sebaliknya Anda menyalinnya ke dalam array SESI. Anda kemudian mengarahkan kembali ke halaman pengiriman utama lagi. Halaman pengiriman utama Anda mulai dengan memeriksa untuk melihat apakah array SESSION yang Anda gunakan ada, dan jika demikian salin ke array lokal dan hapus pengaturannya. Dari sana Anda dapat menindaklanjutinya.

Dengan cara ini Anda hanya melakukan semua pekerjaan utama Anda sekali saja, mencapai apa yang ingin Anda lakukan.

Stu
sumber
0

Saya mencari solusi untuk mencegah pengiriman kembali dalam proyek besar sesudahnya. Kode ini sangat berfungsi dengan $ _GET dan $ _POST dan saya tidak bisa mengubah perilaku elemen formulir tanpa risiko bug yang tidak terduga. Jadi, ini kode saya:

<!-- 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"] );

Ini hanya berfungsi untuk menghindari pengiriman kembali $ _POST, bukan $ _GET. Tetapi ini adalah perilaku yang saya butuhkan. Masalah kirim ulang tidak berfungsi dengan unggahan file!

Andreas Rex
sumber
0

Apa yang Bekerja Untuk Saya adalah:

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;
}

?>

Dan dalam Formulir Anda

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



 </form>
NN73 Player
sumber
0

form.phpSampel ini menunjukkan cara menggunakan PRG yang benar (ketika formulir valid atau tidak).

  • Itu dialihkan ke halaman yang sama, hanya ketika formulir valid dan tindakan dilakukan.
  • Pengalihan melindungi formulir agar tidak dikirim kembali pada penyegaran halaman.
  • Ini menggunakan sesi untuk tidak kehilangan pesan sukses yang ingin Anda tampilkan ketika formulir valid.
  • Ada dua tombol untuk pengujian: "Kirim yang valid", "Kirim tidak valid". Coba keduanya dan segarkan halaman setelah itu.
<?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>
Jekis
sumber
-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}
Oleksii Semeniuk
sumber
Silakan tambahkan beberapa penjelasan untuk jawaban Anda sehingga orang lain dapat belajar darinya - dari mana datangnya $everything_fine?
Nico Haase
-3

Mengapa tidak menggunakan $_POST['submit']variabel sebagai pernyataan logis untuk menyimpan apa pun yang ada di formulir. Anda selalu dapat mengarahkan ke halaman yang sama (Dalam kasus mereka menyegarkan, dan ketika mereka memukul go backdi browser, submit variabel pos tidak akan ditetapkan lagi. Pastikan tombol submit Anda memiliki namedan iddari submit.

Brant
sumber
1
Lihatlah en.wikipedia.org/wiki/Post/Redirect/Dapatkan ! Ini adalah pendekatan yang tepat
jan267