Это очень важный вопрос, и на самом деле он имеет простой ответ в виде кодировок. Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете много языков одновременно. Сначала вы находитесь в HTML, затем в PHP и через несколько секунд в SQL. Все эти языки имеют свои правила синтаксиса.
Следует помнить следующее: строка всегда должна быть в правильном кодировании.
Давайте возьмем пример. У вас есть HTML-форма, и пользователь вводит в нее следующую строку:
I really <3 dogs & cats ;')
После нажатия кнопки отправки эта строка отправляется в ваш PHP-скрипт. Предположим, это делается через GET. Он добавляется к URL-адресу, который имеет собственный синтаксис (например, символ & имеет особое значение), поэтому мы меняем языки. Это означает, что строка должна быть преобразована в правильную кодировку URL. В этом случае браузер делает это, но PHP также имеет функцию urlencode
для этого.
В сценарии PHP строка хранится в $_GET
, закодированном в виде строки PHP. Пока вы кодируете PHP, это прекрасно. Но теперь давайте поместим строку для использования в запросе SQL. Мы меняем языки и правила синтаксиса, поэтому строка должна быть закодирована как SQL с помощью функции mysql_real_escape_string
.
С другой стороны, мы можем захотеть снова отобразить строку для пользователей. Мы получаем строку из базы данных, и она возвращается нам в виде строки PHP. Когда мы хотим встроить его в HTML для вывода, мы снова меняем языки, поэтому мы должны кодировать нашу строку в HTML с помощью функции htmlspecialchars
.
На протяжении всего пути строка всегда находилась в правильной кодировке, что означает, что с любым символом, который может придумать пользователь, будут обрабатываться соответственно. Все должно быть гладко и безопасно.
Что следует избегать (иногда это даже рекомендуется невежественным человеком), так это преждевременное кодирование вашей строки. Например, вы можете применить htmlspecialchars
к строке перед тем, как поместить ее в базу данных. Таким образом, когда вы позже извлекаете строку из базы данных, вы можете вставить ее в HTML без проблем. Великолепно звучат? Да, действительно здорово, пока вы не начнете получать билеты в службу поддержки людей, интересующихся, почему их чеки в формате PDF заполнены & >
мусором.
В коде:
form.html:
<form action="post.php" method="get">
<textarea name="comment">
I really <3 dogs & cats ;')
</textarea>
<input type="submit"/>
</form>
URL, который он генерирует:
http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&%20cats%20;')
post.php:
// Connect to database, etc....
// Place the new comment in the database
$comment = $_GET['comment']; // Comment is encoded as PHP string
// Using $comment in a SQL query, need to encode the string to SQL first!
$query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'";
mysql_query($query);
// Get list of comments from the database
$query = "SELECT comment FROM posts";
print '<html><body><h2>Posts</h2>';
print '<table>';
while($post = mysql_fetch_assoc($query)) {
// Going from PHP string to HTML, need to encode!
print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>';
}
print '</table>';
print '</body></html>'