Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menggunakan Jadual Dinamik dan Nama Medan dengan Selamat dalam Penyata Disediakan?

Bagaimanakah Saya Boleh Menggunakan Jadual Dinamik dan Nama Medan dengan Selamat dalam Penyata Disediakan?

Susan Sarandon
Susan Sarandonasal
2024-12-08 17:10:12571semak imbas

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

Menggunakan Penyata Disediakan untuk Mengikat Pengecam dan Kata Kunci

Masalah:

Mencipta pertanyaan dinamik menggunakan pernyataan yang disediakan, tetapi cuba untuk mengikat nama jadual, nama medan atau sintaks kata kunci menghasilkan tatasusunan kosong.

Kod:

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

Keputusan yang Dijangka:
Suatu tatasusunan hasil daripada pangkalan data.

Keputusan Sebenar:
Kosong tatasusunan.

Punca:
Pernyataan yang disediakan hanya boleh mengikat literal data, bukan pengecam (seperti nama jadual atau medan) atau kata kunci sintaks.

Penyelesaian:

Untuk menggunakan pengecam atau kata kunci dinamik, ikut ini langkah:

  1. Format Pengecam:

    • Sertakan pengecam dalam backticks: "pengecam".
    • Escape backticks dalam pengecam dengan menggandakannya: "pengecam".
  2. Nilai Dinamik Senarai Putih:

    • Buat senarai pengecam atau kata kunci yang dibenarkan.
    • Semak nilai dinamik terhadap senarai putih sebelum menggunakan ia.

Kod Diubah Suai:

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";

Kata kunci:

Jika perlu, senarai putih dan sahkan kata kunci dinamik juga. Dengan mengikut garis panduan ini, anda boleh memasukkan pengecam dan kata kunci dinamik dengan selamat dalam penyata yang anda sediakan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Jadual Dinamik dan Nama Medan dengan Selamat dalam Penyata Disediakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn