您如何正确准备%LIKE%SQL语句?


34

我想使用LIKE%text%语句,同时仍使用WordPress $ wpdb类清理和准备输入。

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语句?

Answers:


49

$wpdb->esc_like功能在WordPress的存在是因为常规数据库转义不逃避%_字符。这意味着您可以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()



@FranciscoCorralesMorales:表示应该将其中的所有内容都视为变量表达式,否则只能看到$wpdb,而忽略其->prefix后面的内容。
2014年

1
@JanFabry关闭。“......否则将看到的是:我会纠正评论说$wpdb->base_prefixmy_table,试图查找base_prefixmy_table财产,而不是只base_prefix
Flimm

3

您需要加倍百分比,以使它们不会被片段标记视为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不确定这是最好/唯一的方法。


4
请记住,您必须自己在字符串两边加上引号,因为wpdb::prepare只会在%s不以开头的a处%加上引号。查询的最后一部分应为WHERE column_2 LIKE '%%%s%%'
Jan Fabry

2

这是我检查过的一种方法,它可以正常工作:

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

替换变量以适合您的需求。


5
您应该转义%字符(使用like_escape()。请参见:codex.wordpress.org/Class_Reference/…–
Stephen Harris,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.