Как правильно экранировать символы в SQL запросы, если нужно отправить HTML-код?

Вставляю (INSERT) данные в БД через PHP.

Данные тега $FnlCodeMsgMobile не вставляются.
$FnlCodeMsgMobile = "
<img src=\"$NewFileDir\" alt=\"$NewFileDir\" class='responsive-img' id='dynamic$maxIDNumberMobile'>
<script>
    document.getElementById('$maxIDNumberMobile').addEventListener('click', function() {
        lightGallery(document.getElementById('$maxIDNumberMobile'), {
            dynamic: true,
            thumbnail: true,
            dynamicEl: [{
                "src": '$NewFileDir',
            }]
        })

    });
</script>
";

Причём если присвоить переменной просто "Test", то всё вставляется. Что ещё нужно экранировать, чтобы строка успешно вставилась в БД?

В общем просто заменил одинарные кавычки на двойные и их тоже экранировал, всё вставилось и заработало.
  • Вопрос задан
  • 419 просмотров
Решения вопроса 1
@FanatPHP
HTML никак специально экранировать не нужно. И вообще ничего экранировать не нужно. Экранирование - это треш, угар, прошлый век и инъекции. Данные в БД надо просто посылать отдельно от запроса.

Удивительно, что на этот вопрос подписалось ещё столько народу.
Ну это я не знаю - как подписаться на вопрос "сколько будет шестью шесть?". Не "дважды два", но близко.
Работа с БД - это самые основы пхп, которые обсосаны в каждом учебнике со всех сторон. Неужели всё так плохо, что этот вопрос вызывает столь живой интерес, чтобы попасть в список интересных на тостере?

Причем твоя лично проблема здесь совсем не в том, "как экранировать". HTML никак особо экранировать не нужно, базе данных абсолютно всё равно, что ты внее вставляешь. Твоя проблема в том, что ты в принципе не знаешь пхп и путаешься в основах языка, используешь устаревшую версию, которая не будет работать на живом сайте. И даже самый базовый синтаксис тебя пугает. Поэтому извини, я буду писать ответ не для тебя, а для тех, кто, в который раз, задается этим вечнозеленым вопросом, но по какой-то причине не смог освоить базовые навыки работы с гуглем/яндексом.

Чтобы вставить данные в mysql, и вообще никогда не думать ни про какое "экранирование", надо
1. Все переменные в запросе заменить на знаки вопроса
2. Подготовить запрос к исполнению
3. Привязать переменные к знакам вопроса
4. Выполнить запрос.

Как я уже говорил, функций, которые начинаются на mysql, в языке давно нет. Остаются только те, которые начинаются на mysqli и PDO. Вот для них я и приведу примеры.

mysqli
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter) VALUES(?, ?)"; // заменем
$stmt = $mysqli->prepare($query); // подготавливаем
$stmt->bind_param("ss", $type, $reporter); // привязываем
$stmt->execute(); // исполняем

Важно! Чтобы этот код работал, сначала надо правильно установить соединение mysqli
PDO
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter) VALUES(?, ?)"; // заменяем
$stmt = $pdo->prepare($query); // подготавливаем
$stmt->execute([$type, $reporter]); // привязываем и исполняем

Важно! Чтобы этот код работал, сначала надо правильно установить соединение PDO

Также можно использовать сторонние библиотеки, с которыми все еще проще. Но использование сторонних библиотек почему-то пугат новичков хуже чем зомби на кладбище в безлунную ночь, поэтому настаивать не буду
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Люблю использовать библиотеку safemysql
https://github.com/colshrapnel/safemysql
phpfaq.ru/safemysql

Вкратце:
$data = array( 'field' => $FnlCodeMsgMobile );
$db->query( 'INSERT INTO ?n SET ?u', 'table_name', $data );
Ответ написан
AleksandrB
@AleksandrB
$data =
<<< start
<img src=\"$NewFileDir\" alt=\"$NewFileDir\" class='responsive-img' id='dynamic$maxIDNumberMobile'>
<script>
    document.getElementById('$maxIDNumberMobile').addEventListener('click', function() {
        lightGallery(document.getElementById('$maxIDNumberMobile'), {
            dynamic: true,
            thumbnail: true,
            dynamicEl: [{
                "src": '$NewFileDir',
            }]
        })

    });
</script>
start;

Как вариант Heredoc
Ответ написан
@granty
Никита Гуриев, сделайте
$sql = "INSERT INTO `ваша_таблица`  data='".mysql_real_escape_string($data)."' WHERE ваше условие вставки";

всё должно вставиться. Имя поля и имя таблицы поставьте ваши, $data из каммента Александра выше(полученные через Heredoc).

Без Heredoc у вас не работало, потому, что вы строку брали в двойные кавычки ", и внутри неё использовали " без экранирования в:
"src": '$NewFileDir',
и переносы строк внутри " " могли отрабатываться неправильно.


Есть железобетонный вариант вставить всё что угодно (если размера поля БД хватит):
$sql = "INSERT INTO `ваша_таблица`  data='".base64_encode( gzcompress($data) )."'";

а когда достаёте из БД - надо распаковать обратно:
$data = gzuncompress( base64_decode( $row['data' ] ) );

Из минусов:
- доп нагрузка на запаковку-распаковку, но для вашей строки это ерунда. base64_encode() увеличивает размер данных примерно в 1.5 раза, но zip жмёт сильнее.

Из плюсов:
- SQL-инъекции отсутствуют как класс
- ничего не надо экранировать.
- кодировка данных - по барабану, вставится даже UTF8-данные в таблицу cp1251. Главное, потом их отдать в правильной кодировке (когда вытащите из таблицы и будете отправлять в браузер)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы