Không có gì bực mình hơn việc hì hục viết vài trang tài liệu, chưa kịp lưu lại, đứng lên làm ly cà phê, một ai đó "động tay chân" vào máy tính và làm công sức mấy tiếng đồng hồ "đổ sông đổ bể".
Nếu bạn mới học PHP, có thể bạn đã từng gặp tình huống:Điền đầy đủ:
- Họ tên
- Số điện thoại
- Địa chỉ
- Nội dung góp ý
Nhấn:
Submit
PHP kiểm tra.
Phát hiện:
Email không hợp lệ
Trang reload.
Và...
Toàn bộ dữ liệu biến mất.
Người dùng:
Tôi gửi thông tin rồi mà?😐
Lập trình viên:
Có thấy gì đâu...?😨
Form reload là gì?
Ví dụ:
<form method="post">
Khi nhấn Submit:
Browser gửi request tới server.
PHP xử lý.
Sau đó trang được tải lại.
Cho tới lúc này, đây là hành vi hoàn toàn bình thường.
Vấn đề nằm ở đâu?
Người mới thường nghĩ:
PHP đã nhận dữ liệu rồi mà?
Đúng.
PHP nhận được.
Nhưng sau khi xử lý xong.
Biến mất.
Kiểu như đi siêu thị, trả tiền cho thu ngân xong, ung dung đội tiền thừa thối lại...Thu ngân thì ngước nhìn khách với cặp mắt "trong sáng"...đợi khách trả tiền...
Ví dụ:
$name = $_POST['name'];
Request kết thúc.
Biến:
$name
cũng kết thúc theo.
Triệu chứng thường gặp
Người dùng nhập:
Tên: Nguyễn Văn A
Email: abc@gmail.com
Điện thoại: 090...
Submit.
PHP báo:
Email đã tồn tại, nhưng cần "chỉnh lại một chút"
Nhưng form:
Tên:
Email:
Điện thoại:
trống trơn.
Người dùng lúc này bắt đầu học võ...tức như "bò đá"
Nguyên nhân số 1: Không đổ dữ liệu trở lại form
Ví dụ:
<input type="text" name="name">
Form sẽ luôn trống.
Cần làm:
<input
type="text"
name="name"
value="<?php echo $_POST['name'] ?? ''; ?>">
Khi reload.
Dữ liệu sẽ quay lại.
Toán học của sự bực bội
Form có:
2 trường
Người dùng còn kiên nhẫn.
Form có:
20 trường
Dữ liệu mất.
Người dùng:
Alt + F4 (Bye bye!!)
Nguyên nhân số 2: Validation thất bại
Ví dụ:
if(empty($_POST['email']))
{
echo "Email bắt buộc";
}
Thông báo hiện.
Nhưng dữ liệu không được giữ lại.
Người dùng phải nhập lại từ đầu.
Cách đơn giản nhất
Ví dụ:
$name = $_POST['name'] ?? '';
Sau đó:
<input
type="text"
name="name"
value="<?php echo htmlspecialchars($name); ?>">
Mỗi lần reload.
Giá trị vẫn còn.
Nguyên nhân số 3: Redirect sau Submit
Ví dụ:
header("Location:index.php");
Khi redirect.
Toàn bộ POST biến mất.
Đây là hành vi bình thường.
Không phải lỗi PHP.
Vì sao?
POST chỉ tồn tại trong request hiện tại.
Sau redirect:
Browser tạo request mới.
POST cũ không còn.
Cách xử lý
Lưu dữ liệu vào:
$_SESSION
Ví dụ:
$_SESSION['name'] = $_POST['name'];
Sau redirect:
echo $_SESSION['name'];
vẫn còn.
Nguyên nhân số 4: Refresh trang
Một số người:
Submit
↓
F5
POST có thể bị gửi lại.
Hoặc dữ liệu mất.
Tùy cách code.
Giải pháp chuyên nghiệp
Mô hình:
POST
↓
Xử lý
↓
Redirect
↓
GET
gọi là:
PRG
(Post Redirect Get)
Đây là cách rất nhiều website lớn sử dụng.
Lỗi cực phổ biến trên InfinityFree
Bạn submit form.
PHP báo:
Đăng ký thành công
Nhưng refresh.
Thông báo biến mất.
Dữ liệu biến mất.
Bạn tưởng:
PHP bị lỗi
Thực ra:
Biến POST đã hết vòng đời.
Ví dụ đời thường
Hãy tưởng tượng:
Bạn gửi một lá thư.
PHP nhận được thư.
Đọc xong.
Vứt thư vào thùng rác.
Nếu muốn giữ nội dung.
Bạn phải:
- sao chép vào sổ tay
- hoặc lưu vào database
Session giống cuốn sổ tay.
Database giống tủ hồ sơ.
POST giống tờ giấy tạm.
Sai lầm của người mới
if($_SERVER['REQUEST_METHOD']=='POST')
{
$name = $_POST['name'];
}
Xong.
Tưởng rằng:
$name
sẽ tồn tại mãi mãi.
Không.
Nó chỉ sống trong request hiện tại.
Cách debug
Thêm:
print_r($_POST);
Nếu thấy:
Array
(
)
sau reload.
Bạn đã tìm ra nguyên nhân.
Kinh nghiệm thực chiến
Khi làm:
- Form đăng ký
- Form liên hệ
- Form đặt hàng
- Form góp ý
Luôn tự hỏi:
Nếu submit thất bại thì dữ liệu có bị mất không?
Nếu câu trả lời là:
Có
thì nên sửa ngay.
Kết luận
Form reload làm mất dữ liệu không phải vì PHP ghét bạn.
Mà vì:
POST chỉ tồn tại trong request hiện tại.
Khi trang tải lại hoặc redirect:
POST biến mất.
Muốn giữ dữ liệu, bạn cần:
- đổ dữ liệu trở lại form
- dùng Session
- hoặc lưu vào Database
Và hãy nhớ:
Người dùng rất ghét nhập lại 20 ô thông tin chỉ vì quên một dấu @ trong email.
Tin vui là đây là một trong những lỗi dễ sửa nhất khi làm web PHP. 😄
Có thể bạn cũng đang gặp: