読者です 読者をやめる 読者になる 読者になる

ありがとう。また会おう。

まぁゆるりとやっていきますよと。

checkboxのvalueはちゃんと値をセットしよう。

これも昔携帯サイトを作っていて、小ハマリしたところ。


よく、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>
<?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は、一見必要がなさそうな場面でも、設定しておいた方がよさそうです。

*1:全部そうかはわかりません。W21Kで再現しました