Masalah:
Semasa melarikan diri dari input pengguna menggunakan mysql_real_escape_string, output dalam MySQL menunjukkan tingkah laku yang tidak dijangka dengan watak tertentu. Khususnya, watak garis bawah didahului dengan garis miring ke belakang, manakala petikan tunggal dan berganda tidak.
Penjelasan:
Bertentangan dengan andaian, dan % adalah bukan kad bebas MySQL dalam penggunaan umum dan tidak boleh dilepaskan apabila memasukkannya ke dalam literal rentetan. mysql_real_escape_string sudah memadai untuk tujuan ini dan menambahkan addcslashes untuk dan % harus dielakkan.
Wildcard hanya menjadi relevan dalam konteks padanan LIKE. Apabila menyatakan rentetan sebagai ungkapan SUKA literal, lapisan pelarian tambahan diperlukan di mana _ dan % mesti dilepaskan. Ini dilakukan secara berasingan daripada rentetan umum yang melarikan diri menggunakan aksara sengkang ke belakang yang sama.
Penyelesaian:
Untuk pemadanan LIKE, ikut langkah berikut:
Contoh:
Untuk memadankan tanda peratus literal, dwi-slash-escape ia dalam LIKE escape (cth., LIKE 'sesuatu\%' dalam MySQL) atau gunakan escape lain watak dengan LIKE ... ESCAPE ... bina untuk mudah alih.
Fungsi Escape LIKE Mudah Alih:
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Contoh dengan Parameter:
$escapedname = mysql_real_escape_string(like($name, '=')); $query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Atas ialah kandungan terperinci Mengapa MySQL Escaping Wildcards Berkelakuan Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!