Thứ Sáu, 29 tháng 5, 2026

isset() và empty() khác nhau thế nào? (Hai ông nhìn giống nhau nhưng "tính cách" rất khác)

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:

Login fail

Session lỗi

POST bị rỗng