想象一下,我的页面有一堆类似于这样(示例页)的部分:
<div class="content">
</div>
我的目标是将整个页面抓取到一个MySQL DB条目中。我现在这样做:
//Declare SQL statement
String sql = "INSERT into rns " +
"(rns_pub_date, rns_headline, rns_link, rns_fulltext, constituent_id) values (\""+
rns.getRnsPubDate() + "\",\"" +
rns.getRnsHeadline() + "\",\"" +
rns.getRnsLink() + "\",\"" +
rns.getRnsFullText() + "\",\"" +
"(select constituent_id from constituent where constituent_name = " + rns.getRnsConstituentName() + "\")";
//SQL Statement Debug
Log.d(CLASS_NAME, "createRns. sqlStatement: " + sql);
//Initialize insertValues
insertValues = connect.prepareStatement(sql);
但是,由于页面中有多个“标记”,这一问题就结束了。
我可以看到一些选择:
我意识到在防止SQL注入方面也有最佳实践。然而,这是一个独立的系统,所以暂时不是一个问题。话虽如此,如果有任何答案可以解释如何防止这种情况,我宁愿执行。
编辑1:从@chrylis评论开始。这就是我所拥有的:
//Insert values into variables
String rns_pub_date = rns.getRnsPubDate();
String rns_headline = rns.getRnsHeadline();
String rns_link = rns.getRnsLink();
String rns_fulltext = rns.getRnsFullText();
String rns_constituent_name = rns.getRnsConstituentName();
//Prepare the SQL string
String sql = "INSERT into rns (rns_pub_date, rns_headline, rns_link, rns_fulltext,constituent_id) VALUES" + "(?,?,?,?,(select constituent_id from constituent where constituent_name = \"" + rns.getRnsConstituentName() + "\")";
//Prepare the statement
PreparedStatement prest = connect.prepareStatement(sql);
prest.setString(1, rns_pub_date);
prest.setString(2, rns_headline);
prest.setString(3, rns_link);
prest.setString(4, rns_fulltext);
prest.setString(5, rns_constituent_name);
但是,它提供了此错误:
Parameter index out of range (5 > number of parameters, which is 4).
编辑2:
插入是通过删除第5个参数的转义双引号来修正的:
String sql = "INSERT into rns (rns_pub_date, rns_headline, rns_link, rns_fulltext, constituent_id) VALUES" + "(?,?,?,?,(select constituent_id from constituent where constituent_name = ?))";
发布于 2013-09-22 07:49:50
使用PreparedStatement,就不需要转义了。用法示例在API中。
发布于 2013-09-22 07:50:00
这不仅是一个糟糕的实践,因为SQL注入,它也是缓慢和低效的,并有引号字符的问题。使用参数化查询。
https://stackoverflow.com/questions/18941536
复制相似问题