1

我正在尝试使用数据类型String将包含 HTML 的内容存储在 MySQL 数据库中。Longtext但它总是说“你的 SQL 语法有错误”。我试图存储一个正常的String,它的工作原理。

更新

这是查询:

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

我正在使用 Java。

4

4 回答 4

9

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 内容。希望这可以帮助。

于 2010-04-14T22:55:21.013 回答
2

尝试mysql_real_escape_string对要存储的字符串使用函数。这是最简单的方法。

于 2010-04-14T22:47:47.477 回答
1

您需要在将字符串插入数据库之前对其进行转义。

于 2010-04-14T22:46:22.280 回答
1

没有看到查询很难说。你能发帖吗?

我假设 html 字符串的某些部分需要转义,也许你错过了?

于 2010-04-14T22:46:53.123 回答