Phơi phới vào quán phở, kéo ghế, an tọa, nhìn sang chị chủ xinh đẹp: "cho một tô phở tái nạm gàu!", đợi suốt 15 phút vẫn chưa thấy phở đâu, lại gọi chị chủ xinh đẹp: "phở của em đâu chị ơi", chị ấy vẫn xinh đẹp, vẫn tươi cười: "em ăn phở gì?"....
Bạn tạo form.
Có checkbox:
<input type="checkbox" name="agree">
Người dùng tick:
☑ Tôi đồng ý điều khoản
Bấm Submit.
PHP:
Undefined index: agree
Bạn nhìn lại.
Checkbox vẫn đang nằm đó.
Người dùng:
"Tôi đã tick rồi mà?"
PHP:
"Tôi chưa từng gặp người này."
Checkbox trong PHP là gì?
Checkbox là một trong những input đặc biệt của HTML.
Khác với:
<input type="text">
Checkbox chỉ gửi dữ liệu khi:
Được tick
Nếu không tick.
PHP sẽ không nhận được gì cả.
Ví dụ trớt quớt
HTML:
<input type="checkbox" name="agree">
PHP:
echo $_POST['agree'];
User không tick.
Submit.
Kết quả:
Undefined index: agree
Ví dụ thực tế
Hãy tưởng tượng:
Bạn gửi thư mời họp.
Người nhận:
☑ Đồng ý tham gia
hoặc
☐ Không phản hồi
Người không phản hồi không có nghĩa là:
NO
Mà là:
Không gửi gì cả
Checkbox cũng hoạt động như vậy.
Điều khiến lính mới bất ngờ
Text Box:
<input type="text" name="name">
Luôn gửi dữ liệu.
Ví dụ:
name=
PHP vẫn thấy.
Nhưng Checkbox:
<input type="checkbox" name="agree">
Không tick:
Không gửi gì luôn
Sai lầm phổ biến nhất
PHP:
if($_POST['agree'])
{
...
}User không tick.
Kết quả:
Undefined index
Cách đúng
Dùng:
if(isset($_POST['agree']))
{
echo "Đã đồng ý";
}Hoặc:
$agree = $_POST['agree'] ?? '';
An toàn hơn nhiều.
Checkbox gửi giá trị gì?
Nhiều người nghĩ:
- true
- false
Không hẳn.
Ví dụ:
<input
type="checkbox"
name="agree"
value="yes">Khi tick:
PHP nhận:
yes
Nếu không tick:
Không nhận gì
Một lỗi cực kỳ phổ biến
HTML:
<input
type="checkbox"
name="agree">Không có:
value=""
Khi tick.
PHP thường nhận:
on
Lính mới:
"Ủa?"
"Sao không phải true?"
Checkbox nhiều lựa chọn
Ví dụ:
<input type="checkbox" name="skill[]" value="PHP">
<input type="checkbox" name="skill[]" value="Python">
<input type="checkbox" name="skill[]" value="MySQL">
Tick:
☑ PHP
☑ Python
PHP nhận:
Array
(
[0] => PHP
[1] => Python
)Lỗi khi quên []
HTML:
<input type="checkbox" name="skill" value="PHP">
<input type="checkbox" name="skill" value="Python">Kết quả:
PHP chỉ nhận một giá trị.
Lính mới...théc méc:
"Ủa skill còn lại đâu?"
Tập tành làm web
Đôi khi bạn upload website rất "hoành văn tráng" lên host.
Checkbox không chạy.
Nghĩ:
Host lỗi
Thực tế:
$_POST['agree']
đang báo:
Undefined index
Do user không tick.
Không phải do InfinityFree.
Một sự thật thú vị
Checkbox là một trong những nguyên nhân khiến:
Undefined index
xuất hiện nhiều nhất trong PHP.
Thậm chí còn nhiều hơn:
- username
- password
- ở nhiều dự án nhỏ.
Debug kiểu dev "xịn sò"
1. In toàn bộ POST
print_r($_POST);
Bạn sẽ thấy chính xác PHP nhận gì.
2. Dùng var_dump
var_dump($_POST);
3. Kiểm tra giá trị checkbox
var_dump($_POST['agree'] ?? null);
4. Test cả hai trường hợp
☑ Tick
☐ Không tick
Rất nhiều người chỉ test trường hợp đầu tiên.
Checklist chuẩn không cần chỉnh
- Dùng isset()
- Có value=""
- Test trường hợp không tick
- Dùng ?? khi lấy dữ liệu
- Checkbox nhiều giá trị phải có []
- print_r($_POST) để debug
- Không đổ lỗi cho host quá sớm
FAQ nhanh
Vì sao checkbox không tick lại báo Undefined index?
Vì checkbox không gửi dữ liệu.
Checkbox gửi true/false đúng không?
Không hẳn.
Thường gửi:
on
hoặc giá trị trong:
value=""
Có nên dùng isset() không?
Có. Đây là cách phổ biến nhất.
Checkbox nhiều lựa chọn dùng thế nào?
Dùng: name="skill[]"
Bạn có thể cũng đang gặp
isset() vs empty() khác nhau thế nào?
PHP không nhận dữ liệu từ form POST/GET
Login đúng password nhưng vẫn fail
Redirect sau submit form đúng cách