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.
POST
permintaanPOST
memasukkan data. Dalam hal ini Anda perluSELECT
dari DB. Misalnya ketika Anda membuat faktur, Anda diarahkan ke/invoices/53
yang menampilkan seluruh faktur alih-alih hanya 'sukses'Jawaban:
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.
sumber
Saya juga ingin menunjukkan bahwa Anda dapat menggunakan pendekatan javascript,
window.history.replaceState
untuk mencegah pengiriman kembali pada tombol refresh dan kembali.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.
sumber
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.
sumber
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.Saya menggunakan baris javascript ini untuk memblokir pop up yang meminta pengiriman kembali form saat refresh setelah formulir dikirimkan.
Cukup letakkan baris ini di bagian bawah file Anda dan lihat keajaibannya
sumber
Anda dapat mencegah pengiriman ulang formulir melalui variabel sesi.
Pertama, Anda harus mengatur
rand()
dalam kotak teks dan$_SESSION['rand']
pada halaman formulir:Setelah itu periksa
$_SESSION['rand']
dengan$_POST['randcheck']
nilai kotak teks seperti ini:sumber
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
sebaliknya$_POST
data formulir, halaman yang sama memuat ulang pengaturan ulang variabel sesi dan posting. Pembuatan variabel juga harus dilakukan setelah memeriksa apakah variabel cocok. Karenaunset
itu tidak diperlukan.Saat formulir diproses, Anda mengarahkan ulang ke halaman lain:
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
sumber
Saya menemukan solusi berikutnya. Anda dapat menghindari pengalihan setelah memproses
POST
permintaan dengan memanipulasihistory
objek.Jadi, Anda memiliki formulir HTML:
Saat Anda memproses formulir ini di server Anda, alih-alih mengarahkan pengguna
/the/result/page
dengan mengaturLocation
tajuk seperti ini:Setelah mengolah
POST
data ed Anda membuat kecil<script>
dan hasilnya/the/result/page
The
<script>
Anda harus membuat:Hasilnya adalah:
karena Anda dapat melihat formulir data
POST
diedarkan keprocess.php
skrip.Script ini memproses
POST
data dan rendering/the/result/page
sekaligus dengan:POST
data saat Anda me-refresh halaman (F5)POST
ketika Anda menavigasi ke halaman sebelumnya / berikutnya melalui riwayat browserUPD
Sebagai solusi lain saya meminta fitur meminta tim Mozilla FireFox untuk memungkinkan pengguna untuk mengatur
NextPage
header yang akan berfungsi sepertiLocation
tajuk dan pembuatanpost/redirect/get
pola usang.Pendeknya. Ketika server memproses
POST
data dengan sukses, itu:NextPage
tajuk alih-alihLocation
POST
data formulir karena akan membuatGET
permintaan dalampost/redirect/get
polaBrowser pada gilirannya ketika melihat
NextPage
tajuk:window.location
denganNextPage
nilaiGET
permintaanNextPage
alih-alih kembaliPOST
membentuk dataSaya pikir ini akan sangat baik jika diimplementasikan, bukan?
=)
sumber
Gunakan tajuk dan arahkan ulang halaman.
header("Location:your_page.php");
Anda dapat mengalihkan ke halaman yang sama atau halaman yang berbeda.Hapus $ _POST setelah memasukkannya ke Database.
unset($_POST);
sumber
unset
? Silakan tambahkan beberapa penjelasan untuk jawaban Anda sehingga orang lain dapat belajar darinyaCara yang cukup pasti adalah dengan mengimplementasikan ID unik ke dalam pos dan menyimpannya di
Kemudian dalam kode Anda lakukan ini:
sumber
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.
sumber
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.
sumber
Arahkan ulang ke halaman yang sama setelah menggunakan data formulir, dan itu berfungsi. Saya sudah mencobanya.
sumber
Versi halus dari posting Moob. Buat hash POST, simpan sebagai cookie sesi, dan bandingkan hash setiap sesi.
sumber
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
Sisi server
sumber
Bagaimana mencegah pengiriman formulir php tanpa redirect. Jika Anda menggunakan $ _SESSION (setelah session_start) dan formulir $ _POST, Anda dapat melakukan sesuatu seperti ini:
Dalam formulir html Anda, taruh ini:
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.
sumber
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']);
sumber
unset
panggilan itu diperlukan? Apa yang akan terjadi jika Anda melewatkannya?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 :
Opsi lain adalah menyimpan dalam sesi jika teks harus ditulis ke database SQL Anda seperti ini:
sumber
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.
sumber
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:
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!
sumber
Apa yang Bekerja Untuk Saya adalah:
Dan dalam Formulir Anda
sumber
form.php
Sampel ini menunjukkan cara menggunakan PRG yang benar (ketika formulir valid atau tidak).sumber
sumber
$everything_fine
?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 memukulgo back
di browser, submit variabel pos tidak akan ditetapkan lagi. Pastikan tombol submit Anda memilikiname
danid
darisubmit
.sumber