Як правильно підготувати оператор% 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));

Як правильно підготувати оператор% LIKE% SQL, використовуючи клас бази даних 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 Close. Я б виправив коментар, щоб сказати: "... інакше все буде бачити $wpdb->base_prefixmy_tableі намагатися шукатиbase_prefixmy_table власність , а не просто base_prefix.
Флімм

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якому не передує% . Заключною частиною вашого запиту має бути 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/…
Стівен Харріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.