web-dev-qa-db-fra.com

Comment utiliser des caractères génériques dans les requêtes $ wpdb en utilisant $ wpdb-> get_results & $ wpdb-> prepare?

J'essaie de faire une recherche personnalisée pour les groupes BuddyPress.

Voici ma méthode:

public function search_groups($string){
    global $wpdb;
    $results = $wpdb->get_results($wpdb->prepare(
        "
        SELECT * 
        FROM {$wpdb->prefix}bp_groups 
        WHERE `name` LIKE '%%s%'
        AND `description` LIKE '%%s%' 
        AND `status` = 'public'
        ORDER BY `name` ASC
        ",
        $string,
        $string
    ));
    if(!empty($results)){
        $return = $results;
    } else{
        $return = false;    
    }
    return $return;
}

Cependant, je reçois une erreur de base de données WordPress. Je suis à peu près sûr que c'est dû au fait que j'utilise $wpdb->prepare();, car il utilise les signes% pour remplacer les variables.

Jetons un coup d'oeil à cette partie de ma requête:

WHERE `name` LIKE '%%s%'
AND `description` LIKE '%%s%'

Cela ressemble à un problème. Est-il possible que je puisse accomplir quelque chose dans le sens de ...

WHERE `name` LIKE '%{$string}%'
AND `description` LIKE '%{$string}%'

et toujours utiliser la méthode $wpdb->prepare();?

5
Michael Ecklund

J'ai trouvé une solution à ma question.

Tout d'abord, dans ma requête initiale, j'aurais dû spécifier OR au lieu de AND pour la recherche entre les noms de groupes et les descriptions de groupes. (Il faussait les résultats.)

Et j'avais besoin de double échapper à mon '%' dans les déclarations LIKE.

Voici la requête mise à jour qui fonctionne correctement:

SELECT * 
FROM {$wpdb->prefix}bp_groups 
WHERE `name` LIKE '%%%s%%'
OR `description` LIKE '%%%s%%' 
AND `status` = 'public'
ORDER BY `name` ASC

Exemple utilisant $wpdb->query et $wpdb->prepare:

global $wpdb;
$wpdb->query( $wpdb->prepare(
    'DELETE FROM %s WHERE `option_name` LIKE %s',
    $wpdb->options,
    $wpdb->esc_like(PLUGIN_SLUG . '%%')
) );
11
Michael Ecklund