Хранить 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-строки, которую нужно экранировать, что, возможно, вы пропустили?