データベース内のテキストを未加工のままにしておくという正しい考えがあります。すべてのHTMLエンティティが何のためにあるのかわからない。データベースを挿入するためにそれを行う必要はありません。
[データベースの着信入力をエンティティデコードしようとする理由を私が考えることができる唯一の理由は、Š
のような文字参照を取得していることがわかった場合です。 フォーム送信入力で。それが起こっている場合、それはユーザーがフォームのページで使用されているエンコーディングに存在しない文字を入力しているためです。 Š
と入力しているユーザーを区別できないため、この形式のエンコードは完全に偽物です。 文字通りŠ
と入力します !すべての可能な文字がこのエンコーディングに適合するため、すべてのページとコンテンツにUTF-8エンコーディングを使用してこれを回避する必要があります。]
スクリプト内の文字列は、常にエスケープのない生のテキストである必要があります。つまり、プレーンテキストではないコンテキストに出力するまでは何もしません。したがって、それらをSQL文字列に入れるには:
$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");
(または、パラメーター化されたクエリを使用して、手動でエスケープする必要がないようにします。)コンテンツをHTMLに入れる場合:
<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />
(function h($s) { echo htmlspecialchars($s, ENT_QUOTES); }
のような短い名前でヘルパー関数を定義できます。 テンプレートで行う必要のある入力の量を減らしたい場合。)
そして...それはほとんどそれです。データベースから出てくる文字列はすでに生の文字列であるため、処理する必要はありません。実行するアプリケーション固有のフィールド検証を除いて、入力文字列(*)を処理する必要はありません。
*:magic_quotes_gpc
の場合を除いて、まあ がオンになっている場合は、stripslashes()
を実行する必要があります。 get / post / cookieから入ってくるものすべて、または私のお気に入りのオプションは、すぐに失敗します:
if (get_magic_quotes_gpc())
die(
'Magic quotes are turned on. They are utterly bogus and no-one should use them. '.
'Turn them off, you idiot, or I refuse to run. So there!'
);