2015-06-22 3 views
1

Я пытаюсь решить проблему на странице, которая собирает информацию из формы. В <head> мы имеем:Работа со специальными символами (апострофы) в MySQL и PHP

<meta http-equiv="content-type" content="text/html;charset=utf-8" /> 

После подключения к базе данных есть строка:

mysql_query("SET NAMES utf8"); 

Одно из полея, которые вставляются в переменных $ комментариев обычно апостроф поэтому у нас есть строка:

$comments= addslashes($comments); 

перед тем как вставить его в базу данных.

Когда мы пытаемся прочитать из базы данных в другой странице мы выполняем эту строку

stripslashes($row[$comments]); 

Когда мы "получаем простую? (Вопросительный знак), это фактически хранящийся, как это в MySql.

других символы, такие как простой апостроф 'просто становится ... в базе данных и или аналогичных.

Как избавиться от этих символов вопросительного знака и сохранить исходные данные?

+0

Вы должны использовать 'PDO' или' mysqli подготовленные заявления', это решит эту проблему и SQL-инъекции !!! – cmorrissey

+0

** ПРЕДУПРЕЖДЕНИЕ **: Если вы просто изучаете PHP, пожалуйста, не изучайте устаревший интерфейс 'mysql_query'. Это ужасно и удаляется в будущих версиях PHP. Современная замена, такая как [PDO, не трудно учиться] (http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/). Руководство, подобное [PHP The Right Way] (http://www.phptherightway.com/), может помочь объяснить лучшие практики. Всегда будьте абсолютно уверены * ваши пользовательские параметры [правильно экранированы] (http://bobby-tables.com/php), или у вас будут серьезные [ошибки SQL-инъекций] (http://bobby-tables.com/). – tadman

ответ

1

addslashes() - неправильная функция экранирования. Вы должны использовать mysql_real_escape_string(), потому что экранирование зависит от используемого набора символов. И из-за этого вам следует также использовать mysql_set_charset(), который должен заменить ваш запрос SET NAMES utf8.

И все вместе, обратите внимание, что расширение mysql устарело и будет удалено с PHP. Вместо этого используйте mysqli.

Обратная сторона также неверна. Нет необходимости удалять экранирование - его удаляли при «использовании» во время запроса. Однако вы должны убедиться, что вы правильно кодируете все данные, выводимые в HTML.

Смежные вопросы