Wordpress:wpdb准备条件变量

时间:2015-05-20 14:05:03

标签: php mysql wordpress prepared-statement

我目前有一张桌子。如果用户搜索某些内容,我希望查询返回过滤后的结果。如果用户没有搜索某些内容,则应返回所有结果。我不太确定如何使用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声明,有没有办法做到这一点?

3 个答案:

答案 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参数