Php Wordpress:wpdb准备条件变量
我现在有一张桌子。如果用户搜索某个内容,我希望查询返回过滤结果。如果用户没有搜索某个内容,它应该返回所有结果。我不太确定如何使用wpdb prepare实现这一点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
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,事实上——当你认为“如果你能做到……那就太好了”时,这总是好的,然后在文档中查找它,发现开发人员已经预料到了你。