どもです。
とある一覧を表示するとき、
+--------------------------------+-----------------------------+
| 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);}ってやるのが良いのかな。