Du har rätt idé att behålla texten i databasen som rå. Inte säker på vad alla HTML-entitetsgrejer är till för; du borde inte behöva göra det för en databasinfogning.
[Den enda anledningen till att jag kan komma på varför du kan försöka entitetsavkoda inkommande indata för databasen är om du upptäcker att du får teckenreferenser som Š
i din formulärinlämning. Om det händer beror det på att användaren matar in tecken som inte finns i kodningen som används av sidan med formuläret. Denna form av kodning är helt falsk eftersom du då inte kan skilja på användaren som skriver Š
och bokstavligen skriva Š
! Du bör undvika detta genom att använda UTF-8-kodningen för alla dina sidor och innehåll, eftersom alla möjliga tecken passar i denna kodning.]
Strängar i ditt skript ska alltid vara råtext utan att behöva undkomma. Det betyder att du inte gör något med dem förrän du matar ut dem i ett sammanhang som inte är vanlig text. Så för att lägga in dem i en SQL-sträng:
$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");
(eller använd parametriserade frågor för att undvika att manuellt behöva undkomma det.) När du lägger innehåll i HTML:
<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />
(du kan definiera en hjälpfunktion med ett kortare namn som function h($s) { echo htmlspecialchars($s, ENT_QUOTES); }
om du vill skära ner på mängden att skriva måste du göra i mallar.)
Och... det är ganska mycket det. Du behöver inte bearbeta strängar som kommer ut från databasen, eftersom de redan är råsträngar. Du behöver inte bearbeta indatasträngar(*), annat än någon programspecifik fältvalidering du vill göra.
*:ja, förutom om magic_quotes_gpc
är aktiverat, i vilket fall behöver du antingen stripslashes()
allt som kommer in från get/post/cookie, eller, mitt favoritalternativ, misslyckas omedelbart:
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!'
);