Использование кавычек в MySQL

У меня есть список из 1000 товаров, которые я сейчас импортирую в OpenCart. Некоторые названия продуктов содержат кавычки, обозначающие дюймы (например, 5 дюймов).

Я успешно импортировал все эти продукты, используя этот запрос:

$data['name'] = mysql_escape_string($data['name']);
$sql = "INSERT INTO ".DB_PREFIX."product-description SET language_id = '1', name = '".$data['name']."'";
$query = mysql_query($sql);

Когда я нахожусь в OpenCart, список продуктов также отображается корректно, однако, когда я перехожу к редактированию продукта, поле ввода заголовка (которое предназначено для отображения названия) вырезает заголовок, начиная с символа «.

Вот наглядный пример: введите здесь описание изображения

Здесь мы видим, что заголовок завершен введите здесь описание изображения

Здесь мы видим, что название было вырезано после «.

Я могу подтвердить, что это не ошибка кодирования OpenCart, потому что, если я вручную вставляю продукты из интерфейса с помощью ", он работает нормально. Ошибка должна заключаться в моем запросе.

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


person Peter Stuart    schedule 06.11.2012    source источник
comment
Пояснительные знаки не при чем. Это кавычки.   -  person meagar    schedule 06.11.2012
comment
еще одна причина перейти на метрику.   -  person    schedule 06.11.2012
comment
Функция mysql_escape_string устарела в PHP 5.3.0. Вместо этого следует использовать функцию mysqli_real_escape_string.   -  person Alexander    schedule 06.11.2012
comment
Я не использую PHP 5.3.0 и не хочу обновлять его в данный момент. И @meagar для исправления, я не могу поверить, что перепутал их!   -  person Peter Stuart    schedule 06.11.2012
comment
Вы подтвердили, что $data['name'] содержит правильный материал, прежде чем использовать его в запросе?   -  person Marc B    schedule 06.11.2012
comment
Да, я запустил echo $data['name']; и показывает как надо.   -  person Peter Stuart    schedule 06.11.2012
comment
echo $sql и опубликуйте фактический запрос.   -  person Sammitch    schedule 06.11.2012
comment
Можете ли вы выполнить SELECT в базе данных для строки, которую вы вставили через свой скрипт импорта, и отдельную для строки, которую вы вставили через интерфейс OpenCart, чтобы увидеть, есть ли кавычки в обоих?   -  person Fanis Hatzidakis    schedule 07.11.2012


Ответы (3)


Я не знаю внутренностей OpenChart, но этот симптом вполне понятен и распространен:

Здесь мы видим, что заголовок был обрезан после ".

Обычно это означает, что содержимое передается в HTML без предварительного экранирования HTML. Например, вы получили INPUT следующим образом:

<input type="text" value="#VAL#" />

#VAL# — это заполнитель, который при необходимости заменяется значением. Но когда ваше значение равно Tablet 7" No Name, тогда ваш HTML будет выглядеть так:

<input type="text" value="Tablet 7" No Name" />

что ясно объясняет, почему он обрезается после первого ". Решение состоит в том, чтобы использовать указанное экранирование (или использовать более подходящие имена - преобразовать специальные символы в сущности), что в случае HTML может быть обработано в PHP с помощью функции htmlspecialchars(), так что ваш SQL-запрос не имеет к этому никакого отношения - это просто вопрос неправильной обработки HTML-разметки.

Когда объекты обрабатываются правильно, приведенный выше пример будет выглядеть (в исходном коде) следующим образом:

<input type="text" value="Tablet 7&quot; No Name" />

что затем не создает проблем для браузера (и браузер дополнительно правильно отображает объект как ").

Подробнее о htmlspecialchars() и вообще о специальных символах в HTML здесь.

person Marcin Orlowski    schedule 06.11.2012
comment
Это может быть проблемой! Я даже не думал об этом! Чего я не понимаю, так это того, что когда я использую интерфейс для вставки продуктов, все нормально, когда я перехожу на страницу редактирования. Когда я использую свой прямой запрос, ему это не нравится... в любом случае, я попробую. - person Peter Stuart; 07.11.2012
comment
Спасибо, это было круто! Я забыл пометить это как ответ! Спасибо еще раз! - person Peter Stuart; 18.12.2012

openCart устроен так, что он избегает всего HTML в любых данных, которые он собирается хранить в БД до сохранения. Итак, вам просто нужно изменить:

$data['name'] = mysql_escape_string($data['name']);

to:

$data['name'] = mysql_escape_string(htmlspecialchars($data['name'], ENT_QUOTES));
person YuPaul    schedule 07.11.2012

Когда вы собираете данные из формы, просто экранируйте все кавычки обратной косой чертой \. Замените все одинарные кавычки ' на \'

person Vinod Vishwanath    schedule 06.11.2012
comment
Вот что делает его строка: $data['name'] = mysql_escape_string($data['name']);. - person newfurniturey; 06.11.2012