PHPのissetにひそむ罠?

PHPを使っている人ならしっているであろう、issetという関数。
読んで字のごとく、変数がセットされているかどうかを確認する関数です。
・・・と、つい最近まで信じていました。
たとえば、以下のような時

$data = aray(
          'a' => 'hoge',
          'b' => NULL
          );
print (isset($data['a'])) ? "a:TRUE" : "a:FALSE";
print (isset($data['b'])) ? "b:TRUE" : "b:FALSE";
print (isset($data['c'])) ? "c:TRUE" : "c:FALSE";

「a:TRUE」「b:TRUE」「c:FALSE」

となると思っていたのですが、実際は

「a:TRUE」「b:FALSE」「c:FALSE」

となります。
そんな馬鹿なと思って公式を確認してみると、

「変数がセットされており、それが NULL でないことを調べます。

と、しっかり書いてあります。
気づいた瞬間、「マジですか。。。」と、ちょっと口がポカーンとなりました。
多分そこを勘違いしている人はかなり多いと思うので、もし知らなかったという人は注意が必要です。

この記事の続き?を書きました。
PHPのissetとarray_key_exists

auの携帯で、PHPからprintされた1バイトの文字は出力されるようになったのかな?

今でもそうなのか分からないのですが、1年前にハマった現象のお話。

シンプルだったauのPOST問題 – 畝田ブルースマンの休憩室

↑このブログの記事にもあるのですが、私も携帯サイトのメールフォームを作っている時に1バイトの
print出力ではまったことが。

その時はこんな感じで

<input name="shop_id" value="<?php print $shop_id; ?>" type="hidden" />


みたいな感じで書いていたんですが、shop_idが飛んでくる時と飛んでこない場合があって、おかしいおかしいと思っていたら、どうも1バイトのコードが飛んでこないことが判明。
PHPがおかしいのかと思ったりもしたけれど、softbankやdocomoだと問題なく、auだけでおこる現象。
最終的に、shop_idをゼロパディングして2桁にするようにして解決したんだけれど、この記事を書こうと思って調べてたらこんな記事が。

au携帯のSSLで文字化け – LAPISLAZULI HILL#Hatena


output_bufferingをonにするなんて想像しなかったので、私の時の問題がこれで解決したのかどうかはわからないのですが、もし同じ問題に直面した人は試してみるといいと思います。