如何正确地准备%Like%SQL语句?

时间:2011-02-08 作者:editor

我想在仍然使用WordPress$wpdb类清理和准备输入的同时使用like%text%语句。

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

3 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

这个$wpdb->esc_like 函数存在于WordPress中,因为常规数据库转义不会转义%_ 字符。这意味着您可以将它们添加到wpdb::prepare() 没有问题。这也是what I see in the core WordPress code:

$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() 在后台,which has this syntax), 但请记住your string will not be quoted, 你必须自己添加引号(这不是你通常必须做的wpdb::prepare().

SO网友:Rarst

你需要加倍百分比,这样他们就不会被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不确定这是最好的/唯一的方法。

SO网友:Calvin

这是我已经检查过的一种方法,它是有效的:

$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 
    ) 
);
替换变量以满足您的需要。

结束