ฉันจะใช้ isset () และ! empty () ได้ที่ไหน


106

ฉันอ่านที่ไหนสักแห่งที่isset()ฟังก์ชั่นถือว่าสตริงว่างเป็นTRUEดังนั้นจึงisset()ไม่ใช่วิธีที่มีประสิทธิภาพในการตรวจสอบอินพุตข้อความและกล่องข้อความจากรูปแบบ HTML

คุณจึงใช้empty()ตรวจสอบได้ว่าผู้ใช้พิมพ์อะไร

  1. จริงหรือไม่ที่isset()ฟังก์ชันถือว่าสตริงว่างเป็นTRUE?

  2. แล้วควรใช้ในสถานการณ์isset()ไหน? ฉันควรใช้!empty()ตรวจสอบเสมอว่ามีอะไรอยู่หรือไม่?

ตัวอย่างเช่นแทนที่จะเป็น

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

โดยใช้สิ่งนี้

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

เป็นไปได้ที่ซ้ำกันของWhy check ทั้ง isset () และ! empty ()
Gajus

คำตอบ:


136

isset กับ!

FTA:

"isset () ตรวจสอบว่าตัวแปรมีค่าหรือไม่รวมถึง (False, 0 หรือสตริงว่าง) แต่ไม่ใช่ NULL ส่งคืนค่า TRUE หาก var มีอยู่มิฉะนั้นจะเป็น FALSE

ในทางกลับกันฟังก์ชัน empty () จะตรวจสอบว่าตัวแปรมีสตริงว่างค่าว่าง 0, NULL หรือ False หรือไม่ ส่งกลับค่า FALSE หาก var มีค่าที่ไม่ว่างเปล่าและไม่ใช่ศูนย์ "


49
FTA: จากบทความ
Jianxin Gao

5
empty()ยังคืนค่าจริงสำหรับอาร์เรย์ว่าง
Mitya

แม้จะempty()คืนค่า TRUE เป็น 0 แต่ก็ไม่ควรใช้โอเปอเรเตอร์นี้สำหรับคณิตศาสตร์ในกรณีที่ "0" เป็นสตริงโดยไม่ได้ตั้งใจ ซึ่งอาจเป็นอันตรายได้ แต่ให้ใช้ขั้นพื้นฐาน>, <และ==ผู้ประกอบการและตัวแปรแปลงใช้หรือintval() floatval()
kaleazy

33

โดยทั่วไปมากที่สุด:

  • issetทดสอบว่าตัวแปร (หรือองค์ประกอบของอาร์เรย์หรือคุณสมบัติของวัตถุ) มีอยู่หรือไม่ (และไม่ใช่ค่าว่าง)
  • empty ทดสอบว่าตัวแปร (... ) มีข้อมูลที่ไม่ว่างเปล่าหรือไม่


ในการตอบคำถาม 1 :

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

ให้

boolean true

เนื่องจากตัวแปร$strมีอยู่


และคำถามที่ 2 :

คุณควรใช้ isset เพื่อพิจารณาว่ามีตัวแปรอยู่หรือไม่ ตัวอย่างเช่นหากคุณได้รับข้อมูลบางส่วนเป็นอาร์เรย์คุณอาจต้องตรวจสอบว่ามีการตั้งค่าคีย์ในอาร์เรย์นั้นหรือไม่
ลองนึกถึง$_GET/ $_POSTเช่น

emptyตอนนี้ที่จะทำงานในด้านความคุ้มค่าเมื่อคุณรู้ว่ามีค่าดังกล่าวนั่นคือการปฏิบัติงานของ


11

ไม่ใช่วิธีที่ดีในการตรวจสอบอินพุตที่ถูกต้อง

  • isset() ไม่เพียงพอเนื่องจาก - ตามที่ได้บันทึกไว้แล้ว - ถือว่าสตริงว่างเป็นค่าที่ถูกต้อง
  • ! empty() ไม่เพียงพอเนื่องจากปฏิเสธ '0' ซึ่งอาจเป็นค่าที่ถูกต้อง

การใช้isset()รวมกับการตรวจสอบความเท่าเทียมกับสตริงว่างคือค่าต่ำสุดที่คุณต้องตรวจสอบว่าพารามิเตอร์ขาเข้ามีค่าโดยไม่ต้องสร้างเชิงลบที่ผิดพลาด:

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

แต่โดย "ขั้นต่ำเปล่า" ฉันหมายถึงอย่างนั้น รหัสทั้งหมดข้างต้นเป็นตัวกำหนดว่ามีค่าสำหรับ$_GET['gender']หรือไม่ มันไม่ได้ตรวจสอบว่าค่าสำหรับ$_GET['gender']เป็นที่ถูกต้อง (เช่นหนึ่ง)("Male", "Female","FileNotFound")

เพื่อที่เห็นคำตอบของจอชเดวิส


เนื่องจากคุณใช้การเปรียบเทียบแบบหลวม ๆ ข้อมูลโค้ดที่แนะนำของคุณจะให้ผลบวกปลอมเมื่อจัดการกับค่าสตริงที่ไม่ใช่ศูนย์ ish / falsey 3v4l.org/aIWqA
mickmackusa

11

issetมีวัตถุประสงค์เพื่อใช้กับตัวแปรเท่านั้นไม่ใช่แค่ค่าดังนั้นisset("foobar")จะทำให้เกิดข้อผิดพลาด ตั้งแต่ PHP 5.5 emptyรองรับทั้งตัวแปรและนิพจน์

ดังนั้นคำถามแรกของคุณควรเป็นถ้าissetส่งกลับจริงสำหรับตัวแปรที่มีสตริงว่าง และคำตอบคือ:

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

ตารางเปรียบเทียบประเภทใน PHP การใช้งานค่อนข้างมีประโยชน์สำหรับคำถามดังกล่าว

issetโดยทั่วไปจะตรวจสอบว่าตัวแปรมีค่าอื่นนอกเหนือจากnull หรือไม่เนื่องจากตัวแปรที่ไม่มีอยู่จะมีค่าnullเสมอ emptyเป็นชนิดของส่วนตัวนับissetแต่ยังถือว่าค่าจำนวนเต็ม0และค่าสตริง"0"เป็นค่าว่าง (ดูตารางเปรียบเทียบประเภทอีกครั้ง)


1
โปรดทราบว่าempty()"รองรับนิพจน์แทนที่จะเป็นตัวแปรเท่านั้น" ใน PHP 5.5.0
ComFreek

8

หากคุณมี $ _POST ['param'] และถือว่าเป็นประเภทสตริง

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

เหมือนกับ

!empty($_POST['param'])

4

isset () ไม่ใช่วิธีที่มีประสิทธิภาพในการตรวจสอบอินพุตข้อความและกล่องข้อความจากรูปแบบ HTML

คุณสามารถเขียนซ้ำได้ว่า"isset () ไม่ใช่วิธีตรวจสอบอินพุต" การป้อนข้อมูลตรวจสอบการใช้งานของ PHP ขยายตัวกรอง filter_has_var()จะบอกคุณว่ามีตัวแปรอยู่ในขณะที่filter_input()จะกรองและ / หรือล้างข้อมูลอินพุตจริงหรือไม่

โปรดทราบว่าคุณไม่ได้มีการใช้filter_has_var()ก่อนfilter_input()และถ้าคุณถามสำหรับตัวแปรที่ไม่ได้ถูกตั้งให้ก็จะกลับมาfilter_input()null


3

ใช้เมื่อใดและอย่างไร:

  1. isset ()

Trueสำหรับ 0, 1 สตริงว่างสตริงที่มีค่าเป็นจริงเท็จ

เท็จเป็นค่าว่าง

เช่น

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False
  1. ว่างเปล่า

False for 1 ซึ่งเป็นสตริงที่มีค่าเป็นจริง

Trueสำหรับ null สตริงว่าง 0 เท็จเช่น

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

2

isset ใช้เพื่อตรวจสอบว่ามีอินสแตนซ์ของบางสิ่งอยู่หรือไม่นั่นคือถ้าตัวแปรถูกสร้างอินสแตนซ์ ... มันไม่เกี่ยวข้องกับค่าของพารามิเตอร์ ...

ปาสคาลมาร์ติน ... +1 ...

empty () ไม่สร้างคำเตือนหากไม่มีตัวแปร ... ดังนั้น isset () จึงเป็นที่ต้องการเมื่อทดสอบการมีอยู่ของตัวแปรเมื่อคุณต้องการแก้ไข ...


1

ใช้emptyก็เพียงพอแล้ว:

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

นอกจากนี้หากคุณต้องการค่าจำนวนเต็มก็ควรตรวจสอบintval($variable) !== FALSEด้วย


2
นอกจากนี้ intval () จะไม่ส่งกลับ FALSE
Josh Davis

1
ไม่เพียงพอเนื่องจาก '0' เป็นสตริงที่ถูกต้อง แต่ไม่ใช่สำหรับempty... isset/ filter_has_varต้องใช้เพื่อตรวจสอบว่ามี var อยู่หรือไม่
Yousha Aleayoub


1

ฉันมาที่นี่เพื่อค้นหาวิธีที่รวดเร็วในการตรวจสอบว่าตัวแปรมีเนื้อหาอยู่หรือไม่ ไม่มีคำตอบใดที่ให้คำตอบที่สมบูรณ์ดังนั้นนี่คือ:


เพียงพอที่จะตรวจสอบว่าอินพุตเป็น''หรือnullเนื่องจาก:

ขอ.../test.php?var=ผลลัพธ์URL ใน$_GET['var'] = ''

ขอ.../test.phpผลลัพธ์URL ใน$_GET['var'] = null


isset()ส่งคืนfalseเฉพาะเมื่อมีตัวแปรอยู่และไม่ได้ตั้งค่าเป็นnullดังนั้นหากคุณใช้มันคุณจะได้รับtrueสตริงว่าง ( '')

empty()พิจารณาทั้งสองอย่างnullและ''ว่างเปล่า แต่ก็ถือว่า'0'ว่างเปล่าซึ่งเป็นปัญหาในบางกรณีการใช้งาน

หากคุณต้องการที่จะรักษาเป็นที่ว่างเปล่าแล้วใช้'0' empty()มิฉะนั้นให้ใช้การตรวจสอบต่อไปนี้:

$var .'' !== ''ประเมินfalseเฉพาะสำหรับอินพุตต่อไปนี้:

  • ''
  • null
  • false

ฉันใช้การตรวจสอบต่อไปนี้เพื่อกรองสตริงที่มีช่องว่างและตัวแบ่งบรรทัดเท่านั้น:

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

0

ฉันใช้สิ่งต่อไปนี้เพื่อหลีกเลี่ยงการแจ้งเตือนซึ่งจะตรวจสอบว่า var ถูกประกาศใน GET หรือ POST หรือไม่และด้วยคำนำหน้า @ คุณสามารถตรวจสอบได้อย่างปลอดภัยหากไม่ว่างเปล่าและหลีกเลี่ยงการแจ้งเตือนหากไม่ได้ตั้งค่า var:

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

@ไม่ควรสนับสนุน"ตัวดำเนินการ stfu" ( ) และไม่จำเป็นสำหรับข้อมูลโค้ดของคุณ นี่ไม่ใช่คำตอบที่ดี คุณกำลังทำการเปรียบเทียบแบบหลวม ๆ คุณอาจใช้!empty()ไฟล์.
mickmackusa

1
Ooo man ... นี่เป็นตัวอย่างการเข้ารหัสที่ไม่ดี @จะทำให้คุณมีปัญหาในการแก้ไขจุดบกพร่องผลกระทบของเพจจะช้าลงและคุณยังสามารถมีerror_logมากกว่า 1GB ในช่วงเวลาเดียว เพียงแค่สมาร์ทและการใช้งาน!empty(), !is_null()หรือสิ่งที่ต้องการ
Ivijan Stefan Stipić

0

isset () ใช้เพื่อตรวจสอบว่าตัวแปรถูกตั้งค่าด้วยค่าหรือไม่และใช้ Empty () เพื่อตรวจสอบว่าตัวแปรที่กำหนดว่างเปล่าหรือไม่

isset () ส่งคืนจริงเมื่อตัวแปรไม่เป็นโมฆะในขณะที่ Empty () ส่งคืนจริงหากตัวแปรเป็นสตริงว่าง


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';
    }

ที่มา: Php.net


0

isset () ทดสอบว่าตัวแปรถูกตั้งค่าและไม่เป็นโมฆะ:

http://us.php.net/manual/en/function.isset.php

empty () สามารถคืนค่าจริงเมื่อตัวแปรถูกตั้งค่าเป็นค่าบางค่า:

http://us.php.net/manual/en/function.empty.php

<?php

$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>


0

! ว่างจะทำเคล็ดลับ หากคุณต้องการเพียงตรวจสอบข้อมูลที่มีอยู่หรือไม่ใช้isset other emptyสามารถจัดการการตรวจสอบความถูกต้องอื่น ๆ ได้

<?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}

?>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.