Dalam Android, melaksanakan pertanyaan SQL selalunya melibatkan penggunaan ruang letak berparameter untuk mengelakkan kerentanan suntikan SQL. Ini berlaku apabila klausa IN digunakan. Pertimbangkan pertanyaan berikut:
<code>String names = "name1', 'name2"; // 动态生成 String query = "SELECT * FROM table WHERE name IN (?)"; Cursor cursor = mDb.rawQuery(query, new String[]{names});</code>
Walau bagaimanapun, Android tidak boleh menggantikan tanda soal dengan nilai yang disediakan. Sebagai alternatif, anda boleh memilih:
<code>String query = "SELECT * FROM table WHERE name IN (" + names + ")"; Cursor cursor = mDb.rawQuery(query, null);</code>
Walaupun pendekatan ini menghapuskan ancaman suntikan SQL, pendekatan ini gagal untuk meparameterkan pertanyaan dengan betul.
Untuk mencapai parameterisasi sambil mengelakkan risiko suntikan, pertimbangkan untuk menggunakan rentetan dengan corak pemegang tempat:
<code>String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")"; Cursor cursor = mDb.rawQuery(query, names);</code>
makePlaceholders(len) menjana rentetan yang mengandungi bilangan tanda soal yang diperlukan, dipisahkan dengan koma. Ini membolehkan pertanyaan dimasukkan dengan selamat tanpa menjejaskan parameterisasi.
Pelaksanaan makePlaceholder(len):
<code>String makePlaceholders(int len) { if (len < 1) { throw new IllegalArgumentException("Length must be > 0"); } StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); }</code>
Sila ambil perhatian bahawa SQLite biasanya menyokong sehingga 999 parameter hos, kecuali dalam beberapa versi Android tertentu.
Atas ialah kandungan terperinci Bagaimana untuk Meratakan Klausa IN dengan Selamat dalam Pertanyaan SQL Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!