어디에서 isset () 및! empty ()를 사용해야합니까?


106

isset()함수가 빈 문자열을으로 취급 TRUE하므로 isset()HTML 양식에서 텍스트 입력 및 텍스트 상자의 유효성을 검사하는 효과적인 방법이 아니라는 것을 읽었습니다 .

따라서 empty()사용자가 무언가를 입력했는지 확인하는 데 사용할 수 있습니다 .

  1. isset()함수가 빈 문자열을 다음과 같이 취급 한다는 것이 사실 TRUE입니까?

  2. 그렇다면 어떤 상황에서 사용해야 isset()합니까? 항상 !empty()무언가가 있는지 확인 하기 위해 사용해야합니까 ?

예를 들어 대신

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

이것을 사용하여

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

답변:


136

isset vs.! empty

FTA :

"isset ()은 변수에 (False, 0 또는 빈 문자열)을 포함하는 값이 있는지 확인하지만 NULL이 아닌지 확인합니다. var가 있으면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다.

반면에 empty () 함수는 변수에 빈 값이 빈 문자열, 0, NULL 또는 False인지 확인합니다. var에 비어 있지 않고 0이 아닌 값이 있으면 FALSE를 반환합니다. "


47
FTA : 기사에서
Jianxin Gao

5
empty()빈 배열에 대해서도 true를 반환합니다.
Mitya

tho도 empty()0에 대해 TRUE를 반환 하지만 "0"이 실수로 문자열 인 경우 수학에이 연산자를 사용하는 것은 좋지 않습니다. 이것은 위험 할 수 있습니다. 대신 기본 >, <== 사업자 및 변환 변수는 사용 intval()또는 floatval().
kaleazy

33

가장 일반적인 방법 :

  • isset변수 (또는 배열의 요소 또는 객체의 속성) 가 존재 하는지 (그리고 null이 아닌지 ) 테스트
  • 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")

이를 위해 Josh Davis의 답변을 참조하십시오 .


느슨한 비교를 사용하고 있기 때문에 제안 된 스 니펫은 문자열이없는 값을 처리 할 때 거짓 긍정을 제공합니다. 3v4l.org/aIWqA
mickmackusa

11

isset값이 아닌 변수에만 사용하기위한 것이므로 isset("foobar")오류가 발생합니다. PHP 5.5부터는 empty변수와 표현식을 모두 지원합니다.

따라서 첫 번째 질문은 빈 문자열을 포함하는 변수에 대해 trueisset반환 하는지 여부 입니다. 그리고 대답은 :

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

타입 비교 테이블PHP 매뉴얼 은 이러한 질문에 매우 유용합니다.

isset기본적으로 검사 변수 이외의 값이있는 경우 는 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 ()

0, 1의 경우 , 빈 문자열, 값을 포함하는 문자열, 참, 거짓

null 인 경우 False

예 :

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False

1의 경우 False , 값을 포함하는 문자열, 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
isset($variable) === (@$variable !== null)
empty($variable) === (@$variable == false)

1

변수에 내용이 있는지 확인하는 빠른 방법을 찾고 있습니다. 여기에 나온 답변 중 어느 것도 완전한 솔루션을 제공하지 않았으므로 여기에 있습니다.


입력이 ''또는 인지 확인하는 것으로 충분합니다 null.

요청 URL .../test.php?var=결과$_GET['var'] = ''

요청 URL .../test.php결과$_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 ()은 변수가 null이 아니면 true를 반환하고 Empty ()는 변수가 빈 문자열이면 true를 반환합니다.


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

! empty 는 트릭을 할 것입니다. 데이터가 존재하는지 확인하기 만하면되는 경우 isset other empty can handle other validations

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