如何使用$wpdb->GET_RESULTS&$wpdb->Prepare在$wpdb查询中使用通配符?

时间:2012-10-05 作者:Michael Ecklund

我正在尝试对BuddyPress组进行自定义搜索。

Here is my method:

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();, 因为它使用%符号替换变量。

Let\'s take a look at this portion of my query:

WHERE `name` LIKE \'%%s%\'
AND `description` LIKE \'%%s%\'
这看起来很麻烦。有没有什么方法可以让我按照……的思路完成一些事情。。。

WHERE `name` LIKE \'%{$string}%\'
AND `description` LIKE \'%{$string}%\'
并且仍然使用$wpdb->prepare(); 方法

1 个回复
最合适的回答,由SO网友:Michael Ecklund 整理而成

我想出了一个解决问题的办法。

首先,在我最初的查询中,我应该指定OR而不是AND来在组名称和组描述之间进行搜索。(这扭曲了结果。)

我需要在LIKE语句中双重转义“%”。

Here is the updated query which works correctly:

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

Example using $wpdb->query and $wpdb->prepare:

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

结束

相关推荐

如何不按日期排序检索WP_QUERY

Possible Duplicate:Orderby = none not working 我想使用$query = new WP_Query( \'post__in\' => array( 2, 5, 12, 14, 20 ) ) ); 要按ID检索帖子,我会按发布日期对结果进行排序,但在本例中,我希望按相同的ID按以下顺序进行检索:2、5、12、14、20