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

34

J'aimerais utiliser une instruction LIKE% text% tout en utilisant toujours la classe WordPress $ wpdb pour assainir 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?

éditeur
la source

Réponses:

49

La $wpdb->esc_likefonction existe dans WordPress , car la base de données se échappe régulièrement n'échappe pas %et _caractères. Cela signifie que vous pouvez les ajouter à 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 n'oubliez pas que votre chaîne ne sera pas citée , vous devez ajouter les guillemets vous-même (ce qui n'est pas ce que vous devez faire habituellement wpdb::prepare().

Jan Fabry
la source
à quoi servent-ils {}?
Francisco Corrales Morales
@FranciscoCorralesMorales: Pour indiquer que tout ce qu'il contient doit être considéré comme une expression variable , sinon il ne verrait que $wpdbet ignorerait le ->prefixsuivi.
Jan Fabry
1
@JanFabry Close. Je corrigerais le commentaire en disant: "... sinon, il verrait tout $wpdb->base_prefixmy_tableet essaierait de rechercher une base_prefixmy_tablepropriété au lieu d'un simple base_prefix.
Flimm
3

Vous devez doubler le pourcentage afin qu'ils ne soient pas traités comme des marqueurs de fragments 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.

Rarst
la source
4
Rappelez- vous que vous devez ajouter les guillemets autour de la chaîne vous - même , car vous wpdb::preparene les ajouterez que pour un %smessage non précédé d'un% . La dernière partie de votre requête devrait être WHERE column_2 LIKE '%%%s%%'.
Jan Fabry
2

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.

Calvin
la source
5
Vous devriez échapper aux %caractères (en utilisant like_escape(). Voir: codex.wordpress.org/Class_Reference/…
Stephen Harris