2011-08-19 5 views
0

У меня есть база данных mysql с вопросами и ответами, которые отображаются в пунктах и ​​кнопках HTML. Д & а содержит множество специальных символов, например, é, ... ",", ö, а также некоторые HTML-теги, как вир.Специальные символы в базе данных mysql

Я попытался mysqli_real_escape_string, htmlentities и добавления, но некоторые управляющими последовательностями символов всегда показывают неправильно на Иногда это правильно в абзацах, но неверно на кнопках.

Какая правильная функция используется для правильного отображения всех этих специальных символов и когда я должен ее использовать (при вставке в базу данных или при выборе из база данных/превращение ее в HTML?

Большое спасибо

ответ

2

Наборы символов и порядок сопоставления

Как уже говорилось, одна из ваших проблем может быть вплоть до наборов символов и сортировки. Вам необходимо убедиться, что вся цепочка (вход, хранение и вывод) правильно настроена для обработки символов, которые вы используете. UTF-8 часто является хорошим выбором, так как он может обрабатывать каждый символ в наборе символов Юникода.

Чтобы создать базу данных MySQL или таблицы с использованием UTF-8 с нечувствительным к регистру сортировки:

CREATE DATABASE mydb 
    DEFAULT CHARACTER SET utf8 
    DEFAULT COLLATE utf8_general_ci; 

CREATE TABLE mytable (...) 
    DEFAULT CHARACTER SET utf8 
    DEFAULT COLLATE utf8_general_ci; 

Спасаясь

mysql_real_escape_string (я предполагаю, что вы используете PHP) используется для помогите парсеру MySQL различать ваши параметры и ключевые слова SQL. Он используется, когда команда весь SQL поставляется в виде одной строки:

INSERT INTO mytable VALUES ("this \" is a double quote"); 

обратной косой требуется, чтобы помочь MySQL понять, что двойные кавычки в середине строки, на самом деле дословный двойные кавычки в середине строки, а не закрывающей двойной кавычки.

Убегая данные перед их вставкой в ​​базу данных, вы непосредственно изменяете эти данные: вы больше не храните исходные данные и поэтому должны их повторно обрабатывать, когда вы извлекаете их из базы данных (чтобы избежать Это).

Подготовленные заявления

Чтобы сделать вещи проще, для вас и Mysql, вы можете использовать вместо prepared statements.Подготовленные заявления использовать заполнители, чтобы показать, какие именно MySQL частей оператора SQL являются вашими параметры:

$stmt = $dbh->prepare("INSERT INTO mytable VALUES (?)"); 
$stmt->execute(array('this " is a double quote')); 

Используя подготовленные заявления, вы можете вставить свои данные в базу данных неизмененном - не требуется грязное маскирование. Это имеет дополнительное преимущество, значительно уменьшая вероятность внедрения SQL. См. Bill Karwin'sSql Injection Myths and Fallaciestalk и slides для получения дополнительной информации по этому вопросу.

Выход

Теперь, когда ваши данные хранятся в оригинальном формате, вы можете вывести его, однако вы хотите. Если вы выводите HTML (для отображения в виде буквального HTML), вам нужно будет избежать его до вывода. Существует несколько способов сделать это, включая htmlspecialchars и HTML Purifier. Какой метод вы выбираете, зависит от источника ваших данных и от того, как вы хотите его отображать.

+0

mysql_real_escape_string решает проблему с одиночной кавычкой. Я могу заменить все двойные кавычки одиночными кавычками. Это оставляет только проблему с отображением значений кнопок в виде HTML-кода (например, я хочу использовать надстрочные символы на кнопках), но я думаю, что для этого не может быть решения. Большое спасибо за помощь! – Fred

+0

@Fred: IMO mysql_real_escape_string - это неприятный взломать, которого следует избегать, когда доступны готовые заявления. Можете ли вы обновить свой вопрос, чтобы включить дополнительную информацию о значениях кнопок? – Mike

+0

Подготовленные заявления звучат как хорошая идея, но я довольно новичок в этом и не понимаю, как ее использовать. Что мне нужно добавить в мою вставку mysql? Что касается значений кнопок, у меня есть викторина с несколькими вариантами выбора с четырьмя альтернативами, отображаемыми на четырех кнопках. Например, я прошу фактор префикса zetta, и одна из кнопок должна показывать 10 и 21 в теге sup (но, конечно, я не хочу, чтобы сам тег показывал. – Fred

0

Если вы убедитесь, что ваша кодировка базы данных и кодировка страниц являются UTF-8, это должно помочь в значительной части пути.

0

Я подозреваю, что проблема заключается в использовании наборов символов. Ваша настройка mysql должна поддерживать символы, которые вы пытаетесь использовать, и ваши веб-страницы должны быть в соответствующем наборе символов.

Скорее всего, ваша база данных MySQL использует сопоставление, такое как latin1_general_ci, в то время как ваши веб-страницы предположительно отображаются в UTF-8. Я предлагаю вам установить MySQL для хранения данных в UTF-8, и ваши веб-страницы должны вывести заголовок, указав, что это UTF-8.

+0

В HTML говорится: , а сортировка базы данных - utf8_general_ci. Это нормально? С этими настройками и без использования каких-либо функций php для специальных символов абзацы выглядят нормально, но текст кнопок в двойных кавычках не отображается, а HTML-теги отображаются как есть (не сделаны в пользовательский вывод). Кроме того, чтобы иметь возможность вставлять в базу данных, мне нужно удалить все одинарные кавычки (которые нужны во многих именах). – Fred

+0

Вместо того, чтобы удалять одинарные кавычки, как правило, вы действительно хотите использовать подготовленный оператор для вставки данных (например, оператор должен быть чем-то вроде «вставить в значения комментариев (?,?,?)», И значения будут связаны – asc99c

+0

Извините, что добавил, наборы символов выглядят отлично. Я бы дважды проверял (в чем-то вроде Firebug), что браузер действительно видит UTF-8. В какой-то момент у нас была проблема с приложением, Заголовки Apache сказали ISO-8859-1, в то время как наш метатег заявил UTF-8. – asc99c

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