web-dev-qa-db-fra.com

Comment préparer correctement une instruction SQL% LIKE%?

J'aimerais utiliser une instruction LIKE% text% tout en utilisant la classe WordPress $ wpdb pour nettoyer et préparer les entrées.

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

J'ai essayé quelque chose comme ça en vain:

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

Comment préparer correctement une instruction% LIKE% SQL à l'aide de la classe de base de données WordPress?

33
editor

La fonction $wpdb->esc_like existe dans WordPress car l'échappement normal de la base de données n'échappe pas aux caractères % et _. Cela signifie que vous pouvez les ajouter dans vos arguments à wpdb::prepare() sans problème. C’est aussi ce que je vois dans le code principal de WordPress :

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

Donc, votre code ressemblerait à ceci:

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

Vous pouvez également ajouter %% dans votre requête pour obtenir un % littéral (wpdb::prepare() utilise vsprintf() en arrière-plan, qui a cette syntaxe ), mais rappelez-vous que votre chaîne ne sera pas citée , vous devez ajouter cite vous-même (ce qui n’est pas ce que vous devez habituellement faire dans wpdb::prepare().

49
Jan Fabry

Vous devez doubler le pourcentage afin qu'ils ne soient pas traités comme des marqueurs de fragment par 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 pas sûr que ce soit la meilleure/seule façon de le faire.

3
Rarst

C’est une façon de le faire que j’ai vérifiée et qui fonctionne:

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

Remplacez les variables pour répondre à vos besoins.

2
Calvin