PHPは動的言語なので、提供されたフィールドが空かどうかを確認する最良の方法は何ですか?
私はそれを確認したい:
- nullは空の文字列と見なされます
- 空白のみの文字列は空と見なされます
- 「0」は空とは見なされません
これは私がこれまでに得たものです:
$question = trim($_POST['question']);
if ("" === "$question") {
// Handle error here
}
これを行う簡単な方法があるに違いありませんか?
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
を使用すると、""
どちらも0を返しますstrlen
。
if(strcmp('', $var) == 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でのフォーム検証はすぐにspaguettiコードになる傾向があるため、再利用可能で柔軟性があり、エラーが発生しにくくなります。
これは配列と文字列をチェックします:
function is_set($val) {
if(is_array($val)) return !empty($val);
return strlen(trim($val)) ? true : false;
}
より堅牢になるために(集計、戻り値…)、私は次のように定義します。
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");
}
ソース: