これも昔携帯サイトを作っていて、小ハマリしたところ。
よく、checkboxのフォームを置くとき、特に1つだけ置くような場合。
例えば「メルマガ配信を希望します」みたいなcheckboxで、
checkboxって、
- チェックすると、そのcheckboxのname=valueがパラメータに付与される
- チェックしないと、name=valueのパラメータは送信されない
という仕様ですよね。
で、何を考えたかというと、
「checkbox1個だけだし、
そのパラメータ名が設定されているかどうかだけで判定すればいいや」
と思って以下のような実装をしたんですね。
- HTMLフォーム
<form action="foo.php" method="POST"> <input type="checkbox" name="hoge">メルマガ配信を希望します<br> <!-- ↑ value属性を省略している --> <input type="submit" value="送信"><br> </form>
- foo.php
<?php if (isset($_POST['hoge']) && $_POST['hoge']){ //checkboxがチェックされたときの処理 } ?>
で、これが、PC(IE、Firefox)では問題なく動作する。
そして、DoCoMo、SoftBankの端末でも問題なし。
ところが・・・Au。
なぜか、Auだけ、チェックボックスにチェックをいれても、if文の中の処理にいかない。。。
で、調べてみたら・・・
なんと、上記のような、「checkboxのvalueを省略した」場合、Auの端末*1では、hogeの値として、「0」(ゼロ)が送出されていたんですね。
で、isset($_POST['hoge'])はtrueなんだけど、$_POST['hoge'] は文字列の「0」、
これはPHPの型の緩い比較でfalseになるので、条件文を通っていなかったと。
ちなみに、他のPC・DoCoMo・SoftBankでは、checkboxのvlaue省略時には、「on」という文字列が送出されていたので、大丈夫だったんですね。
でも、よくよく考えてみると、isset($_POST['hoge']) と$_POST['hoge']、なんで両方判定するようにしてたのか、自分でも謎です。。。f(^^;;;
たぶん気の迷いでしょう。。。
全く意味なかったので、 isset($_POST['hoge'])だけの判定に修正
・・・したんですが、やはりvalue省略したときに、ブラウザにより挙動が違うのは怖いので、valueもちゃんと設定するようにしました。
ということで、それほど致命傷ではないかもしれないですが
危なっかしいと言えば危なっかしいので、checkboxのvalueは、一見必要がなさそうな場面でも、設定しておいた方がよさそうです。