% LIKE% SQL deyimini uygun şekilde nasıl hazırlarsınız?


34

Temizlemek ve girdi hazırlamak için yine de WordPress $ wpdb sınıfını kullanırken LIKE% text% ifadesini kullanmak istiyorum.

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

Boşuna böyle bir şey denedim:

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

WordPress veritabanı sınıfını kullanarak% LIKE% SQL deyimini nasıl düzgün biçimde hazırlarsınız?

Yanıtlar:


49

Bu $wpdb->esc_likefonksiyon WordPress'te bulunmaktadır çünkü normal veri tabanı çıkışları kaçmaz %ve _karakterler yoktur. Bu, onları argümanlarınıza sorunsuzca ekleyebileceğiniz anlamına gelir wpdb::prepare(). Bu ayrıca çekirdek WordPress kodunda gördüğüm şey :

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

Yani kodunuz şöyle görünür:

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

Ayrıca ekleyebilir %%bir değişmez almak için sorguda %( wpdb::prepare()kullanımlarını vsprintf()arka planda bu sözdizimi vardır ), ama unutmayın dize alıntı olmayacak genellikle de yapmam gerekeni değil (tırnak kendiniz eklemelisiniz, wpdb::prepare().



@FranciscoCorralesMorales: İçindeki her şeyin değişken bir ifade olarak görülmesi gerektiğini belirtmek için , aksi takdirde sadece ondan sonra görecek $wpdbve görmezden ->prefixgelecektir.
Jan Fabry

1
@JanFabry Kapat. Yorumu şöyle demiştim: "... aksi takdirde hepsini görecek $wpdb->base_prefixmy_tableve base_prefixmy_tablesadece mülk yerine mülk aramaya çalışacaktı base_prefix.
Flimm

3

Yüzde ikiye katlamanız gerekir, böylece bunlar, fragman işaretleri gibi işlem görmezler 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 bunu yapmanın en iyi / tek yol olduğundan emin değil.


4
Unutmayın ki tırnak içindeki tırnakları kendiniz wpdb::prepareeklemelisiniz%s% , çünkü sadece ondan önce yazılmayanlar için bunları ekler . Sorgunuzun son kısmı olmalıdır WHERE column_2 LIKE '%%%s%%'.
Jan Fabry,

2

Bu, kontrol ettiğim ve çalıştığı için yapmanın bir yoludur:

$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 
    ) 
);

Gereksinimlerinize göre değişkenleri değiştirin.


5
Kaçmak olmalıdır %kullanarak (karakterler like_escape()Bkz:. Codex.wordpress.org/Class_Reference/...
Stephen Harris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.