Как сохранить котировки в базе данных MySQL

Всякий раз, когда я добавляю одинарную кавычку (') или двойную кавычку (") в поле формы PHP, она будет сохранена в моей базе данных MySQL как " / '. Как сохранить «настоящие» «кавычки» в моей БД?

Я пытался предотвратить это, установив безопасное соединение Mysql через PDO, но, похоже, оно не работает должным образом.

Итак, вот важная часть моего кода:

    $insert_hello = filter_var($_POST['hello'], FILTER_SANITIZE_STRING);
    $dbh->query("SET NAMES 'utf8'");
    $stmt = $dbh->prepare("INSERT INTO testtable (data) VALUES (:hello)");
    $stmt->bindParam(':hello', $insert_hello, PDO::PARAM_STR);      
    $stmt->execute();

Некоторая справочная информация:

Сервер работает на PHP v5.2.12-0.

Движок DBStorage — это InnoDB, а его кодировка клиента, соединения, результатов и системы установлена ​​на utf8.

Для поля БД задана сортировка utf8_unicode_ci.

Волшебные кавычки отключены через .htaccess.

Заранее спасибо!

С уважением, Jroen


person Jroen    schedule 29.07.2011    source источник
comment
Мне кажется, что вы делаете преобразование с filter_var. Почему вы фильтруете, если хотите сохранить необработанную строку?   -  person dkretz    schedule 29.07.2011
comment
Привет! Я полагаю, вы правы, Ле Дорфье. filter_var не нужен и именно он превращает кавычки в шестнадцатеричные коды. При удалении это сделает мой скрипт уязвимым для инъекций?   -  person Jroen    schedule 29.07.2011
comment
Ле Дорфье прав, я никогда не использовал PDO, но похоже, что экранирование SQL должно выполняться $stmt->bindParam(...), поэтому нет необходимости в filter_var()... Просто попробуйте изменить эту первую строку на $inset_hello = $_POST['hello']; и посмотреть, что произойдет при публикации текста, содержащего одинарные кавычки..   -  person redShadow    schedule 29.07.2011
comment
@Jroen, ‹quote›Если убрать это, мой скрипт станет уязвимым для инъекций?‹/quote›, нет, поскольку PDO должен очищать данные для вас. Если это не так, измените DBAL: P   -  person redShadow    schedule 29.07.2011


Ответы (4)


Хорошо, просто чтобы формализовать правильный ответ:

Проблема вызвана filter_var(), который преобразует некоторые символы в объекты HTML. Нет необходимости вручную очищать данные, так как PDO сделает это за вас.

Вы можете просто написать что-то вроде этого, это должно работать нормально:

$dbh->query("SET NAMES 'utf8'");
$stmt = $dbh->prepare("INSERT INTO testtable (data) VALUES (:hello)");
$stmt->bindParam(':hello', $_POST['hello'], PDO::PARAM_STR);      
$stmt->execute();
person redShadow    schedule 29.07.2011

Лучше всего оставить это как есть и html декодировать при чтении.

person Francis Gilbert    schedule 29.07.2011
comment
Извини, Фрэнсис, ничего не могу сделать. Я не хочу оставлять это так, потому что я буду использовать данные из этих полей в своей базе данных CRM. (который не расшифровывается) - person Jroen; 29.07.2011
comment
нет, определенно это не лучшая идея. Просто очень уродливый обходной путь. - person redShadow; 29.07.2011

Для этого вы можете использовать функцию php $decoded_insert_hello = html_entity_decode($insert_hello, ENT_QUOTES).

http://www.php.net/manual/en/function.html-entity-decode.php

person Jesse Cohen    schedule 29.07.2011
comment
По словам этого парня (см.: bit.ly/iFr2uz), в декодировании нет необходимости. Он говорит: Красота (и сила) использования параметризованных запросов заключается в том, что базовый драйвер заботится о заключении в кавычки и экранировании вместо вас (а также помогает защититься от SQL-инъекций), базовый драйвер соответствующим образом будет заключать в кавычки и экранировать параметр. значение, чтобы были вставлены правильные данные (например, данные Брайана). - person Jroen; 29.07.2011
comment
это две совершенно разные вещи. ваша база данных просто хранит текстовые строки, она не знает, откуда берутся строки или каким-либо образом их преобразует. он просто сохраняет их в том виде, в каком вы их предоставляете, избегая только специальных символов, которые могут запутать базу данных или подвергнуть вас атакам путем внедрения. вы передаете строку в кодировке html, и вы, по сути, хотите преобразовать ее в простую строку ascii, база данных не будет делать это за вас: это было бы похоже на передачу строки на французском языке и запрос вашей базы данных перевести ее на английский язык перед хранением - вы должны сначала сделать это сами. - person Jesse Cohen; 29.07.2011
comment
(продолжение) как только вы передадите строку механизму базы данных, он будет экранировать любые символы, имеющие какое-либо значение в sql, но он ничего не знает о формате html или о том, какие символы имеют значение в html. (надеюсь, я ясно выразился, объяснение было немного затянутым). - person Jesse Cohen; 29.07.2011

Вот так выглядят мои данные в виде ответа API, которые я хочу хранить в базе данных MYSQL. Он содержит цитаты, HTML-код и т. д.

Пример:-

{

rewardName: "Cabela's eGiftCard $25.00",

shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at&nbsp;<a href="http://adidas.com/">adidas.com</a>.</p>

terms: '<p>adidas Gift Cards may be redeemed for merchandise on&nbsp;<a href="http://adidas.com/">adidas.com</a>&nbsp;and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'

}

РЕШЕНИЕ

CREATE TABLE `brand` (
`reward_name` varchar(2048),
`short_description` varchar(2048),
`terms` varchar(2048),  
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

При вставке In следует JSON.stringify()

    let brandDetails= {
    rewardName: JSON.stringify(obj.rewardName),  
    shortDescription: JSON.stringify(obj.shortDescription),
    term: JSON.stringify(obj.term),
     }

Выше находится объект JSON, а ниже — SQL-запрос, который вставляет данные в MySQL.

let query = `INSERT INTO brand (reward_name, short_description, terms) 
VALUES (${brandDetails.rewardName}, 
(${brandDetails.shortDescription}, ${brandDetails.terms})`;

Это сработало ....

введите здесь описание изображения

Если ничего не работает, попробуйте это:

var res = str.replace(/'/g, "\\'");
var res = res.replace(/"/g, "\\\"");

Он добавляет escape-символ \ ко всем вхождениям ' и

Не уверен, что это правильный/профессиональный способ решения проблемы

Я предполагаю, что это сработает, но в реальном содержании все одинарные и двойные кавычки будут заменены символом \

person Ajay Kharat    schedule 21.06.2021