どもです。
とある一覧を表示するとき、
+--------------------------------+-----------------------------+
| htmlspecialchars("category1")  | htmlspecialchars("value1")  |
+--------------------------------+-----------------------------+
| htmlspecialchars("category2")  | htmlspecialchars("value2")  |
+--------------------------------+-----------------------------+
| htmlspecialchars("category3")  | htmlspecialchars("value3")  |
+--------------------------------+-----------------------------+
まぁ内容は何でも良いですが、とにかくtext型の値を全て「htmlspecialchars()」で出力したとします。
このとき、「シューズ&バッグ」というカテゴリがあったとして、
とあるページで表示が「シューズ&バッグ」になってしまうという不具合が報告されました。
つまり、エンティティ化された「&」が、何故かエンティティの状態で表示されていると。
この原因、限りなく簡略化すると、こんなもん。
$array = array("シューズ&バッグ");
$array = array_map('htmlspecialchars', $array);
echo htmlspecialchars($array[0]); //シューズ&バッグ
つまり、1つの文字データに対し、htmlspecialchars()が2重にかかってしまった状態。
こうなってしまうと、
シューズ&バッグ			(元)
↓
シューズ&バッグ		(1回目)
↓
シューズ&バッグ	(2回目)
はい。
そりゃ表示が「シューズ&バッグ」になりますな。
何かとhtmlspecialchars()使いたがる方っていますが、それ自体が正しいのはわかりますが、
既存のコードを見て「echoするときはhtmlspecialchars()した方が良いんだ~」みたいな感じになると、ちょっと危険。
やっぱり共通関数に「echo_h」みたいに作っておいて、
function echo_h($str){echo htmlspecialchars($str);}ってやるのが良いのかな。
