Как правильно подготовить оператор SQL% LIKE%?

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

Как правильно подготовить оператор SQL% LIKE%, используя класс базы данных WordPress?

редактор
источник

Ответы:

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после него.
Ян Фабри
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 не уверен, что это лучший / единственный способ сделать это.

Rarst
источник
4
Помните, что вы должны добавлять кавычки вокруг строки самостоятельно , потому wpdb::prepareчто добавите их только для a, %sкоторому не предшествует% . Заключительная часть вашего запроса должна быть WHERE column_2 LIKE '%%%s%%'.
Ян Фабри
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/…
Стивен Харрис