Máte správnou představu o zachování textu v databázi jako nezpracovaného. Nejste si jisti, k čemu jsou všechny ty věci HTML entity; při vkládání databáze byste to neměli dělat.
[Jediný důvod, proč mě napadá, proč byste se mohli pokusit dekódovat příchozí vstup pro databázi pomocí entit, by byl, když zjistíte, že získáváte odkazy na znaky jako Š
ve vstupu pro odeslání formuláře. Pokud k tomu dochází, je to proto, že uživatel zadává znaky, které v kódování používaném stránkou s formulářem neexistují. Tato forma kódování je zcela falešná, protože pak nemůžete rozlišit mezi zadáním uživatele Š
a doslova napsáním Š
! Tomu byste se měli vyhnout tím, že pro všechny své stránky a obsah použijete kódování UTF-8, protože do tohoto kódování se hodí každý možný znak.]
Řetězce ve vašem skriptu by měly být vždy surový text bez escapování. To znamená, že s nimi nic neprovedete, dokud je nevyvedete do kontextu, který není prostý text. Takže pro jejich vložení do řetězce SQL:
$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");
(nebo použijte parametrizované dotazy, abyste nemuseli ručně escapovat.) Při vkládání obsahu do HTML:
<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />
(můžete definovat pomocnou funkci s kratším názvem, například function h($s) { echo htmlspecialchars($s, ENT_QUOTES); }
pokud chcete snížit množství psaní, které musíte dělat v šablonách.)
A... to je skoro vše. Řetězce, které vycházejí z databáze, nemusíte zpracovávat, protože se již jedná o nezpracované řetězce. Nemusíte zpracovávat vstupní řetězce (*), kromě jakéhokoli ověření pole specifického pro aplikaci, které chcete provést.
*:dobře, s výjimkou magic_quotes_gpc
je zapnuto, v takovém případě musíte buď použít stripslashes()
vše, co přichází z get/post/cookie, nebo, moje oblíbená možnost, prostě okamžitě selže:
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!'
);