Wordpress:wpdb 准备条件变量

Wordpress: wpdb prepare with conditional variable

我目前有一个 table。如果用户搜索某些内容,我希望查询 return 过滤后的结果。如果用户不搜索某些东西,它应该 return 所有结果。我不太确定如何使用 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));

现在搜索字段为空时没有任何 returns,因为查询出错,因为它放弃了参数化并将 $search_query 传递给 LIMIT 旁边的 %d。是否可以使此变量成为条件变量?没有 IF 语句有没有办法做到这一点?

为什么不在 "If" 语句中做准备?然后,您可以在 "Else" 中进行其他准备(不带 where 子句),只需在正确准备好的查询中使用 get_results?

if($search_query!=="all") {
    $search_query = '%' . $search_query . '%';
    $where = 'WHERE column_name LIKE %s'; 
    $prepared = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}table_name ".$where." ORDER BY id DESC LIMIT %d, %d", $search_query, $current_page, $rows_per_page)  ;
} else {
    $prepared = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}table_name ORDER BY id DESC LIMIT %d, %d", $current_page, $rows_per_page);
}
$results = $wpdb->get_results($prepared);

您可以自己转义 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);   
}

并从 prepared 语句中删除 search_query 参数

根据 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 子句将为空,因此将其连接到您的查询中不会造成问题。