Php Wordpress:wpdb准备条件变量

Php Wordpress:wpdb准备条件变量,php,mysql,wordpress,prepared-statement,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->pr

我现在有一张桌子。如果用户搜索某个内容,我希望查询返回过滤结果。如果用户没有搜索某个内容,它应该返回所有结果。我不太确定如何使用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\u查询传递给%d。是否可以将此变量设为条件变量?没有IF语句有没有办法做到这一点?

为什么不在“IF”语句中进行准备?然后,您可以在“Else”中执行另一个prepare(不带where子句),只需在适当的prepared查询上使用get_结果即可

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);   
}
$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));

并从
prepared
语句中删除
search\u query
参数。看起来您可以根据需要将数组传递给
prepare
,以及变量列表

这意味着你可以这样做:

function like($str)
{
    global $wpdb;
    return "'" . '%' . esc_sql($wpdb->esc_like($str)) . '%' . "'";
}

if($search_query!=="all") {
    $where = 'WHERE column_name LIKE ' . like($search_query);   
}
$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子句将为空,因此将其连接到查询中不会引起问题。

尝试将调用
get_results
放在if-中,您可以在
else
中进行第二次调用,并且每个调用都会传递所需的参数。对,因此这将是我的最后手段。我将有更多的可选变量,因此如果我只有一个查询,那么管理sql语句将容易得多。有可能吗?你能举个例子说明你还会吃什么吗?“where”子句中有更多的变量吗?是的,没错。因此,它最终会看起来像:WHERE name(如%s)或date(如%s)或location(如%s)或phone(如%s)……因此,您希望以默认值“like%%”传入所有内容,类似于@Nikos suggestion,并仅在传递时将变量设置为实际字符串。这类似于只写“if 1==1”,而不是传递一个空变量,这将导致错误的解决方案。我从来没有意识到你也可以通过arrayMe,事实上——当你认为“如果你能做到……那就太好了”时,这总是好的,然后在文档中查找它,发现开发人员已经预料到了你。