PHPでformからデータを受け取って何かする場合、たいていの入門書はisset()を使用してデータの有無を判別しています。
けれども、isset()はちょっとくせものですから気をつけましょう。
PHP マニュアルではissetの説明は次のようになっています。
isset — 変数がセットされていること、そして NULL でないことを検査する。
似たような関数でempty()があります。
PHP マニュアルでは次のように説明しています。
empty()ー変数が空であるかどうかを検査します。 変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。
ざっくりというと、isset()「変数があるかどうか」で、empty()「変数が無いかどうか」です。
「無いかどうか」はわかりにくいので、否定の!を使用して「!empty()」として「変数があるかどうか」として使用します。
さて、isset()を実際に使用してみると困ったことがおきます。
isset()を使用して変数の有無を確認したとします。例えば何も入力をせずにsubmitボタンを押してもtrueになってしまいます。
つまり空文字でもtrueを返すのです。
え?何のための判定となるわけです。
次のサンプルはisset()と!empty()の返すbool値を確認するものです。初期表示はどちらも入力ボックスに入力がないのでfalseの値になっています。入力ボックスが空のままclickボタンを押すと結果に違いがでます。
間違いやすいisset()と!empty()のbool値の違い
isset() | !empty() | |
---|---|---|
未定義 | FALSE | FALSE |
NULL | FALSE | FALSE |
FALSE | TRUE | FALSE |
空文字 | TRUE | FALSE |
0 | TRUE | FALSE |
isset()はsubmitボタンが押されたかどうかを判定するくらいにしか使えません。
データが何らか入力されたかどうかの判定をする場合は、!empty()を使用します。
!empty()は空文字もfalseにしてくれますが、0がfalseになることに注意が必要です。
これは、bool値で0はfalseを意味しますから当然の判定なのかもしれません。