web-dev-qa-db-ja.com

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

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

私はそれを確認したい:

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

これは私がこれまでに持っているものです:

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

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

これを行う簡単な方法が必要ですか?

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

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

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

$strを変数に置き換えます。 NULLおよび""は、strlenを使用すると、両方とも0を返します。

104
jrowe

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)

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

29
kta

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

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

そのような成功をテストするために逆にすることもできます:

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

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
7
Ben Blank

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

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

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でのフォーム検証が行われる傾向があるため、再利用可能で、柔軟性があり、エラーがはるかに少ないですすぐにスパゲッティコードになります。

3
e-satis

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

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

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

フィールドに値が提供されているかどうかを確認する場合、そのフィールドはstringarray、または未定義の場合があります。だから、次のもので十分です

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

より堅牢にするために(集計、リターン…)、以下を定義します。

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
bcag2

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

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
0
NJInamdar