Bagaimana Anda mempersiapkan pernyataan% LIKE% SQL dengan benar?

34

Saya ingin menggunakan pernyataan LIKE% teks% sambil tetap menggunakan kelas WordPress $ wpdb untuk membersihkan dan menyiapkan input.

SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';

Saya sudah mencoba sesuatu seperti ini tetapi tidak berhasil:

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));

Bagaimana Anda menyiapkan pernyataan% LIKE% SQL dengan benar menggunakan kelas basis data WordPress?

editor
sumber

Jawaban:

49

The $wpdb->esc_likeFungsi ada di WordPress karena biasa basis data melarikan diri tidak luput %dan _karakter. Ini berarti Anda dapat menambahkannya dalam argumen Anda wpdb::prepare()tanpa masalah. Ini juga yang saya lihat di kode inti WordPress :

$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');

Jadi kode Anda akan terlihat seperti:

$wpdb->prepare(
    "SELECT
        column_1
    FROM
        `{$wpdb->base_prefix}my_table`
    WHERE
        column_2 LIKE %s;",
    '%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);

Anda juga dapat menambahkan %%dalam kueri Anda untuk mendapatkan literal %( wpdb::prepare()kegunaan vsprintf()di latar belakang, yang memiliki sintaks ini ), tetapi ingat bahwa string Anda tidak akan dikutip , Anda harus menambahkan sendiri kuotasi (yang tidak biasanya Anda lakukan di wpdb::prepare().

Jan Fabry
sumber
untuk apa {}?
Francisco Corrales Morales
@FranciscoCorralesMorales: Untuk mengindikasikan bahwa semua yang ada di dalamnya harus dianggap sebagai ekspresi variabel , jika tidak, ia hanya akan melihat $wpdb, dan mengabaikan yang ->prefixsesudahnya.
Jan Fabry
1
@JanFabry Tutup. Saya akan mengoreksi komentar untuk mengatakan: "... kalau tidak itu akan melihat semua $wpdb->base_prefixmy_tabledan mencoba untuk mencari base_prefixmy_tableproperti bukan hanya base_prefix.
Flimm
3

Anda perlu menggandakan persen agar mereka tidak diperlakukan seperti spidol dengan wpdb->prepare():

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));

PS tidak yakin ini cara terbaik / satu-satunya untuk melakukannya.

Jarang
sumber
4
Ingatlah bahwa Anda harus menambahkan sendiri tanda kutip di sekitar string , karena wpdb::preparehanya akan menambahkannya untuk tanda %syang tidak diawali dengan tanda% . Bagian akhir dari kueri Anda seharusnya WHERE column_2 LIKE '%%%s%%'.
Jan Fabry
2

Ini adalah salah satu cara untuk melakukannya yang telah saya periksa dan berfungsi:

$search_text = "%" . $_GET['some_text'] . "%";

$user_count = $wpdb->get_var( 
    $wpdb->prepare( 
        "SELECT COUNT(*) FROM mix_library WHERE ml_setting_name LIKE %s", 
        $search_text 
    ) 
);

Ganti variabel sesuai dengan kebutuhan Anda.

Calvin
sumber
5
Anda harus melarikan diri %karakter (dengan menggunakan like_escape(). Lihat: codex.wordpress.org/Class_Reference/…
Stephen Harris