Materi
Pencarian "mengandung kata" memakai LIKE dengan pola %kata%. Polanya disusun di Python lalu dikirim sebagai parameter, jadi tidak ada injeksi. Masalahnya lain: di dalam pola, % berarti nol atau lebih karakter apa saja dan _ berarti tepat satu karakter. Pengguna yang mencari 50% juga mendapat Gula aren 500 gram, dan pencarian Kode_A ikut menemukan KodeXA. Dokumentasi SQLite menyediakan klausa ESCAPE: karakter yang ditunjuknya membuat % atau _ sesudahnya dibaca sebagai huruf biasa. Escape karakter pelolosnya sendiri dulu, baru % dan _. LIKE di SQLite juga tidak membedakan huruf besar-kecil untuk huruf ASCII.
Daftar IN punya kebutuhan berbeda: banyaknya nilai baru diketahui saat program berjalan. Teks placeholder-nya dirakit dari PANJANG daftar, misalnya ", ".join("?" * len(ids)), sedangkan nilainya tetap dikirim lewat parameter. Yang dirakit hanya deretan tanda tanya buatan programmer, bukan nilai dari pengguna. Daftar kosong ditangani sebelum query dibuat.
kata = "100%" # dari kotak pencarian
aman = kata.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_")
conn.execute("SELECT judul FROM artikel WHERE judul LIKE ? ESCAPE '\\'", (f"%{aman}%",))
ids = [4, 9, 12]
tanda = ", ".join("?" * len(ids)) # "?, ?, ?"
conn.execute(f"SELECT judul FROM artikel WHERE id IN ({tanda})", ids)