PHP ngăn gửi biểu mẫu trùng lặp
Ở nhiều trang web gửi dữ liệu biểu mẫu, rất dễ gặp phải tình huống người dùng quay lại trang trước khi biểu mẫu được gửi qua nút quay lại của trình duyệt và sau đó gửi biểu mẫu nhiều lần Show Để tránh gửi dữ liệu trùng lặp, bạn có thể sử dụng JavaScript để thêm một đoạn mã đơn giản bên trong thẻ đầu của trang web để vô hiệu hóa trình duyệt ghi lại lịch sử JavaScript:window.history.forward(1); Sau đó, trình duyệt có thể bị vô hiệu hóa việc ghi lại lịch sử của trang trước để ngăn người dùng gửi dữ liệu trùng lặp Phiên PHP có thể được sử dụng để ngăn nhiều lần chèn khi gửi biểu mẫu. Phiên PHP đặt biến phiên (giả sử $_SESSION['posttimer']) đặt dấu thời gian hiện tại trên POST. Trước khi xử lý biểu mẫu trong PHP, biến $_SESSION['posttimer'] được kiểm tra sự tồn tại của nó và kiểm tra sự khác biệt về dấu thời gian cụ thể (giả sử 2 hoặc 3 giây). Bằng cách này, những phần chèn thực sự trùng lặp có thể được xác định và loại bỏ hình thức đơn giản - // form.html Tham chiếu đến 'my_session_file. php' ở trên sẽ có các dòng mã bên dưới - Thí dụif (isset($_POST) && !empty($_POST)) { if (isset($_SESSION['posttimer'])) { if ( (time() - $_SESSION['posttimer']) <= 2) { // less then 2 seconds since last post } else { // more than 2 seconds since last post } } $_SESSION['posttimer'] = time(); } đầu raĐiều này sẽ tạo ra đầu ra sau - The unique form submitted data. Biến phiên posttimer được đặt và khi có chênh lệch thời gian từ 2 giây trở xuống trước thao tác POST cuối cùng, nó có thể bị xóa. Nếu không thì nó được lưu trữ. Hàm thời gian được gọi và giá trị được gán cho biến phiên posttimer Khi gửi biểu mẫu HTML, có thể mất vài giây trước khi biểu mẫu được gửi thành công và trang phản hồi hiển thị. Mọi người có thể nhập viện và nhấp vào nút Gửi nhiều lần, điều này có thể dẫn đến việc gửi biểu mẫu trùng lặp. Thông thường, đó không thực sự là vấn đề, nhưng trong một số trường hợp, bạn có thể muốn ngăn điều này xảy ra Dưới đây, bạn sẽ tìm thấy hai thủ thuật đơn giản để ngăn chặn việc gửi trùng lặp, bạn có thể sử dụng một trong hai thủ thuật này hoặc kết hợp cả hai » ngăn gửi nhiều biểu mẫu bằng Javascript Sử dụng Javascript để chặn các lần gửi trùng lặp có lẽ là cách dễ nhất. Khi ai đó gửi biểu mẫu, chúng tôi chỉ cần tắt nút Gửi và có thể thay đổi giá trị của nó thành một giá trị mang tính mô tả hơn, chẳng hạn như "Đang gửi, vui lòng đợi. " Hãy thử nhấp vào nút này chẳng hạn. Nó sẽ vẫn bị vô hiệu hóa cho đến khi bạn tải lại trang này Bước đầu tiên là cung cấp cho nút gửi của bạn một id duy nhất, ví dụ: id="myButton" Bước thứ hai (và cuối cùng) là cung cấp hai lệnh Javascript cho nhãn. Cái đầu tiên sẽ yêu cầu trình duyệt tắt nút gửi sau khi biểu mẫu đã được gửi và cái thứ hai sẽ thay đổi văn bản nút để cung cấp cho người dùng một số ý tưởng về những gì đang xảy ra. Đây là mã để thêm vào thẻ biểu mẫu của bạn.onsubmit="document.getElementById('myButton').disabled=true; document.getElementById('myButton').value='Submitting, please wait...';" Thẻ biểu mẫu của bạn sau đó sẽ trông giống như Đó là nó. Thủ thuật này sẽ hoạt động trong hầu hết các trình duyệt hiện đại (IE 5+, FireFox, Opera,. ) » ngăn gửi nhiều biểu mẫu bằng cookie Nếu bạn muốn tránh gửi trùng lặp trong toàn bộ phiên trình duyệt (hoặc lâu hơn), bạn có thể cân nhắc sử dụng cookie. Ví dụ: chỉnh sửa tập lệnh xử lý biểu mẫu của bạn để gửi cookie tới trình duyệt sau khi biểu mẫu đã được xử lý nhưng trước khi bất kỳ tiêu đề chuyển hướng hoặc HTML nào được in. Đặt mã này sau lệnh mail() sẽ hoạt động trong hầu hết các trường hợp setcookie('FormSubmitted', '1'); Sau đó kiểm tra cookie trước khi xử lý. Nếu có thì khách truy cập này đã gửi biểu mẫu trong phiên trình duyệt đang hoạt động. Thêm mã này vào đầu tập lệnh xử lý biểu mẫu của bạn if (isset($_COOKIE['FormSubmitted'])) { die('You may only submit this form once per session!'); } Đó là nó Đây là cách tập lệnh cuối cùng từ hướng dẫn biểu mẫu php của chúng tôi sẽ trông như thế nào nếu được sửa đổi để chặn các lần gửi trùng lặp bằng cookie. Lưu ý rằng một số mã đã được thêm vào đầu tập lệnh và mã in cookie sau khi gọi hàm mail() ________số 8_______» Thông báo bản quyền © 2008-2023 myPHPform. com. Đã đăng ký Bản quyền. Sao chép hoặc phân phối lại bất kỳ phần nào của trang web này mà không có sự cho phép bằng văn bản của chúng tôi đều bị nghiêm cấm Đôi khi, người dùng có thể nhấn nút gửi hai lần hoặc người dùng có thể tải lại trang (với dữ liệu bài đăng), cả hai hoạt động đều khiến biểu mẫu phải xử lý nhiều lần với cùng một dữ liệu, dẫn đến bản ghi trùng lặp trong DB hoặc Email trùng lặp trong Hộp thư đến Để tránh hành vi này trong PHP, chúng tôi sẽ bao gồm một mã thông báo duy nhất trên mỗi yêu cầu bài đăng, phương pháp này cũng hữu ích để ngăn chặn các cuộc tấn công CSRF và phát lại. chúng tôi sẽ bao gồm khóa duy nhất được tạo trong biểu mẫu, trường ẩn và biến phiên. Sau khi biểu mẫu được gửi, chúng tôi sẽ so sánh giá trị trường ẩn với giá trị mã thông báo phiên, nếu cả hai giá trị khớp với biểu mẫu, việc gửi biểu mẫu là hợp lệ, nếu mã thông báo không khớp với mã thông báo trong phiên của bạn, biểu mẫu đã được gửi lại Cách tạo mã thông báoTrong ví dụ này, hàm PHP
Cho tôi xem logicchỉ cần sao chép đoạn mã trên và dán nó vào trang biểu mẫu. sau đó tạo một trường ẩn bên trong biểu mẫu như hình bên dưới
Trong trang xử lý biểu mẫu, chúng tôi sẽ so sánh mã thông báo như hình bên dưới
Hoàn thành ví dụDưới đây là tập lệnh mẫu đã hoàn thành để ngăn gửi nhiều biểu mẫu trong PHP
|