目標
元の質問は、不明なデータ型の値を検証し、数字以外の値を除くすべての値を破棄することに関するものです。この望ましい結果を達成するには、2 つの方法しかないようです。
目標が迅速に失敗するif
ことである場合、有効な値をチェックしてすべてのコードをブロックにラップするのではなく、無効な値をチェックしてから失敗することをお勧めします。
質問のオプション 1
if (preg_match('/\D/', $company_id)) exit('Invalid parameter');
regex
数字以外に一致する場合に失敗するために使用します。短所: 正規表現エンジンにはオーバーヘッドがあります
質問のオプション 2
if (!ctype_digit((string) $company_id)) exit('Invalid parameter');
ctype_digit
FALSE の場合に失敗するために使用します。短所:値を文字列にキャストする必要がありますが、これは(小さな)余分なステップです
ctype_digit
文字列を期待し、PHP はパラメーターを文字列にキャストしないため、値を文字列にキャストする必要があります。に整数を渡すctype_digit
と、予期しない結果が得られます。
これは文書化された動作です。例えば:
ctype_digit('42'); // true
ctype_digit(42); // false (ASCII 42 is the * character)
オプション 1 と 2 の違い
正規表現エンジンのオーバーヘッドのため、オプション 2 がおそらく最適なオプションです。ただし、これら 2 つのオプションの違いについて心配することは、時期尚早の最適化のカテゴリに分類される可能性があります。
注:上記の 2 つのオプションには機能上の違いもあります。最初のオプションはNULL
空の文字列を有効な値と見なしますが、2 番目のオプションはそうではありません (PHP 5.1.0 以降)。そのため、ある方法が他の方法よりも望ましい場合があります。オプションの機能をバージョンregex
と同じにする場合は、代わりにこれを使用します。ctype_digit
if (!preg_match('/^\d+$/', $company_id)) exit('Invalid parameter');
注:上記の「文字列の開始」^
および「文字列の終了」$
アンカーregex
は非常に重要です。それ以外の場合は、abc123def
有効と見なされます。
その他のオプション
ここおよび他の質問で提案されている他の方法は、記載されている目標を達成できませんが、他の人を助ける可能性があるため、それらに言及し、それらが機能しない理由を説明することが重要だと思います.
is_numeric
指数部、浮動小数点数、および 16 進値を使用できます
is_int
'1'
が有効であると見なされる場合、検証に役立たない値ではなくデータ型をチェックします。フォーム入力は常に文字列です。値の取得元がわからない場合は、データ型もわかりません。
filter_var
withFILTER_VALIDATE_INT
では、負の整数と などの値を使用できます1.0
。これは、データ型に関係なく整数を実際に検証するための最良の関数のようです。ただし、数字だけが必要な場合は機能しません。注:が有効な値であると見なされる場合は、真実か偽かだけでなく、FALSE
身元を確認することが重要です。0