Pada pelayan lama apabila pernyataan yang disediakan tidak tersedia, melarikan diri dari input pengguna sebelum menghantarnya ke MySQL adalah penting. Walau bagaimanapun, menggunakan mysql_real_escape_string sahaja tidak melepaskan kad bebas MySQL (_ dan %) dan corak tertentu mengembalikan hasil yang tidak dijangka.
Sebagai contoh, apabila input "test_test ' dihantar, pangkalan data menunjukkan "test_test '." Mengapa adakah garis bawah mempunyai awalan sengkang ke belakang manakala petikan tunggal dan berganda tidak?
_ dan % bukan kad bebas dalam MySQL dan tidak boleh dilepaskan apabila dimasukkan ke dalam rentetan rentetan mysql_real_escape_string sudah memadai untuk tujuan ini.
Walau bagaimanapun. , _ dan % memerlukan pengendalian khas apabila digunakan dalam ungkapan padanan LIKE untuk memastikan ia sepadan dengan nilai literalnya sahaja, bukan corak. Ini melibatkan dua peringkat melarikan diri:
LIKE melarikan diri:
String literal melarikan diri:
Untuk MySQL, jika anda ingin memadankan dengan tanda peratus literal, anda akan menggunakan melarikan diri segaris ke belakang berganda, mis., SUKAI 'sesuatu\%`.
Untuk mengelakkan kekeliruan ini dan memastikan kemudahalihan, anda boleh mengatasi watak lalai melarikan diri menggunakan LIKE ... ESCAPE ... bina.
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 dalam PDO:
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
Atas ialah kandungan terperinci Bagaimana untuk Melarikan Diri Kad Liar MySQL dengan betul dalam Klausa LIKE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!