web-dev-qa-db-ja.com

$ wpdbクエリでワイルドカードを使用する方法$ wpdb-> get_results&$ wpdb-> prepareを使用する

BuddyPressグループをカスタム検索しようとしています。

これが私の方法です:

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;
}

しかし、WordPressデータベースエラーが発生しています。変数の置換に%記号を使用しているので、$wpdb->prepare();を使用しているという事実によると確信しています。

クエリのこの部分を見てみましょう:

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

それはただ問題のようです。私はの線に沿って何かを達成することができる方法はありますか...

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

それでも$wpdb->prepare();メソッドを使いますか?

5
Michael Ecklund

私は私の質問に対する解決策を考え出しました。

まず最初に、私のオリジナルのクエリでは、グループ名とグループの説明を検索するために、ANDではなくORを指定する必要があります。 (結果が歪んでいました。)

そして、LIKEステートメントで自分の '%'を二重エスケープする必要がありました。

これは正しく動作するように更新されたクエリです:

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

$wpdb->query$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