我创建了这个完美的参数查询。现在,当一个字符串与顶点一起传递时,我收到此错误
SQLiteException: near "'%'":
这是查询
String sql = "SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table " +
"WHERE titolo LIKE '%" + parametro + "%' " +
"OR dato_campo LIKE '%" + parametro + "%' GROUP BY identificativo";
如果parametro
这是一个这种类型的字符串stringa'
,我收到错误。
我该如何解决?
答案 0 :(得分:2)
问题是你的String有一个单引号字符会破坏你的SQL查询字符串。
模拟parametro == test01
- 确定
"SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table WHERE titolo LIKE '%test01%' OR dato_campo LIKE '%test01%' GROUP BY identificativo";
模拟parametro == stringa'
NOK
"SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table WHERE titolo LIKE '%stringa'%' OR dato_campo LIKE '%stringa'%' GROUP BY identificativo";
如您所见,您的字符串正在生成'%stringa'%'
,这对于SQL查询无效。
您应该在查询期间将该字符'
转义为:%stringa''%'
。
因此,您可以在创建查询字符串之前添加如下内容:
parametro = parametro.replaceAll("\'","''");
String sql = "SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table " +
"WHERE titolo LIKE '%" + parametro + "%' " +
"OR dato_campo LIKE '%" + parametro + "%' GROUP BY identificativo";
这是对您现在面临的问题的支持......正如Gabe Sechan在另一个答案中提到的那样,应该不鼓励原始查询。
<强>更新强>
运行查询的安全方法是:
String paramentro = "stringa'";
Cursor cursor = db.query("tablename", new String [] {"titolo", "icona", "colore", "tipo", "identificativo", "dato_campo"}, "titolo LIKE ? OR dato_campo LIKE ?", new String[]{"%"+paramentro+"%", "%"+paramentro+"%"}, "identificativo", null, null, null);
答案 1 :(得分:1)
不要使用串联编写这样的SQL查询。它让您对SQL注入攻击持开阔态度。而是使用绑定参数。这不仅可以提高查询效率,还可以防止SQL注入。