しぐまろぐ

勉強したことや読んだ本について書きます。

PHPで$_POSTの値が空か判定する方法

修正前のコード

<p>お名前を入力してください</p>
<form action="output.php" method="POST">
    <input type="text" name="user">
    <input type="submit" value="設定">
</form>
<?php
$name = $_POST['user'];

if ( isset($name) ) {
        echo "こんにちは、" , $name , "さん";
}
?>

isset関数では、セットされているかどうかを判断する。
たとえば、直にoutput.phpに遷移したときは$nameは0(false/設定されていない)となり、画面には何も表示されない。

問題点

入力欄に何も入れずに「設定」ボタンを押したときは、$nameは1(true)になり設定されていることになるので「こんにちは、さん」と表示されてしまう。



修正版1

公式マニュアルによると、empty関数を使用すれば、$nameが空のときにfalseと判定されるようなので、修正してみる。

  • 公式マニュアルより引用(参考)
<?php
$var = 0;

// $var が空なのでtrueと評価されます
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// $var が設定されているのでtrueと評価されます
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

www.php.net

  • output.php(修正版1)
<?php
$name = $_POST['user'];

if ( isset($name) ) { // $nameが設定されていれば
    if ( !empty($name) ) { // $nameが空でなければ
        echo "こんにちは、" , $name , "さん";
    } else {
        echo "名前が入力されていません。";
    }
}
?>
問題点

これで「入力欄に何も入力されていない」という判定が追加できたのはいいが、
入力欄に「0」を入れると$name = 0となり、empty($name)がtrueになり、何も入力されていないのと同じ判定になってしまう。
strval($_POST['user'])として文字列にしても結果は変わらず。。
0にしろ"0"にしろfalseと判定されるようだ。
PHP: PHP 型の比較表 - Manual



最終的なコード

  • output.php(修正版2)
<?php
$name = $_POST['user'];

if ( isset($name) ) {
    if ( $name !== "" ) { 
        echo "こんにちは、" , $name , "さん";
    } else {
        echo "名前が入力されていません。";
    }
}
?>

これで、入力欄に0が入力されているならtrue、入力欄が空だったらfalseになる。

manaminmemo.sblo.jp


軽い気持ちでサンプルコードをいじっていたら、思わぬところで引っかかった。