Chủ Nhật, 7 tháng 6, 2026

Redirect sau submit form đúng cách (Khi bạn bấm Submit một lần... nhưng dữ liệu được lưu hai lần)

Bạn đã bao giờ có suy nghĩ: "Đặt 1 mà được giao 4, chắc tính mở sạp bán hàng online luôn quá!"

Rất tiếc là  nhận 4 thì phải...trả tiền cho cả 4 chứ không có chuyện "miễn phí"! Bạn tạo form.

Tên
Email
Số điện thoại

Người dùng bấm:

Submit

PHP báo:

Lưu thành công 😎

Trong một buổi sáng đẹp trời, mới ăn một tô phở tái nạm gầu tuyệt vời, làm ly cà phê thơm phức, người dùng thấy vui.

Bèn nhấn:

F5

PHP:

Lưu thành công 😎

lần nữa.


Database:

Nguyễn Văn A
Nguyễn Văn A

🤡


Người dùng tiếp tục:

F5

Database:

Nguyễn Văn A
Nguyễn Văn A
Nguyễn Văn A

💀


Nếu đây là đơn hàng:

1 đơn
2 đơn
3 đơn

thì bạn bắt đầu thấy hơi run 😭


Redirect sau submit là gì?


Redirect sau submit là kỹ thuật giúp:

  • tránh gửi lại form nhiều lần
  • tránh dữ liệu bị insert trùng
  • tránh lỗi refresh (F5)
  • cải thiện trải nghiệm người dùng

Trong PHP, kỹ thuật phổ biến nhất là:

POST

Process

Redirect

GET

Được gọi là:

PRG
(Post Redirect Get)



Ví dụ đau lòng, không muốn nghe 😭

Form đăng ký:

<?php

if($_SERVER['REQUEST_METHOD']=='POST')
{
mysqli_query($conn,$sql);

echo "Đăng ký thành công";
}

?>

Mọi thứ có vẻ ổn.


Cho tới khi người dùng:

F5

Trình duyệt hỏi:

Resubmit form?

Người dùng (vô thức):

Yes

PHP:

INSERT lần nữa 😎

Database:

💀💀💀


Ví dụ đời thường 🍜

Hãy tưởng tượng:

Bạn gọi:

1 tô mì Quảng

Nhân viên:

Đã ghi nhận.

Bạn vô tình nhấn F5 ngoài đời.


Quán mang ra:

2 tô
3 tô
4 tô

😭


Đó chính là duplicate submit.


Vì sao chuyện này xảy ra? 😵

Sau khi submit:

Browser vẫn nhớ:

POST request

Khi F5:

Browser gửi lại POST.


PHP không biết:

Đây là lần đầu
hay lần thứ 10

Nó chỉ biết:

Có POST
→ xử lý

😅


Cách người mới thường làm 😭

<?php

if(isset($_POST['submit']))
{
mysqli_query($conn,$sql);

echo "Success";
}

?>

Chạy được.


Nhưng:

F5 = insert lại

Cách đúng 😎

Sau khi xử lý xong:

<?php

if(isset($_POST['submit']))
{
mysqli_query($conn,$sql);

header("Location: success.php");

exit;
}

?>

Lúc này:

POST

INSERT

REDIRECT

GET

Khi F5:

GET

không phải:

POST

nữa.

😎


PRG là gì? 😎

PRG:

Post
Redirect
Get

Là mô hình được dùng bởi:

  • Facebook
  • Shopee
  • Lazada
  • Amazon
  • Gmail

và gần như mọi website lớn.


Luồng sai 😭

POST

INSERT

Hiển thị kết quả

F5:

POST lại

💀


Luồng đúng 😎

POST

INSERT

REDIRECT

GET

Hiển thị kết quả

F5:

GET lại

😎


Lỗi cực phổ biến 😭

❌ Quên exit

Ví dụ:

header("Location: success.php");

Nhưng bên dưới vẫn còn code.


Nên dùng:

header("Location: success.php");
exit;

❌ Echo trước header

echo "Success";

header("Location: success.php");

👉 Header Already Sent 🤡


❌ Redirect về chính trang nhưng không thoát

Dễ gây hành vi khó đoán.


Một sự thật...biết rồi, khổ lắm, nói mãi 😎

Rất nhiều website trông có vẻ:

Submit xong hiện kết quả ngay

Nhưng thực tế phía sau là:

POST

REDIRECT

GET

Bạn không nhận ra vì redirect diễn ra trong tích tắc.


Debug kiểu dev thật 😎

✅ Kiểm tra Network

Trong DevTools:

F12

Bạn sẽ thấy:

POST
302 Redirect
GET

Đó là dấu hiệu PRG hoạt động đúng.


✅ Kiểm tra database

Submit:

1 lần

F5:

không được thêm bản ghi mới

Nếu vẫn thêm:

PRG chưa hoạt động.


Checklist "Chuẩn không cần chỉnh" 😎

☐ Đã dùng POST chưa?

☐ Sau INSERT có redirect không?

☐ Có dùng:

exit;

không?

☐ Có echo trước header không?

☐ F5 có tạo thêm dữ liệu không?

☐ Đã kiểm tra database chưa?


FAQ nhanh

Redirect sau submit có bắt buộc không?

→ Không.

Nhưng gần như luôn nên dùng.


Redirect có làm mất dữ liệu POST không?

→ Có 😅

Và đó chính là mục đích.


Làm sao vừa redirect vừa giữ dữ liệu?

→ Dùng:

$_SESSION

Vì sao website lớn ít bị insert trùng?

→ Vì họ dùng:

PRG
(Post Redirect Get)

Bạn có thể cũng đang gặp 😭

👉 Form reload mất dữ liệu

👉 Header Already Sent

👉 Session không hoạt động

👉 Login đúng password nhưng vẫn fail

👉 PHP không nhận dữ liệu POST/GET

👉 MySQL INSERT không chạy


Tổng kết

Nếu sau khi submit form bạn thấy:

F5

Database có thêm dữ liệu

thì website đang thiếu một kỹ thuật rất quan trọng:

POST

REDIRECT

GET

(PRG)

Đây là một trong những thói quen nhỏ nhưng giúp website chuyên nghiệp hơn rất nhiều.

Và cũng là thứ ngăn người dùng vô tình đặt 5 tô mì Quảng chỉ vì nhấn F5 hai lần. 😄🍜