我想使用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语句?

#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()中通常需要执行的操作。

评论


{}的作用是什么?

–弗朗西斯科·科拉莱斯·莫拉莱斯(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

#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