Mengendalikan Pertanyaan DALAM Dengan Selamat: Memahami DI MANA DALAM Penyata
Apabila bekerja dengan pertanyaan pangkalan data , mendapatkan semula rekod tertentu berdasarkan set nilai adalah keperluan biasa. Pernyataan WHERE IN menyediakan cara yang cekap untuk mencapainya.
Skema dan Niat Pangkalan Data
Pertimbangkan pangkalan data berikut jadual:
CREATE TABLE IF NOT EXISTS tab (_id integer PRIMARY KEY AUTOINCREMENT, obj text NOT NULL);
Anda berhasrat untuk mendapatkan semula rekod di mana nilai lajur obj sepadan dengan senarai pembolehubah, yang mungkin terdedah kepada suntikan SQL jika tidak dikendalikan dengan betul.
Pendekatan Pertama: Kaedah Manual
Percubaan untuk membina pertanyaan secara manual menggunakan list_of_vars dan join() untuk menjana rentetan pemegang tempat mungkin menimbulkan ralat disebabkan oleh ketidakpadanan dalam bilangan pengikatan.
statement = "SELECT * FROM tab WHERE obj IN (?);" c.execute(statement, "'"+"','".join(list_of_vars)+"'")
Pendekatan Disyorkan: Pertanyaan Berparameter
Untuk melaksanakan pertanyaan IN dengan selamat, gunakan ruang letak parameter (?) dan ikat senarai pembolehubah sebagai parameter. Cipta pernyataan menggunakan kaedah format untuk menjana bilangan ruang letak yang sesuai:
statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars))) c.execute(statement, list_of_vars)
Dengan menghantar list_of_vars sebagai senarai nilai parameter, anda memastikan pengikatan yang betul dan menghalang kerentanan suntikan SQL.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Penyata WHERE IN dengan Selamat untuk Mencegah Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!