猿问

in子句和占位符

in子句和占位符

我试图在Android中执行以下SQL查询:

    String names = "'name1', 'name2";   // in the code this is dynamically generated

    String query = "SELECT * FROM table WHERE name IN (?)";
    Cursor cursor = mDb.rawQuery(query, new String[]{names});

然而,Android并没有用正确的值代替问号。但是,我可以这样做,但这并不能防止SQL注入:

    String query = "SELECT * FROM table WHERE name IN (" + names + ")";
    Cursor cursor = mDb.rawQuery(query, null);

我如何才能绕过这个问题,并能够使用IN子句?


qq_遁去的一_1
浏览 907回答 3
3回答

慕的地6264312

如公认答案中所示,但不使用自定义函数生成逗号分隔的“?”。请检查下面的代码。String[] names = { "name1", "name2" }; // do whatever is needed first String query = "SELECT * FROM table"     + " WHERE name IN (" + TextUtils.join(",", Collections.nCopies(names.length, "?"))  + ")";Cursor cursor = mDb.rawQuery(query, names);

哈士奇WWW

表单的字符串"?, ?, ..., ?"可以是动态创建的字符串,并安全地放入原始SQL查询(因为它是不包含外部数据的受限表单),然后占位符可以正常使用。考虑一个函数String makePlaceholders(int len)返回len用逗号分隔的问号,然后:String[]&nbsp;names&nbsp;=&nbsp;{&nbsp;"name1",&nbsp;"name2"&nbsp;};&nbsp;//&nbsp;do&nbsp;whatever&nbsp;is&nbsp;needed&nbsp;firstString&nbsp;query&nbsp;=&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;table" &nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"&nbsp;WHERE&nbsp;name&nbsp;IN&nbsp;("&nbsp;+&nbsp;makePlaceholders(names.length)&nbsp;+&nbsp;")";Cursor&nbsp;cursor&nbsp;=&nbsp;mDb.rawQuery(query,&nbsp;names);只要确保传递的值和地方一样多就行了。默认最大值主机参数极限在SQLite中是999-至少在正常的构建中,不确定Android:)编码愉快。以下是一个实现:String&nbsp;makePlaceholders(int&nbsp;len)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&nbsp;<&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;It&nbsp;will&nbsp;lead&nbsp;to&nbsp;an&nbsp;invalid&nbsp;query&nbsp;anyway&nbsp;.. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException("No&nbsp;placeholders"); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder(len&nbsp;*&nbsp;2&nbsp;-&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("?"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<&nbsp;len;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(",?"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.toString(); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Android
我要回答