web-dev-qa-db-ja.com

どのようにして%LIKE%SQL文を適切に準備しますか?

入力をサニタイズして準備するために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ステートメントを適切に準備しますか?

33
editor

通常のデータベースエスケープは$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()で通常行わなければならないことではありません)。

49
Jan Fabry

wpdb->prepare()ではフラグメントマーカのように扱われないように、パーセントを2倍にする必要があります。

$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は、これが最善/唯一の方法であると確信していません。

3
Rarst

これは私がチェックしてうまくいくようにするための1つの方法です。

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

ニーズに合わせて変数を置き換えます。

2
Calvin