Tôi sẽ sử dụng Isset () và! Blank () ở đâu


105

Tôi đọc ở đâu đó rằng isset()hàm xử lý một chuỗi trống TRUE, do đó isset()không phải là cách hiệu quả để xác thực các đầu vào văn bản và hộp văn bản từ một biểu mẫu HTML.

Vì vậy, bạn có thể sử dụng empty()để kiểm tra xem người dùng đã nhập nội dung nào đó.

  1. Có đúng là isset()hàm xử lý một chuỗi rỗng TRUEkhông?

  2. Sau đó, tôi nên sử dụng trong những trường hợp isset()nào? Tôi có nên sử dụng luôn !empty()để kiểm tra xem có cái gì không?

Ví dụ thay vì

if(isset($_GET['gender']))...

Sử dụng cái này

if(!empty($_GET['gender']))...

Câu trả lời:


135

Isset so với! trống

FTA:

"Isset () kiểm tra xem một biến có giá trị bao gồm (Sai, 0 hoặc chuỗi trống), nhưng không phải NULL. Trả về TRUE nếu var tồn tại; FALSE nếu không.

Mặt khác, hàm void () kiểm tra xem biến có giá trị rỗng là chuỗi rỗng, 0, NULL hoặc False hay không. Trả về FALSE nếu var có giá trị khác rỗng và khác 0. "


47
FTA: Từ Bài báo
Jianxin Gao

5
empty()cũng trả về true cho một mảng trống.
Mitya

Ngay cả tho empty()trả về TRUE cho 0, không nên sử dụng toán tử này cho toán học trong trường hợp "0" vô tình là một chuỗi. Điều này có thể nguy hiểm. Thay vào đó, sử dụng cơ bản >, <==các nhà khai thác và các biến đổi sử dụng intval()hoặc floatval().
kaleazy

32

Nói một cách tổng quát nhất:

  • issetkiểm tra xem có tồn tại một biến (hoặc một phần tử của mảng hoặc thuộc tính của một đối tượng) hay không (và không rỗng)
  • empty kiểm tra xem một biến (...) có chứa một số dữ liệu không trống không.


Để trả lời câu hỏi 1 :

$str = '';
var_dump(isset($str));

cho

boolean true

Vì biến $strtồn tại.


câu hỏi 2 :

Bạn nên sử dụng Isset để xác định xem một biến có tồn tại hay không ; ví dụ: nếu bạn đang nhận một số dữ liệu dưới dạng một mảng, bạn có thể cần phải kiểm tra xem một khóa được đặt trong mảng đó hay không.
Hãy nghĩ về $_GET/ $_POST, chẳng hạn.

Bây giờ, để làm việc trên giá trị của nó, khi bạn biết có một giá trị như vậy: đó là công việc của empty.


11

Không phải là cách tốt để kiểm tra đầu vào hợp lệ.

  • isset() là không đủ vì - như đã được lưu ý - nó coi một chuỗi trống là một giá trị hợp lệ.
  • ! empty() cũng không đủ vì nó từ chối '0', có thể là một giá trị hợp lệ.

Sử dụng isset() kết hợp với kiểm tra bằng với một chuỗi trống là mức tối thiểu mà bạn cần để xác minh rằng tham số đến có giá trị mà không tạo ra các phủ định sai:

if( isset($_GET['gender']) and ($_GET['gender'] != '') )
{
  ...
}

Nhưng "tối thiểu", tôi muốn nói chính xác là như vậy. Tất cả những gì đoạn mã trên làm là xác định xem có một số giá trị cho $_GET['gender']. Nó không xác định liệu giá trị cho $_GET['gender']hợp lệ hay không (ví dụ: một trong số ).("Male", "Female","FileNotFound")

Về điều đó, hãy xem câu trả lời của Josh Davis .


Bởi vì bạn đang sử dụng so sánh lỏng lẻo, đoạn mã được đề xuất của bạn sẽ cho kết quả dương tính sai khi xử lý giá trị không phải chuỗi zero-ish / falsey. 3v4l.org/aIWqA
mickmackusa

11

issetnhằm mục đích chỉ được sử dụng cho các biến chứ không chỉ các giá trị, do đó isset("foobar")sẽ gây ra lỗi. Đối với PHP 5.5, emptyhỗ trợ cả biến và biểu thức.

Vì vậy, câu hỏi đầu tiên của bạn nên là nếu issettrả về true cho một biến chứa một chuỗi rỗng. Và câu trả lời là:

$var = "";
var_dump(isset($var));

Các bảng so sánh kiểu trong sổ tay PHP khá hữu ích cho những câu hỏi như vậy.

issetvề cơ bản kiểm tra xem một biến có bất kỳ giá trị nào khác với null hay không vì các biến không tồn tại luôn có giá trị null . emptylà một phần của bộ đếm issetnhưng cũng coi giá trị số nguyên 0và giá trị chuỗi "0"là trống. (Một lần nữa, hãy xem các bảng so sánh loại .)


1
Lưu ý rằng empty()cũng "hỗ trợ các biểu thức, thay vì chỉ các biến" kể từ PHP 5.5.0.
ComFreek

8

Nếu bạn có $ _POST ['param'] và giả sử đó là kiểu chuỗi thì

isset($_POST['param']) && $_POST['param'] != '' && $_POST['param'] != '0'

giống hệt với

!empty($_POST['param'])

4

Isset () không phải là một cách hiệu quả để xác thực các đầu vào văn bản và hộp văn bản từ một biểu mẫu HTML

Bạn có thể viết lại điều đó vì "Isset () không phải là cách để xác thực đầu vào." Để xác thực đầu vào, hãy sử dụng phần mở rộng bộ lọc của PHP . filter_has_var()sẽ cho bạn biết liệu biến có tồn tại trong khifilter_input() thực sự sẽ lọc và / hoặc khử trùng đầu vào.

Lưu ý rằng bạn không cần phải sử dụng filter_has_var()trước filter_input()và nếu bạn yêu cầu một biến chưa được đặt, filter_input()nó sẽ chỉ trả về null.


3

Khi nào và cách sử dụng:

  1. Isset ()

Đúng cho 0, 1, chuỗi trống, chuỗi chứa giá trị, đúng, sai

Sai vì null

ví dụ

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False
  1. Trống

Sai cho 1, một chuỗi chứa giá trị, đúng

Đúng cho null, chuỗi rỗng, 0, sai, ví dụ:

$status = 0
if(empty($status)) // true
$status = 1
if(empty($status)) // False

2

Isset được sử dụng để xác định xem có tồn tại một trường hợp nào đó hay không, nếu một biến đã được khởi tạo ... thì nó không liên quan đến giá trị của tham số ...

Pascal MARTIN ... +1 ...

void () không tạo cảnh báo nếu biến không tồn tại ... do đó, Isset () được ưu tiên khi kiểm tra sự tồn tại của biến khi bạn định sửa đổi nó ...


1

Sử dụng emptylà đủ:

if(!empty($variable)){
    // Do stuff
}

Ngoài ra, nếu bạn muốn một giá trị số nguyên thì cũng nên kiểm tra điều đó intval($variable) !== FALSE.


2
Ngoài ra, intval () không bao giờ trả về FALSE.
Josh Davis

1
nó KHÔNG đủ vì '0' là một chuỗi hợp lệ nhưng không phải cho empty... isset/ filter_has_varphải được sử dụng để kiểm tra xem var có tồn tại hay không.
Yousha Aleayoub

1
isset($variable) === (@$variable !== null)
empty($variable) === (@$variable == false)

1

Tôi đến đây để tìm một cách nhanh chóng để kiểm tra xem một biến có bất kỳ nội dung nào trong đó hay không. Không có câu trả lời nào ở đây cung cấp giải pháp đầy đủ, vì vậy đây là:


Nó đủ để kiểm tra xem đầu vào là ''hoặc null, bởi vì:

Yêu cầu URL .../test.php?var=dẫn đến$_GET['var'] = ''

Yêu cầu URL .../test.phpdẫn đến$_GET['var'] = null


isset()falsechỉ trả về khi biến tồn tại và không được đặt thành null, vì vậy nếu bạn sử dụng nó, bạn sẽ nhận được truecác chuỗi trống ('' ).

empty()coi cả hai null''trống, nhưng nó cũng coi là '0'rỗng, đó là một vấn đề trong một số trường hợp sử dụng.

Nếu bạn muốn coi '0'là trống rỗng, thì hãy sử dụng empty(). Nếu không, hãy sử dụng kiểm tra sau:

$var .'' !== ''chỉ đánh giá falsecho các đầu vào sau:

  • ''
  • null
  • false

Tôi sử dụng kiểm tra sau để lọc ra các chuỗi chỉ có khoảng trắng và ngắt dòng:

function hasContent($var){
    return trim($var .'') !== '';
}

0

Tôi sử dụng cách sau để tránh các thông báo, điều này kiểm tra xem var nó được khai báo trên GET hoặc POST hay không và với tiền tố @, bạn có thể kiểm tra một cách an toàn nếu không có sản phẩm nào và tránh thông báo nếu var không được đặt:

if( isset($_GET['var']) && @$_GET['var']!='' ){
    //Is not empty, do something
}

Không @nên khuyến khích "toán tử stfu" ( ) và nó không cần thiết cho đoạn mã của bạn. Đây không phải là một câu trả lời hay. Bạn đang thực hiện một phép so sánh lỏng lẻo. Bạn cũng có thể sử dụng !empty().
mickmackusa

1
Ôi trời ... Điều này thật tuyệt vời cho ví dụ mã hóa tồi. @sẽ khiến bạn gặp rắc rối với việc gỡ lỗi, tác động của trang chậm hơn và bạn vẫn có thể có error_loghơn 1GB trong một khoảnh khắc. Chỉ cần thông minh và sử dụng !empty(), !is_null()hoặc một cái gì đó tương tự.
Ivijan Stefan Stipić

0

Isset () được sử dụng để kiểm tra xem biến có được đặt với giá trị hay không và Empty () được sử dụng để kiểm tra xem một biến đã cho có trống hay không.

Isset () trả về true khi biến không null trong khi Empty () trả về true nếu biến là một chuỗi rỗng.


0
    $var = '';
// Evaluates to true because $var is empty
if ( empty($var) ) {
echo '$var is either 0, empty, or not set at all';
}
// Evaluates as true because $var is set
if ( isset($var) ) {
 echo '$var is set even though it is empty';
    }

Nguồn: Php.net




0

! trống sẽ thực hiện thủ thuật. nếu bạn chỉ cần kiểm tra dữ liệu tồn tại hay không thì sử dụng Isset khác trống có thể xử lý các xác nhận khác

<?php
$array = [ "name_new" => "print me"];

if (!empty($array['name'])){
   echo $array['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array2 = [ "name" => NULL];

if (!empty($array2['name'])){
   echo $array2['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array3 = [ "name" => ""];

if (!empty($array3['name'])){
   echo $array3['name'];
}

//output : {nothing}  

////////////////////////////////////////////////////////////////////

$array4 = [1,2];

if (!empty($array4['name'])){
   echo $array4['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array5 = [];

if (!empty($array5['name'])){
   echo $array5['name'];
}

//output : {nothing}

?>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.