Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Menggunakan Penyata Disediakan untuk Nama Jadual dalam SQL?
SQL Disediakan Penyata dan Nama Jadual: Satu Perangkap Biasa
Pernyataan yang disediakan adalah penting untuk pertanyaan SQL yang selamat, menghalang kelemahan suntikan SQL. Walau bagaimanapun, salah tanggapan yang kerap ialah nama jadual boleh diparameterkan dalam pernyataan yang disediakan. Ini tidak betul.
Contoh berikut menggambarkan masalah: Percubaan untuk menggunakan pernyataan yang disediakan untuk menentukan nama jadual secara dinamik (cth., query1
) menggunakan parameter ([?]
) dan pembolehubah seperti reportDate
akan gagal. Ralat "Parameter 'Pa_RaM000' yang dinyatakan di mana nama jadual diperlukan" menyerlahkan pengehadan ini.
Penyelesaian: Pembinaan Dinamik Di Luar Penyata Disediakan
Isu terasnya ialah penghurai SQL merawat nama jadual secara berbeza daripada parameter pertanyaan lain. Ia tidak boleh disuntik secara dinamik melalui ruang letak pernyataan yang disediakan.
Pendekatan yang betul melibatkan membina nama jadual secara dinamik sebelum pernyataan yang disediakan digunakan. Ini dilakukan dengan menggabungkan pembolehubah yang mengandungi bahagian tarikh (cth., reportDate
) dengan bahagian tetap nama jadual:
<code class="language-sql">private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + ".?]";</code>
Di sini, reportDate
menyediakan bahagian tarikh khusus nama jadual, yang digabungkan dengan bahagian statik. Parameter selebihnya dalam pernyataan SELECT
kemudiannya boleh diparameterkan dengan selamat dalam pernyataan yang disediakan itu sendiri.
Kaedah ini membolehkan penjanaan pertanyaan dinamik sambil mengekalkan kelebihan keselamatan pernyataan yang disediakan untuk nilai data.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Penyata Disediakan untuk Nama Jadual dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!