_
dan %
bukan wildcard di MySQL secara umum, dan tidak boleh diloloskan untuk tujuan memasukkannya ke dalam literal string normal. mysql_real_escape_string
benar dan cukup untuk tujuan ini. addcslashes
tidak boleh digunakan.
_
dan %
khusus hanya dalam konteks LIKE
-cocok. Saat Anda ingin menyiapkan string untuk penggunaan literal dalam LIKE
pernyataan, sehingga 100%
cocok dengan seratus persen dan bukan sembarang string yang dimulai dengan seratus, Anda memiliki dua tingkat pelepasan yang perlu dikhawatirkan.
Yang pertama adalah LIKE melarikan diri. Penanganan LIKE terjadi sepenuhnya di dalam SQL, dan jika Anda ingin mengubah string literal menjadi ekspresi LIKE literal, Anda harus melakukan langkah ini bahkan jika Anda menggunakan kueri berparameter !
Dalam skema ini, _
dan %
khusus dan harus dihindari. Karakter escape juga harus di-escape. Menurut ANSI SQL, karakter selain tidak boleh diloloskan:\'
akan salah. (Meskipun MySQL biasanya akan membiarkan Anda lolos begitu saja.)
Setelah melakukan ini, Anda melanjutkan ke pelolosan tingkat kedua, yang merupakan pelolosan literal string lama. Ini terjadi di luar SQL, membuat SQL, jadi harus dilakukan setelah langkah meloloskan LIKE. Untuk MySQL, ini adalah mysql_real_escape_string
seperti sebelumnya; untuk database lain akan ada fungsi yang berbeda, Anda bisa menggunakan kueri berparameter untuk menghindari keharusan melakukannya.
Masalah yang menyebabkan kebingungan di sini adalah bahwa di MySQL menggunakan garis miring terbalik sebagai karakter pelarian untuk kedua langkah pelarian bersarang! Jadi, jika Anda ingin mencocokkan string dengan tanda persen literal, Anda harus menggandakan garis miring terbalik dan mengatakan LIKE 'something\\%'
. Atau, jika itu dalam "
PHP PHP literal yang juga menggunakan pelolosan garis miring terbalik, "LIKE 'something\\\\%'"
. Argh!
Ini salah menurut ANSI SQL, yang mengatakan bahwa:dalam string, garis miring terbalik literal berarti garis miring terbalik literal dan cara untuk menghindari satu kutipan adalah ''
; dalam ekspresi LIKE tidak ada karakter escape sama sekali secara default.
Jadi jika Anda ingin LIKE-escape dengan cara portabel, Anda harus mengganti perilaku default (salah) dan menentukan karakter escape Anda sendiri, menggunakan LIKE ... ESCAPE ...
membangun. Demi kewarasan, kami akan memilih sesuatu selain garis miring terbalik!
function like($s, $e) {
return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}
$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
atau dengan parameter (mis. di PDO):
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
(Jika Anda ingin lebih banyak portabilitas waktu pesta, Anda juga bisa bersenang-senang mencoba untuk menghitung MS SQL Server dan Sybase, di mana [
karakter juga, salah, spesial dalam LIKE
pernyataan dan harus melarikan diri. argh.)