PHPの罠に気をつけよう

「ホームページを作るために、PHPが初めて挑んだプログラミング言語だった」という人は少なからずいらっしゃると思います。
PHPはとてもとっつきやすい言語で、他の言語ならNGな書き方もPHPでは許容されることが多いのが1つの理由かもしれません。

ただそれゆえに他のJavaやC言語では起きにくいようなミスが発生してしまいやすい言語とも言えます。

PHPには型宣言がない…ゆえのミス

例えばホームページで
「あなたが持ってるリンゴの数をテキストボックスに入力して送信する」
入力フォームがあるとします。
必須入力にしたかったので、次のような入力値チェックを入れました。

------------------------------------
if (!$_GET["apple"]) {
    print "リンゴの個数を入力してください";
}
------------------------------------

・・実はこれだと、リンゴを持ってないということで”0″を入力した人も
“リンゴの個数を入力してください” と表示されてしまうのです。
文字列の”0″が、値が存在していないことと判定されてしまうんですね

次はもう少し奇妙なのを…

------------------------------------
if ($_GET["apple"] == 0) {
    echo "リンゴの個数にゼロは入力できません";
}
------------------------------------

もしこの判定で、ユーザーが”abc”みたいな数字じゃない文字を入力してもif文の中に入ってしまうんです
つまり (文字列 == 0) ってことですね。

------------------------------------
if ($_GET["apple"] == "0") {
    echo "リンゴの個数にゼロは入力できません";
}
------------------------------------

とすればとりあえず動きますが、前述の事があると、なんかすっきりしませんね。

このような問題は、PHPの変数が 型を明示的に宣言しない言語だから起きえてしまう問題です。
他の言語では 数値型の変数に “0” は代入できずにエラーになってしまいますが、
PHPだと動いてしまう上に、PHP内部で自動的に変換されて 0 == “0” となってしまうのです。

これをうっかりすると、本来はエラーにすべき入力値がスルーされちゃっていろいろと問題を引きこおこしかねません。

これを回避するには、== ではなく === で比較する癖をつけるようにしましょう。
そうすれば “0” と 0 は異なるものとして認識されます。

数値と文字列の扱いはハマるポイントなので、次のようなPHP公式ドキュメントを一読することをお勧めします。
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion
http://www.php.net/manual/ja/types.comparisons.php