SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';
我已经尝试过类似的方法无济于事:
$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));
如何使用WordPress数据库类正确准备%LIKE%SQL语句?
#1 楼
WordPress中存在$wpdb->esc_like
函数,因为常规数据库转义不会转义%
和_
字符。这意味着您可以毫无问题地将它们添加到wpdb::prepare()
的自变量中。这也是我在WordPress核心代码中看到的内容:$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');
所以您的代码应如下所示:
$wpdb->prepare(
"SELECT
column_1
FROM
`{$wpdb->base_prefix}my_table`
WHERE
column_2 LIKE %s;",
'%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);
您也可以在查询中添加
%%
以获得文字%
(wpdb::prepare()
在后台使用vsprintf()
,具有这种语法),但是请记住,您的字符串不会被引号,您必须自己加上引号(不是)在wpdb::prepare()
中通常需要执行的操作。#2 楼
您需要加倍百分比,以免wpdb->prepare()
将它们像片段标记一样对待:$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));
PS不确定这是最好的/唯一的方法。
评论
请记住,您必须自己在字符串两边加上引号,因为wpdb :: prepare只会在不加%的%s处加上引号。查询的最后一部分应为WHERE column_2 LIKE'%%% s %%'。
– Jan Fabry
2011年2月8日在9:39
#3 楼
这是我检查过的一种方法,它可以正常工作:$search_text = "%" . $_GET['some_text'] . "%";
$user_count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM mix_library WHERE ml_setting_name LIKE %s",
$search_text
)
);
替换变量以满足您的需求。
评论
您应该转义%个字符(通过使用like_escape()。请参见:codex.wordpress.org/Class_Reference/…
–斯蒂芬·哈里斯(Stephen Harris)
2012年10月25日上午9:25
评论
{}的作用是什么?
–弗朗西斯科·科拉莱斯·莫拉莱斯(Francisco Corrales Morales)
2014年8月20日在22:39
@FranciscoCorralesMorales:表示应该将其中的所有内容都视为变量表达式,否则只会看到$ wpdb,而忽略其后的->前缀。
– Jan Fabry
2014年8月21日在15:14
@JanFabry关闭。我将更正注释以说:“ ...否则,它将看到$ wpdb-> base_prefixmy_table的所有内容,并尝试查找base_prefixmy_table属性,而不仅仅是base_prefix。
– Flimm
17-10-10在9:24