我正在执行此查询:
INSERT INTO sent_emails(mailBody,azRatesFilesSendingId,fileName,tarrif_id,destination,cc,bcc,email_content,attached_file)VALUES('亲爱的先生,
请查找随附的TELTAC WORLDWIDE Rate通知。
根据客户经理的批准,今天有效。
< / p>
请将您的收据确认给ra@teltacworldwide.com
问候,
================================== 价格部门
Teltac World Wide Inc.
Verdun Racreet 3楼Ibisa Bldg
POBox:43 Br
电话:+9632分机:114
F338
电子邮件:ratom
================= ==================
','33435','Teltac-Rate Sheet-ATel 2013-Apr-19 ”, '276', 'ratcation.com', 'ratrldwide.com', '', '查看', '开')
当有人试图执行它时,它会给我一个语法错误:
DBHandler中的错误--- executeUpdateQuery - &gt; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在“MsoNormal”附近使用正确的语法style =“margin:0in 0in 0pt;”&gt;亲爱的先生,
但是当我在MySql服务器中执行它时,语句成功执行并返回一行有效! 所以我可以看到它不是语法错误,但我无法弄清楚问题是什么!
答案 0 :(得分:0)
这似乎是String
连接和查询构建的问题。如果没有实际代码,这只是猜测,但它是受过教育的。
使用String
概念将任意String
插入数据库时,这是一个非常常见的问题。例如
final String query = "SELECT * FROM my_table WHERE value = '" + value + "'";
上面的查询看起来很好,它做了它应该做的事情。但如果value
意外发生了什么呢?
final String value = "damn, it's got an apostrophe";
现在突然你的查询破了。更糟糕的是,如果我们有什么
final String value = "something'; DROP DATABASE myDatabase --";
然后我们遇到了一个真正的问题。
您应该使用PreparedStatement
来执行查询,否则您可能会遇到各种奇怪的问题,通常称为SQL注入。
以下是使用您的查询和SET
语法的示例,该语法在PreparedStatement
s中更清晰。
final String query = "INSERT INTO sent_emails SET"
+ "mailBody = ?,"
+ "azRatesFilesSendingId = ?,"
+ "fileName = ?,"
+ "tarrif_id = ?,"
+ "destination = ?,"
+ "cc = ?,"
+ "bcc = ?,"
+ "email_content = ?,"
+ "attached_file = ?";
final PreparedStatement preparedStatement = conn.prepareStatement(query);
preparedStatement.setString(1, mailBody);
preparedStatement.setInt(2, azRatesFilesSendingId);
//and the rest of the parameters.
答案 1 :(得分:0)
问题在于格式化。
您的邮件正文中可能包含样式信息的HTML代码,其中也包含“'”。
在将文本插入数据库之前,应确保转义所有单括号和双括号。
答案 2 :(得分:0)
我使用了来自apache .jar的StringEscapeUtils,它就像一个魅力!我读到它不安全,因为它可能带来一个SQL注入问题,但由于这个应用程序只在内部使用,我认为它是安全的!