10/10/2018, 10:38

[help] re submit khi bấm nút back!

Em đang làm một cái guestbook, cái mà lúc ngùo7i ta điền vào vá nhấn submit hay reload thì có cái thông báo nói là phải gửi ại hết mấy thông tin............ làm đi làm lại thì có thêm 1 bài y hệt trong data!

Em thấy cái VBB mình gửi bài rồi bấm back, reload, nó đâu có hiện ra như vậy!? Làm cách nào vậy mọi ngùo7i!

Làm ơn giúp em với, thank!
honnhienh viết 12:48 ngày 10/10/2018
up cho nó mới nè. cũng thắc mắc như bác chờ 2 hôm nay chưa ai comment.
vnntech.com viết 12:42 ngày 10/10/2018
Cái đó thì mình hay làm như này
1. khống trế bằng primary key cho data do, khi no save vao roi ma no refresh lại thì lúc đó nó bị duplicate key, thì nó sẽ ko lưu thêm vào được lần nữa.

2. khi save xong cho nó load lại page bằng redirec lại cái page đó luôn như vậy nó sẽ không còn lưu lại sự kiện submit

tham khảo vậy nhé....
thuyduongcd viết 12:45 ngày 10/10/2018
Ở trang nhận action, khi get được thông tin, trước khi lưu vào DB cần kiểm tra thông tin này trong DB, xem đã có record nào giống hệt những thông tin này chưa. Nếu chưa thì tiến hành insert vào, còn có rồi nghĩa là đã bị resubmit. Khi đó thì hiện câu thông báo hoặc bỏ qua thao tác insert
honnhienh viết 12:49 ngày 10/10/2018
Được gửi bởi thuyduongcd
Ở trang nhận action, khi get được thông tin, trước khi lưu vào DB cần kiểm tra thông tin này trong DB, xem đã có record nào giống hệt những thông tin này chưa. Nếu chưa thì tiến hành insert vào, còn có rồi nghĩa là đã bị resubmit. Khi đó thì hiện câu thông báo hoặc bỏ qua thao tác insert
quá trình này kiểm tra cũng không ộn lắm. nếu mà số lượng lớn thì hơi đuối. tôi thường làm sau khi insert song là cho nó nhay qua trang khác luôn. ở trang này muốn in gì thì in hi hi. Cũng mới nghĩ tới cách un_set mấy cái biến post or get di nhưng chưa thử. lúc nào đó thử mới được.
@vnntech.com cach đó cũng ộn tôi làm cái đăng ký theo cách đó thấy chạy ộn.
thuyduongcd viết 12:44 ngày 10/10/2018
tôi thường làm sau khi insert song là cho nó nhay qua trang khác luôn
Cho dù nhảy đi đâu đi nữa thì nếu muốn người ta vẫn có thể back lại để cho nó duplicate.
khống trế bằng primary key cho data do, khi no save vao roi ma no refresh lại thì lúc đó nó bị duplicate key, thì nó sẽ ko lưu thêm vào được lần nữa.
duplicate key như vậy sẽ sinh lỗi trong câu lệnh. Khác nào tự mình bẫy lỗi mình.
Thứ hai, rất khó để tìm một primary key cho phù hợp. Vi dụ bảng comment cho blog đi, bạn sẽ sử dụng field nào làm key?
langtuquy viết 12:44 ngày 10/10/2018
Dùng trigger và procedure/function để mySQL tự kiểm tra điều kiện INSERT có vẻ là giải pháp toàn diện cho vấn đề này.
Code:
DROP TRIGGER IF EXISTS `insert_record`;
DELIMITER //
CREATE TRIGGER `insert_record` BEFORE INSERT ON `table`
 FOR EACH ROW BEGIN

	CALL check_insert(NEW.field_1, NEW.field_2, NEW.field_3, NEW.field_2);
END
//
DELIMITER $$

DROP PROCEDURE IF EXISTS `check_insert`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_insert`(field_1 type, field_2 type, field_3 type, field_4 type)
BEGIN

	DECLARE check INT;



	SELECT count(*)

	INTO check

	FROM table

	WHERE `field1` = field_1 AND `field2` = field_2 AND `field3` = field_3 AND `field4` = field_4;


	IF (check = 0) THEN

		INSERT INTO `table`(field1, field2, field3, field4)

		VALUES (field_1, field_2,field_3, field_4);



	ELSE

		SELECT CONCAT('Khong the chen vao bang');

	END IF;



END$$

DELIMITER ;
honnhienh viết 12:52 ngày 10/10/2018
Được gửi bởi thuyduongcd
Cho dù nhảy đi đâu đi nữa thì nếu muốn người ta vẫn có thể back lại để cho nó duplicate.
mới access trang bạn có kiểm tra isset một giá trị trong $_POST hoặc $_GET mà.
thuyduongcd viết 12:52 ngày 10/10/2018
Với $_GET thì khi back lại, url vẫn giữ nguyên, do đó $_GET vẫn tồn tại.
Với $_POST, khi back lại, trình duyệt sẽ hiển thị hộp thoại yêu cầu xác nhận việc post lại data mà người dùng ít ai chịu đọc (có thể vì lười hoặc đọc cũng không hiểu) nên cứ OK cho xong. Vậy là $_POST vẫn có tác dụng.
hocvui.net viết 12:52 ngày 10/10/2018
Oh thì nếu kiểm tra record cũng được, chỉ là một số cấu trúc phải dùng tới cái cột id tự tăng lên. Làm như vậy cũng không được!

Em giải quyết vấn đề suy nghĩ hết cả nagỳ trời, tạm thời thì hơi ổn ổn rồi! này bằng cách:

Đặt code xử lý vào ngay cái trang có cái form
1. Ở đaọn code chèn vào cSDL sẽ check 1 biến sesion A và biến $_POST B có bằng nhau hay không mới chèn(2 biến này ở ngay bước sau)
2. Ngay khi load trang lấy ngay biến thời gian, đặt thời gian đó cho 1 biến session A và 1 input type hidden B

Trường hợp người dùng bấn nút Submit, tất nhiên ở giai đoạn 1 biến sesion A đã được đặt giá trị, và biến $_POST['B'] củng vậy, 2 thằng này nó bằng nhau! Sau khi SUbmit biến sesion A được đặt giá trị ngay lập tức, còn biến $_POST['B'] chỉ được đặt giá trị khi tiếp tục nhấn Sumit.

Nếu mà người dùng reload hay bấm back, cả cái mãng POST được gửi lai6 là mảng củ, sẽ không thực hiện được vụ isnert!
PHP Code:
if($_POST***91;'time'***93;==$_SESSION***91;'time'***93;) {
    
//SQl Query

$now time();
$_SESSION***91;'time'***93; = $now;
//Html//
echo '
<form action="#" method="pots">
<input type="hidden" name="time" vaule="'
.$now.'" />
</form>'

Thử thì chưa thấy lỗ thủng nào, mọi người nghĩ sao về phương pháp này!?
Bài liên quan
0