我正在尝试对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();
方法
最合适的回答,由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 . \'%%\')
) );