Bolehkah penyata PHP PDO menerima nama jadual atau lajur sebagai parameter?
P粉702946921
P粉702946921 2023-10-17 12:46:05
0
2
662

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"


P粉702946921
P粉702946921

membalas semua(2)
P粉138711794

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.

P粉978742405

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:

function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
            $tbl = 'users';
            break;
    }

    $sql = "SELECT * FROM $tbl";
}

Dengan tidak mengekalkan kes lalai atau menggunakan kes lalai yang mengembalikan mesej ralat, anda memastikan bahawa hanya nilai yang anda mahu gunakan digunakan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan