- 2007/12/06
- PHP
非常に参考になるエントリ「そのis_numeric()は適切ですか?」を読んで。PHPで数値判定する機会は大分あると思う。特にフォームで入力された電話番号やらなんやらで。その判定方法を間違ってしまうと、思わぬバグが発生してしまうという話。
is_numericのなにがいけないのか
今まで僕は文字列の判定には preg_match() を使っていました。そりゃもう使い果たしています。正規表現が大好きなので。でも、PHPのパフォーマンスチューニングをしようと思っていろいろと文献を見ていると正規表現は遅いのでなるべく他の関数に置き換えるという意見を目にし、あまり考えずに is_numeric() を使ってベンチマークを取ろうと思っていた矢先に、先のエントリを目にし慌ててマニュアルを読み直しました。
指定した変数が数値であるかどうかを調べます。数値文字列は以下の要素から なります。(オプションの)符号、任意の数の数字、(オプションの)小数部、 そして(オプションの)指数部。つまり、+0123.45e6 は数値として有効な値です。16 進表記(0xFF)も 認められますが、この場合は符号や小数部、指数部を含めることはできません。
オーノー。10進数以外にも数値はあるじゃねーか。
やっぱりここは /^[0-9]+$/ というオーソドックスな方法で判定すべきですね。反省。
他に数値判定できる方法は?
is_int() やMathの数学関数にもいくつか数値判定をしてくるものはありますが、10進数に限った判定をしてくれる関数はありませんでした。
特に is_int() は、変数が数値もしくは数値文字列の場合 (フォームからの入力の場合は 常に文字列となります) 、is_numeric() を使用する必要があります。
ということで、フォームからの入力値に関しては注意が必要です。
- Newer: 携帯電話のキャッシュをコントロールする方法
- Older: MySQLのAUTO_INCREMENTで生成された値を簡単に取得する方法