質問: 入力値 ``` []!"#$%&'()\クラウド......ABC//......()[]().&'"!*/\→ ``` これを、htmlspecialcharsをしないでDBにinsert その結果、保存値はphpMyAdminでみたとき ``` []!"#$%&'()\クラウド......ABC//......()[]().&'"!*/\→ ``` となっています。 この値をselectして、画面に表示させたとき ``` []!"#$%&'()\クラウド......ABC//......()[]().&'"!*/\→ ``` となります。 DB保存値は、入力値と同じ状態になるのがほんとうではないでしょうか?
回答: 入力された情報はバリデーションにかからなかったなら全てそのまま(SQLエスケープを施して)登録すべきなので、登録時にhtmlspecialchars()などhtmlエスケープがかかった情報を登録しているのではないでしょうか。 あくまで画面出力時のみ対応するものです。 実際のコードがないので可能性の話でしかないですが。 ちなみに表示時のhtmlソースを見たときに→のようになっているのはhtmlエスケープが正しくかかっているので出方としては正しいです。 「&」は&がhtmlエスケープかかった結果なので化けてるわけではなくそれが正しい結果です。 あくまで保存時にhtmlエスケープをかけてはいけない、だけの話です。 ちなみに既に登録されたデータはphp側でどうにかできるわけではないのでDB側で置換かけるか、捨ててください。 追記: もう1つお伝えしておくと、addslashes()による対応はSQLインジェクションが可能になるのでやめましょうと結構前から言われているので、あまり正しく理解できていない状態で使うものではなかったりします。 ※そのあたり、調べるとすぐ出てきます。