Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Melarikan diri dari kartu liar MySQL

_ 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.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PEMBARUAN MySQL:5 Tip Teratas untuk Pengembang T-SQL

  2. Cara Mendapatkan Nomor Urutan Auto_Increment Saat Ini untuk Tabel MySQL / MariaDB

  3. Keamanan Basis Data - Enkripsi Cadangan Saat Transit &Saat Istirahat

  4. Bagaimana cara memasukkan ke dalam tabel yang sama di MySQL?

  5. Mysql untuk memilih catatan per bulan meskipun data tidak ada