Наборы символов и порядок сопоставления
Как уже говорилось, одна из ваших проблем может быть вплоть до наборов символов и сортировки. Вам необходимо убедиться, что вся цепочка (вход, хранение и вывод) правильно настроена для обработки символов, которые вы используете. 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. Какой метод вы выбираете, зависит от источника ваших данных и от того, как вы хотите его отображать.
mysql_real_escape_string решает проблему с одиночной кавычкой. Я могу заменить все двойные кавычки одиночными кавычками. Это оставляет только проблему с отображением значений кнопок в виде HTML-кода (например, я хочу использовать надстрочные символы на кнопках), но я думаю, что для этого не может быть решения. Большое спасибо за помощь! – Fred
@Fred: IMO mysql_real_escape_string - это неприятный взломать, которого следует избегать, когда доступны готовые заявления. Можете ли вы обновить свой вопрос, чтобы включить дополнительную информацию о значениях кнопок? – Mike
Подготовленные заявления звучат как хорошая идея, но я довольно новичок в этом и не понимаю, как ее использовать. Что мне нужно добавить в мою вставку mysql? Что касается значений кнопок, у меня есть викторина с несколькими вариантами выбора с четырьмя альтернативами, отображаемыми на четырех кнопках. Например, я прошу фактор префикса zetta, и одна из кнопок должна показывать 10 и 21 в теге sup (но, конечно, я не хочу, чтобы сам тег показывал. – Fred