解 説

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を意味しますから当然の判定なのかもしれません。