%LIKE%SQLステートメントを適切に準備するにはどうすればよいですか?


34

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ステートメントを適切に準備するにはどうすればよいですか?

回答:


49

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


何の{}ためですか?
フランシスココラレスモラレス14

@FranciscoCorralesMorales:内部のすべてを変数式と見なす必要があることを示すため、そうでない場合、それ以降のみが表示され$wpdb、無視さ->prefixれます。
ヤンファブリ

1
@JanFabry閉じる。コメントを修正して、「...そうでなければ、すべてを参照し、単にプロパティではなくプロパティ$wpdb->base_prefixmy_tableを検索しようとします。base_prefixmy_tablebase_prefix
Flimm

3

パーセントを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は、これがそれを行うための最良の/唯一の方法であると確信していません。


4
ことを忘れないでくださいあなたは、文字列の前後に引用符を自分で追加する必要がありますので、wpdb::prepareだけのためにそれらを追加する%sことにより、先行されません%。クエリの最後の部分はWHERE column_2 LIKE '%%%s%%'です。
ヤンファブリー

2

これは私がチェックしたことの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 
    ) 
);

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


5
%文字をエスケープする必要があります(like_escape()。を使用してください。codex.wordpress.org
Stephen Harris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.