変数のnullまたは空の文字列をチェックするより良い方法は?


174

PHPは動的言語なので、提供されたフィールドが空かどうかを確認する最良の方法は何ですか?

私はそれを確認したい:

  1. nullは空の文字列と見なされます
  2. 空白のみの文字列は空と見なされます
  3. 「0」は空とは見なされません

これは私がこれまでに得たものです:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

これを行う簡単な方法があるに違いありませんか?


1
empty($ question)を使用すると言いますが、これも0が空であると見なします。
Powerlord 2008

2
yodaの状態は
ひどい

回答:


278
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}

7
これで解決しますが、もっと簡単かどうかはわかりません。とにかく+1
Allain Lalonde

4
OPは非常に単純な操作の「より単純な」バージョンを求めているので、「より良い」が実際に保証されるものであると言います。
混乱

2
機能化しました。これにより、検証コードがシンプルになります
Michael Haren

7
ここで!isset()の目的は何ですか?is_null()とどう違うのですか?
-nickf

2
(!empty($ question)|| trim($ question)=== '');も返す
SpYk3HH 2013

109

古い投稿ですが、誰かが私と同じようにそれを必要とするかもしれません;)

if (strlen($str) == 0){
do what ever
}

$str変数に置き換えます。 NULLを使用すると、""どちらも0を返しますstrlen


4
そして、常にあります:if(strcmp('', $var) == 0)...
ピーター

12
なぜ== 0で、(strlen($ str))だけではないのですか?
Noumenon 2013

14
@Noumenon何も解決しないと読みやすさが損なわれるため。提案が「長さがある場合」として読むのは本当に簡単ですが、それは(もちろん)反対を意味します。
MattiasÅslund2013

11
誰かが気にかける場合、スペースのみの文字列には役立ちません
エアボス

5
変数が設定されていない場合、これにより警告が表示されます
Konstantin Pereiaslov

25

PHPのempty()関数を使用します。次のものは空と見なされます

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)

詳細については、空の関数を確認してください


7
ポスターは、彼らが「0」を空であると考えたくないと言った
dougd_in_nc

18

私が間違っている場合は謙虚に受け入れますが、私は自分でテストしましたが、以下がstring(0) ""とNULL値の変数の両方をテストするために機能することがわかりました。

if ( $question ) {
  // Handle success here
}

これを逆にして、成功をテストすることもできます。

if ( !$question ) {
  // Handle error here
}

"if(trim($ n)).."を提案できます。それ以外の場合、$ _ POST変数(たとえば)が単に ""であれば、それは有効と見なされますが、ほとんどの場合、これは空の文字列と同じです
StartupGuy

""が特定の関数の許容値でない場合は、trimを使用することをお勧めします。
Adal

3
これは、「0」、数値0または0.0、およびFALSEに対してfalseを返します。
Vedmant

7

trim()関数からの偽陰性に注意してください—トリミングの前に文字列へのキャストを実行するため、空の配列を渡すと、たとえば「配列」を返します。データの処理方法によっては、これは問題ではない可能性がありますが、指定したコードを使用question[]すると、POSTデータで指定されたフィールドが提供され、空でない文字列のように見える場合があります。代わりに、私はお勧めします:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) {
    // Handle error here
}

// If $question was a string, it will have been trimmed by this point

文字列を期待した場所に配列を取得した場合、エラーになるはずです。配列が必要な場合は、そのための個別のフィルタリング関数が必要です。
OIS

そのコードはそれをエラーとして扱っていませんか?フィルタリングが他の場所で行われる場合は、argsの検証ルールの知識が別の場所に複製されないように注意する必要があります。
grantwparks 2011年

3

より良い方法はありませんが、これは通常かなり頻繁に実行する操作であるため、プロセスを自動化することをお勧めします。

ほとんどのフレームワークは、引数の解析を簡単なタスクにする方法を提供します。そのための独自のオブジェクトを構築できます。素早く汚い例:

class Request
{

    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    {
         if ($from) :
             if (isset(${'_'.$from}[$key]));
                return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    }

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    {
          return addslashes(trim($data));
    }

    // your rules here
    function isEmptyString($data)
    {
        return (trim($data) === "" or $data === null);
    }


    function exists($key) {}

    function setFlash($name, $value) {}

    [...]

}

$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

symfonyはそのような砂糖を大量に使用します。

しかし、あなたは「//ここでエラーを処理する」でそれ以上のことを話している。データを取得して処理する、2つのジョブを混合しています。これはまったく同じではありません。

データの検証に使用できるメカニズムは他にもあります。繰り返しますが、フレームワークはあなたに最高の実践を示すことができます。

フォームのデータを表すオブジェクトを作成し、プロセスをアタッチしてフォールバックします。簡単なPHPスクリプトをハッキングするよりもはるかに手間がかかりますが(これは初めてです)、通常のPHPでのフォーム検証はすぐにspaguettiコードになる傾向があるため、再利用可能で柔軟性があり、エラーが発生しにくくなります。


21
あなたは彼が望んでいたものとは正反対のことをしました...シンプルさ
TravisO 2008

2

これは配列文字列をチェックます:

function is_set($val) {
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;
}

悪くない。PHPstの答えは同じですが、より簡潔になっています。
Allain Lalonde 2017年

2

より堅牢になるために(集計、戻り値…)、私は次のように定義します。

function is_not_empty_string($str) {
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;
}

// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");
}

ソース:


1

あなたは値がフィールドのために提供されるかどうかを確認したい場合は、そのフィールドであってもよいstringarrayまたはundifined。それで、次は十分です

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}

0

これまではempty()が機能していましたが、empty()の動作が何度か変更されました。いつものように、php docsは常に正確な動作の最良のソースであり、それらのページのコメントは通常、時間の経過に伴う変更の良い履歴を提供します。オブジェクトのプロパティがないことを確認する場合、現時点で非常に防御的な方法は次のとおりです。

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.