Có những thứ "thấy vậy mà không phải vậy", đôi khi ta cứ đinh ninh...tắt đèn nhà ngói cũng như nhà tranh....Nhưng thật ra nhà ngói vẫn là nhà ngói, nhà tranh vẫn là nhà tranh, không hề giống nhau, thế mới...đau.
Bạn viết code PHP cho trang login:
<?php
if(isset($_POST['username'])){
echo "Có username";
}
?>Chạy "ngon lành cành đào"
Phấn khởi, đang hăng, bạn sửa thành:
<?php
if(empty($_POST['username'])){
echo "Username rỗng";
}
?>Website bắt đầu hành xử kỳ quái
- Lúc đúng.
- Lúc sai.
- Lúc login fail dù nhập đủ.
Và bạn bắt đầu...théc méc:
"Ủa… isset() với empty() khác nhau chỗ nào? Đúng là ảo ma canada"
isset() vs empty() là gì?
Trong PHP:
- isset() kiểm tra biến có tồn tại hay không
- empty() kiểm tra biến có "rỗng" hay không
Hai hàm nhìn khá giống nhau.
Nhưng behavior rất khác
Ví dụ thực tế
Hãy tưởng tượng:
Bạn mở tủ lạnh
isset() hỏi:
"Trong tủ có hộp sữa không?"
empty() hỏi:
"Hộp sữa có gì bên trong không?"
Thấy "mại mại giống", cứ tưởng là...giống nhau thật. Nhưng thực tế là hai câu khác nhau hoàn toàn
isset() hoạt động thế nào?
<?php
$name = "Dat";
var_dump(isset($name));
?>Kết quả:
true
Vì biến tồn tại.
Nếu biến chưa tồn tại
<?php
var_dump(isset($age));
?>Kết quả:
false
empty() hoạt động thế nào?
<?php
$name = "";
var_dump(empty($name));
?>Kết quả:
true
Vì biến "rỗng".
Điều nguy hiểm
empty() coi rất nhiều thứ là “rỗng”.
Ví dụ:
- empty("")
- empty(0)
- empty("0")
- empty(null)
- empty(false)
- empty([])
Tất cả đều:
true
Ví dụ "gây lú" kinh điển
<?php
$age = 0;
if(empty($age)){
echo "Không có tuổi";
}
?>PHP nói:
Không có tuổi
Trong khi:
0
là giá trị hợp lệ
Đây là lý do nhiều website bị bug
Ví dụ form nhập số lượng:
<?php
$quantity = $_POST['quantity'];
if(empty($quantity)){
echo "Vui lòng nhập số lượng";
}
?>User nhập:
0
PHP vẫn coi là rỗng
isset() KHÔNG kiểm tra rỗng
Ví dụ:
<?php
$name = "";
var_dump(isset($name));
?>Kết quả:
true
Vì biến tồn tại
So sánh "tương đối" dễ hiểu
Giá trị isset() empty()
chưa tồn tại false true
"" true true
"hello" true false
0 true true
"0" true true
[] true true
null false true
Tập tành làm web
Form login:
<?php
if(empty($_POST['username'])){
echo "Thiếu username";
}
?>Nhưng trên điện thoại:
browser autofill đôi khi gửi:
" "
(chỉ có space)
empty() KHÔNG coi là rỗng
Cách đúng:
<?php
$username = trim($_POST['username']);
if(empty($username)){
echo "Thiếu username";
}
?>trim() rất quan trọng
Một lỗi newbie hay gặp
<?php
if(isset($_POST['age'])){
echo "Có tuổi";
}
?>User nhập:
0
isset = true
Không có vấn đề.
Nhưng nếu dùng empty
<?php
if(empty($_POST['age'])){
echo "Thiếu tuổi";
}
?>PHP coi:
0
là rỗng
Vậy dùng cái nào?
Câu trả lời là:
"Tùy mục đích"
Dùng isset() khi
Kiểm tra biến có tồn tại không
Ví dụ:
isset($_POST['username'])
isset($_SESSION['user'])
isset($_GET['id'])Dùng empty() khi
Kiểm tra user có nhập dữ liệu không
Ví dụ:
empty(trim($username))Công thức "an toàn"
Đây là kiểu rất phổ biến:
<?php
$username = trim($_POST['username'] ?? '');
if(empty($username)){
echo "Thiếu username";
}
?>?? là gì?
$_POST['username'] ?? ''
nghĩa là
Nếu tồn tại:
lấy username.
Nếu chưa tồn tại:
dùng chuỗi rỗng.
Vì sao cách này mạnh?
Tránh:
Undefined index
Một ví dụ rất thực tế
InfinityFree + form login.
User chưa submit form.
Bạn viết:
<?php
$username = $_POST['username'];
?>Undefined array key
Cách đúng:
<?php
$username = $_POST['username'] ?? '';
?>empty() có "nguy hiểm" không?
Không có gì nguy hiểm, nhưng phải hiểu behavior của nó
Đặc biệt với:
0
"0"
false
Một mẹo rất quan trọng
Nếu field là số:
cẩn thận với empty()
Ví dụ:
0
có thể là dữ liệu hợp lệ.
Ví dụ thực tế
Tới nhà ai đó đang đóng cổng, bạn hỏi vọng vào trong:
"Nhà có ai không?"
Nếu trong nhà có:
- một em bé đang nằm trong nôi.
- một phụ nữ đang gội đầu.
- ông nội đang ngủ
-->vẫn là "có người".
Nhưng empty() đôi khi kiểu:
"Không thấy ai hoạt động nên tính là không có."
Checklist "chuẩn không cần chỉnh"
Dùng isset khi:
- kiểm tra tồn tại
- session
- POST/GET
- tránh Undefined index
Dùng empty khi:
- validate form
- kiểm tra chuỗi rỗng
- kiểm tra user có nhập không
Luôn nhớ
0
và:
"0"
-->empty() coi là rỗng
Tổng kết
isset() và empty() nhìn giống nhau.
Nhưng:
Hàm Ý nghĩa
isset() Có tồn tại không?
empty() Có rỗng không?
Đây là cặp hàm newbie PHP gặp mỗi ngày
Hiểu sai một chút…
Login form có thể khiến chúng ta "toang" cả buổi
FAQ nhanh
empty() có kiểm tra biến tồn tại không?
Có. Nếu biến chưa tồn tại:
empty() trả về true.
isset() có kiểm tra rỗng không?
Không. Biến rỗng vẫn có thể isset = true.
Vì sao empty(0) lại true?
Vì PHP coi:
- 0
- "0"
- false
là "empty"
Form validation nên dùng gì?
Thường: trim() + empty()
Bạn có thể cũng đang gặp: