クマのブログ

つまづいたところ、学びを書いていきます

!isset()とemptyの違い

始めに

会社の研修で、PHPの基礎問題を解いているときにふと思った疑問

実例

以下の演習問題を解いていた時の話。


ユーザーがテキストボックスに入力した0~9の数字について ・入力して送信ボタンを押した時⇒「OK」を出力 ・入力がなく送信ボタンを押した時⇒「NG」を出力

というプログラムを完成せよ

とのことだったので

当初回答

<form action="answer.php" method="POST">
        数字を入力してください。<input type="text" name="num">
        <input type="submit" value="送信">
</form>

// 上記テキストボックスに数字の入力があったか否かの条件分岐
if (empty($_POST['num'])) {
   // 入力がなかった時、"NG"の表示
   echo "NG";
   }else{
   // 入力があった時、"OK"の表示
   echo "OK";
    }

で「入力されたか否か」をempty関数を使っての条件分岐させています。

「これで完璧!」

と思ったんですが、不正解...

なぜか。

解説

結論

結論はempty関数を使っていることがここでの不正解の原因

正解はisset関数もしくはis_null関数を使わなくてはいけませんでした。

if (isset($_POST['num'])) {
    (中略)
    }

もしくは

if (is_null($_POST['num'])) {
    (中略。但し"OK"と"NG"を入れ替える必要あり)
    }

理由

以下テーブルの通り、今回の変数$=0の時に返す結果が異なる。

関数 $num = 0の時
empty False
is_null False
isset True

なので、当初回答の問題点は

$=0を入力したとき⇒"OK"が出力

となってしまう点が仕様未達で不正解となってしまいました…

参考記事

所見

・「値があるか否か」という条件分岐はよくあるもので、なんでも!emptyで済ませていたため、改めてこれらの違いについて深くしるきっかけがあってよかったと思う

参考記事

`isset() is_null() empty()` の違い と 変数の理解 と · 学習B5デスノート

公式マニュアル isset()

公式マニュアル empty()