Mengapa saya tidak boleh menghantar nama jadual kepada penyata PDO yang disediakan?
$stmt = $dbh->prepare('SELECT * FROM :table WHERE 1'); if ($stmt->execute(array(':table' => 'users'))) { var_dump($stmt->fetchAll()); }
Adakah terdapat cara lain yang selamat untuk memasukkan nama jadual ke dalam pertanyaan SQL? Dengan keselamatan, maksud saya saya tidak mahu melakukannya
$sql = "SELECT * FROM $table WHERE 1"
Untuk memahami sebab nama jadual (atau lajur) yang mengikat tidak berfungsi, anda perlu memahami cara pemegang tempat dalam pernyataan yang disediakan berfungsi: ia bukan sekadar diganti dengan rentetan (dilepaskan dengan betul) dan SQL yang terhasil. Sebaliknya, DBMS yang memerlukan pernyataan "sediakan" akan menghasilkan pelan pertanyaan lengkap tentang cara melaksanakan pertanyaan, termasuk jadual dan indeks yang akan digunakan, yang akan sama tidak kira bagaimana anda mengisi ruang letak.
SELECT name FROM my_table WHERE id = :value
的计划将与您替换:value
的内容相同,但表面上相似的SELECT name FROM :table WHERE id = :value
Tidak boleh dijadualkan kerana DBMS tidak tahu jadual mana yang sebenarnya anda pilih.Ini juga bukan masalah yang boleh atau patut diselesaikan oleh perpustakaan abstraksi seperti PDO, kerana ia mengalahkan 2 tujuan utama pernyataan yang disediakan: 1) membenarkan pangkalan data membuat keputusan lebih awal tentang cara menjalankan pertanyaan, dan menggunakan pelan yang sama beberapa kali; 2) ) menghalang isu keselamatan dengan memisahkan logik pertanyaan daripada input berubah.
Nama jadual dan nama lajur tidak boleh digantikan dengan parameter dalam PDO.
Dalam kes ini, anda hanya perlu menapis dan membersihkan data secara manual. Satu cara untuk mencapainya ialah dengan menghantar hujah singkat kepada fungsi yang akan melaksanakan pertanyaan secara dinamik, dan kemudian menggunakan pernyataan suis() untuk mencipta senarai putih nilai yang sah atau nama lajur untuk nama jadual. Dengan cara ini, input pengguna tidak masuk terus ke dalam pertanyaan. Contohnya:
Dengan tidak mengekalkan kes lalai atau menggunakan kes lalai yang mengembalikan mesej ralat, anda memastikan bahawa hanya nilai yang anda mahu gunakan digunakan.