isset()と!empty()をどこで使用するか


105

isset()関数が空の文字列をとして処理するTRUEためisset()、HTMLフォームからのテキスト入力とテキストボックスを検証する効果的な方法ではないことをどこかで読みました。

したがってempty()、ユーザーが何かを入力したことを確認するために使用できます。

  1. isset()関数が空の文字列を次のように扱うのは本当TRUEですか?

  2. 次に、どのような状況で使用する必要がありますisset()か?私はいつも!empty()何かがあるかどうかを確認するために使用する必要がありますか?

たとえばの代わりに

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

これを使う

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

回答:


135

issetと!empty

FTA:

isset()は、変数に(False、0または空の文字列)を含むがNULLではない値があるかどうかをチェックします。varが存在する場合はTRUEを、それ以外の場合はFALSEを返します。

一方、empty()関数は、変数に空の値、空の文字列、0、NULL、またはFalseがあるかどうかをチェックします。varに空ではなく、ゼロ以外の値がある場合は、FALSEを返します。


47
FTA:記事から
Jianxin Gao

5
empty()空の配列に対してもtrueを返します。
Mitya

tho empty()が0に対してTRUEを返す場合でも、「0」が誤って文字列である場合に備えて、この演算子を数学に使用することはお勧めできません。これは危険な場合があります。代わりに、基本的な><および==演算子を使用し、intval()またはを使用して変数を変換しますfloatval()
kaleazy

32

最も一般的な方法で:

  • 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であるため、基本的には変数にnull以外の値があるかどうかをチェックしますemptyは対応するものの一種ですissetが、整数値0と文字列値"0"も空として扱います。(ここでも、型比較表を見てください。)


1
empty()PHP 5.5.0以降では、「変数だけでなく式もサポートする」ことに注意してください。
ComFreek 2013

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の 1のために、値を含む文字列、真

nullの場合はtrue、空の文字列の場合は0、falseの場合

$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を返しません。
ジョシュデイビス

1
'0'は有効な文字列ですが、十分ではありませんempty。... isset/ filter_has_varは、varが存在するかどうかを確認するために使用する必要があります。
Yousha Aleayoub 2017

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

通知を回避するために以下を使用します。これにより、GETまたはPOSTで宣言されたvarがチェックされ、@プレフィックスを使用して、空でないかどうかを安全にチェックし、varが設定されていない場合に通知を回避できます。

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

"stfu演算子"(@)は推奨されません。スニペットでは必要ありません。これは良い答えではありません。緩やかな比較を行っています。使用することもできます!empty()
mickmackusa 2018

1
ああ、これは悪いコーディング例に最適です。@デバッグの問題が発生し、ページへの影響が遅くなりerror_log、1度に1GB を超える可能性があります。ただ、スマートで使用すること!empty()!is_null()またはそのような何か。
Ivijan StefanStipić19年

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

isset()は、変数が設定されていてnullでないかどうかをテストします。

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

empty()は、変数が特定の値に設定されている場合にtrueを返すことができます。

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

!emptyがトリックを実行します。データが存在するかどうかを確認するだけでよい場合は、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.