Penggunaan Wildcard dalam Penyata Disediakan PDO
Melaksanakan pertanyaan SQL selalunya melibatkan penapisan data berdasarkan kriteria tertentu. Kenyataan yang disediakan ialah cara selamat untuk mencapainya dengan menghalang kelemahan suntikan SQL. Walau bagaimanapun, menggunakan kad bebas dalam pernyataan yang disediakan boleh menimbulkan cabaran.
Cabaran
Pertimbangkan pertanyaan berikut yang bertujuan untuk mencari pengguna yang namanya mengandungi "sebarang nama":
SELECT * FROM `gc_users` WHERE `name` LIKE '%anyname%'
Apabila cuba melaksanakan pertanyaan ini dengan pernyataan yang disediakan, pendekatan biasa seperti:
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name"); $stmt->bindParam(':name', "%" . $name . "%");
dan
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE '%:name%'"); $stmt->bindParam(':name', $name);
mungkin gagal berfungsi. Ini kerana penggunaan kad bebas dalam pernyataan SQL LIKE memerlukan pengendalian khas dalam pernyataan yang disediakan.
Penyelesaian
Untuk menggunakan kad bebas dengan pernyataan yang disediakan dengan betul, seseorang boleh menggunakan bindValue () kaedah bukannya bindParam(). Berikut ialah contoh:
$stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` LIKE :name"); $stmt->bindValue(':name', '%' . $name . '%');
Sebagai alternatif, bindParam() boleh digunakan, tetapi dengan sintaks yang diubah suai sedikit:
$name = "%$name%"; $stmt = $dbh->prepare("SELECT * FROM `gc_users` WHERE `name` like :name"); $stmt->bindParam(':name', $name);
Kedua-dua pendekatan memastikan bahawa aksara kad bebas dilepaskan dan dikendalikan dengan betul oleh pangkalan data. Dengan menggunakan bindValue() atau bindParam() dengan cara ini, seseorang boleh mencari data dengan berkesan menggunakan kad bebas dalam pernyataan yang disediakan, memastikan keselamatan dan kefungsian.
Atas ialah kandungan terperinci Bagaimana Menggunakan Kad Liar dengan Penyata Disediakan PDO dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!