У вас есть правильная идея сохранить текст в базе данных как сырой. Не уверен, для чего нужны все сущности 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!'
);