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


무엇 {}입니까?
Francisco Corrales Morales

@FranciscoCorralesMorales : 내부의 모든 것이 변수 표현식 으로 간주되어야 함을 나타내려면 그렇지 않으면을 참조 $wpdb하고 그 ->prefix이후를 무시하십시오 .
Jan Fabry

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

추신 : 이것이 최선의 방법인지 확실하지 않습니다.


4
기억 이 문자열 자신의 주위에 따옴표를 추가해야 하기 때문에, wpdb::prepare의지 만에 대한 추가 %s가 선행되지 않도록% . 검색어의 마지막 부분은 WHERE column_2 LIKE '%%%s%%'입니다.
Jan Fabry 2019

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/…
Stephen Harris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.