PHPは動的言語なので、指定されたフィールドが空かどうかを確認する最良の方法は何ですか?
私はそれを確認したい:
これは私がこれまでに持っているものです:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
これを行う簡単な方法が必要ですか?
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
古い投稿ですが、私がしたように誰かがそれを必要とするかもしれません;)
if (strlen($str) == 0){
do what ever
}
$str
を変数に置き換えます。 NULL
および""
は、strlen
を使用すると、両方とも0を返します。
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)
詳細については、 空の関数 を確認してください
私が間違っている場合は謙虚に受け入れますが、私は自分自身でテストし、string(0) ""とNULL値の変数の両方をテストするために次のことが機能することを発見しました:
if ( $question ) {
// Handle success here
}
そのような成功をテストするために逆にすることもできます:
if ( !$question ) {
// Handle error here
}
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
より良い方法はありませんが、通常は頻繁に行う操作であるため、プロセスを自動化することをお勧めします。
ほとんどのフレームワークは、引数の解析を簡単なタスクにする方法を提供します。そのための独自のオブジェクトを構築できます。迅速で汚い例:
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でのフォーム検証が行われる傾向があるため、再利用可能で、柔軟性があり、エラーがはるかに少ないですすぐにスパゲッティコードになります。
これは配列をチェックしますand文字列:
function is_set($val) {
if(is_array($val)) return !empty($val);
return strlen(trim($val)) ? true : false;
}
フィールドに値が提供されているかどうかを確認する場合、そのフィールドはstring
、array
、または未定義の場合があります。だから、次のもので十分です
function isSet($param)
{
return (is_array($param) && count($param)) || trim($param) !== '';
}
より堅牢にするために(集計、リターン…)、以下を定義します。
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");
}
ソース:
empty()はこれで機能していましたが、empty()の動作は数回変更されました。いつものように、phpドキュメントは常に正確な動作の最良のソースであり、それらのページのコメントは通常、経時的な変更の良い履歴を提供します。オブジェクトのプロパティの欠如を確認したい場合、現時点で非常に防御的な方法は次のとおりです。
if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {