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