Хранить HTML в базе данных MySQL

Я пытаюсь сохранить String который содержит HTML в базе данных MySQL, используя Longtext тип данных. Но он всегда говорит: "В вашем синтаксисе SQL есть ошибка". Я пытался хранить нормальный String и это работает.

Обновление:

Это запрос:

st.executeUpdate("insert into website(URL,phishing,source_code,active) values('" + URL + "','" + phishingState + "','" + sourceCode + "','" + webSiteState + "');");

Я использую Java.

4 ответа

Строки в запросе SQL обычно заключаются в одинарные кавычки. Например

INSERT INTO tbl (html) VALUES ('html');

Но если строка HTML сама содержит одинарную кавычку, это нарушит SQL-запрос:

INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');

Вы уже видите это в подсветке синтаксиса, значение SQL заканчивается прямо перед foo и интерпретатор SQL не может понять, что произойдет после этого. Ошибка синтаксиса SQL!

Но это не единственное, оно также открывает двери для инъекций SQL ( примеры здесь).

Вам действительно нужно санировать SQL во время создания SQL-запроса. Как это сделать, зависит от языка программирования, который вы используете для выполнения SQL. Если это, например, PHP, вам понадобится mysql_real_escape_string():

$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";

Альтернативой в PHP является использование подготовленных операторов, они будут обрабатывать экранирование SQL для вас.

Если вы используете Java ( JDBC), то вам нужно PreparedStatement:

String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);

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

String sql = "INSERT INTO website (URL, phishing, source_code, active) VALUES (?, ?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, URL);
preparedStatement.setString(2, phishingState);
preparedStatement.setString(3, sourceCode);
preparedStatement.setString(4, webSiteState);
preparedStatement.executeUpdate();

Не забудьте правильно обрабатывать ресурсы JDBC. Вы можете найти эту статью полезной, чтобы получить представление о том, как правильно выполнять базовые функции JDBC. Надеюсь это поможет.

Попробуйте использовать mysql_real_escape_string Функция на строку, которую вы хотите сохранить. Это самый простой способ.

Вам нужно экранировать строку перед тем, как вставить ее в базу данных.

Сложно сказать, не видя запроса. Вы можете опубликовать это?

Я предполагаю, что есть некоторая часть html-строки, которую нужно экранировать, что, возможно, вы пропустили?

Другие вопросы по тегам