2010-09-01 25 views
9

Tôi có một hình thức php đơn giản, như thế này:dạng Ngăn chặn khỏi bị nộp hai lần

<?php 

if(isset($_POST['myform'])) 
    // email... 
else 
    // display form 

vấn đề là nếu tôi làm mới trang sau khi tôi gửi biểu mẫu, nó được nộp hai lần. Làm cách nào để ngăn điều này xảy ra?

Trả lời

16

Bạn nên thực hiện một chuyển hướng đến một trang với một thông điệp rằng các dữ liệu được chèn ... và một nút quay lại để đi đến hình thức một lần nữa (nếu bạn muốn) ...

để chuyển hướng sử dụng PHP sử dụng header chức năng:

header('Location: http://www.example.com/'); 
+7

Điều này được gọi bằng cách gọi là [Post-Redirect-Get pattern] (http://en.wikipedia.org/wiki/Post/Redirect/Get). – BalusC

+1

cảm ơn. nhưng bây giờ tôi có một vấn đề khác :) Tôi đã thêm 'header ('Location: http://www.example.com/?formsent=1');', và tôi đang kiểm tra '$ _GET ['forment'] 'để hiển thị một thông điệp thành công. Vấn đề là nếu tôi làm mới trang tôi nhận được cùng một thông báo thành công :) – Alex

+1

và vấn đề là? ... tôi không thấy nó là một vấn đề, vì nó không thao tác bất kỳ dữ liệu nào trên DB. –

3

Thực hiện một chuyển hướng sau khi dữ liệu được đưa đến một trang xác nhận (có thể được thực hiện với header() tác này sẽ xóa các dữ liệu POST và cho phép làm mới mà không trùng lặp nội dung.

2

Trong trường hợp người dùng có độ trễ và anh ta nhấn nút gửi một vài lần, sau đó có thể sử dụng cơ chế phía máy khách, sử dụng js để đặt nút gửi để tắt sau khi được nhấp. nhưng sẽ phải hiển thị thông báo nói gần như một cái gì đó như, "gửi tin nhắn ... nếu không có trang phản hồi xin vui lòng tải lại và thử lại".

1
session_start();  
if (!$_SESSION['REQUEST_TYPE_USER_ID'] == $_POST) 
{ 
//your code 
//after the success process 
    $_SESSION['REQUEST_TYPE_USER_ID'] = $_POST; 
} 
else 
{ 
// request duplicated 
} 
+0

Vui lòng đưa ra một số giải thích về những gì đang xảy ra trong mã. Việc bán phá giá mã được cau mày tại đây. – rayryeng

Các vấn đề liên quan