我目前有一张桌子。如果用户搜索某些内容,我希望查询返回过滤后的结果。如果用户没有搜索某些内容,则应返回所有结果。我不太确定如何使用wpdb prepare。
if($search_query!=="all") {
$search_query = '%' . $search_query . '%';
$where = 'WHERE column_name LIKE %s';
}
$results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}table_name ".$where." ORDER BY id DESC LIMIT %d, %d", $search_query,$current_page,$rows_per_page));
现在搜索字段为空时没有任何返回,因为查询错误,因为它抛出参数化并将$ search_query传递给LIMIT旁边的%d。是否可以使这个变量有条件?如果没有IF声明,有没有办法做到这一点?
答案 0 :(得分:2)
为什么不在“如果”声明中做好准备?然后你可以在“Else”中做另一个prepare(没有where子句),只需在正确准备的查询中使用get_results吗?
OutputStream
答案 1 :(得分:1)
根据to the WordPress documentation
,您可以将数组传递给prepare
,以及变量列表
这意味着你可以这样做:
$where = "";
$parameters = array($search_query,$current_page,$rows_per_page);
if($search_query!=="all") {
array_push($parameters, '%' . $search_query . '%');
$where = 'WHERE column_name LIKE %s';
}
$results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}table_name ".$where." ORDER BY id DESC LIMIT %d, %d", $parameters));
如果没有数据,您的WHERE子句将为空,因此将其连接到查询中不会导致问题。
答案 2 :(得分:0)
您可以自己转义like
参数,并在需要时将其添加为where子句,如下所示:
function like($str)
{
global $wpdb;
return "'" . '%' . esc_sql($wpdb->esc_like($str)) . '%' . "'";
}
if($search_query!=="all") {
$where = 'WHERE column_name LIKE ' . like($search_query);
}
并从search_query
声明
prepared
参数