Pernyataan Disediakan: Mengendalikan Nama Lajur Dinamik dalam Pertanyaan PILIH
Cabaran:
Bolehkah penyata yang disediakan memuatkan nama lajur dinamik dalam SELECT
pertanyaan?
Senario:
Seorang pengguna menggambarkan contoh MySQL dan Java:
<code class="language-java">String columnNames = "d,e,f"; // From user input String tableName = "some_table"; // From user input String query = "SELECT a,b,c,? FROM " + tableName + " WHERE d=?"; //...</code>
Menggantikan parameter dengan rentetan columnNames
menghasilkan:
<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
Namun, hasil yang dimaksudkan ialah:
<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
Penyelesaian:
Menggunakan pernyataan yang disediakan secara langsung untuk nama lajur dinamik adalah tidak boleh dilaksanakan. Penyataan yang disediakan meparameterkan nilai, bukan pengecam lajur.
Strategi Alternatif:
Penyelesaian paling berkesan melibatkan pengubahsuaian skema pangkalan data. Daripada menyerakkan data merentasi banyak lajur, perkenalkan satu lajur untuk menyimpan lajur yang dinamakan secara dinamik. Lajur ini akan mengandungi rentetan bersiri yang mewakili senarai nama lajur untuk setiap baris.
Ini memerlukan sanitasi input yang rapi untuk mengelakkan suntikan SQL. Menggunakan String#replace()
untuk melepaskan petikan, diikuti dengan penyatuan nama lajur yang telah dibersihkan ke dalam rentetan pertanyaan SQL ialah kaedah yang berdaya maju. Pertimbangkan untuk menggunakan pertanyaan berparameter untuk bahagian lain pertanyaan untuk mengekalkan faedah keselamatan jika boleh.
Atas ialah kandungan terperinci Bolehkah Penyata Disediakan Mengendalikan Nama Lajur Dinamik dalam Pertanyaan SELECT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!