修正前のコード
- input.php
<p>お名前を入力してください</p> <form action="output.php" method="POST"> <input type="text" name="user"> <input type="submit" value="設定"> </form>
- output.php
<?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'; } ?>
- 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になる。
軽い気持ちでサンプルコードをいじっていたら、思わぬところで引っかかった。