Làm thế nào để bạn chuẩn bị đúng một câu lệnh% THÍCH% SQL?


34

Tôi muốn sử dụng câu lệnh %% văn bản% trong khi vẫn sử dụng lớp WordPress $ wpdb để vệ sinh và chuẩn bị đầu vào.

SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';

Tôi đã thử một cái gì đó như thế này nhưng không có kết quả:

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));

Làm thế nào để bạn chuẩn bị đúng một câu lệnh% THÍCH% SQL bằng cách sử dụng lớp cơ sở dữ liệu WordPress?

Câu trả lời:


49

Các $wpdb->esc_likechức năng tồn tại trong WordPress vì cơ sở dữ liệu thoát bình thường không thoát khỏi %_ký tự. Điều này có nghĩa là bạn có thể thêm chúng trong đối số của mình wpdb::prepare()mà không gặp vấn đề gì. Đây cũng là những gì tôi thấy trong mã WordPress cốt lõi :

$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');

Vì vậy, mã của bạn sẽ trông như sau:

$wpdb->prepare(
    "SELECT
        column_1
    FROM
        `{$wpdb->base_prefix}my_table`
    WHERE
        column_2 LIKE %s;",
    '%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);

Bạn cũng có thể thêm %%vào truy vấn của mình để có được một chữ %( wpdb::prepare()sử dụng vsprintf()trong nền, có cú pháp này ), nhưng hãy nhớ rằng chuỗi của bạn sẽ không được trích dẫn , bạn phải tự thêm dấu ngoặc kép (đó không phải là điều bạn thường phải làm trong wpdb::prepare().


là những gì {}cho?
Francisco Corrales Morales

@FranciscoCorralesMorales: Để chỉ ra rằng mọi thứ bên trong nó nên được coi là một biểu thức biến , nếu không nó sẽ chỉ nhìn thấy $wpdbvà bỏ qua phần ->prefixsau nó.
Jan Fabry

1
@JanFabry Đóng. Tôi sẽ sửa nhận xét để nói: "... nếu không nó sẽ thấy tất cả $wpdb->base_prefixmy_tablevà cố gắng tra cứu base_prefixmy_tabletài sản thay vì chỉ base_prefix.
Flimm

3

Bạn cần tăng gấp đôi phần trăm để chúng không bị đối xử như các dấu phân đoạn bằng cách 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 không chắc chắn đây là cách tốt nhất / duy nhất để làm điều đó.


4
Hãy nhớ rằng bạn phải tự thêm các trích dẫn xung quanh chuỗi , bởi vì wpdb::preparesẽ chỉ thêm chúng cho một chuỗi %skhông có trước% . Phần cuối cùng của truy vấn của bạn nên là WHERE column_2 LIKE '%%%s%%'.
Jan Fabry

2

Đây là một cách để làm điều đó mà tôi đã kiểm tra và nó hoạt động:

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

Thay thế các biến cho phù hợp với nhu cầu của bạn.


5
Bạn nên thoát các %ký tự (bằng cách sử dụng like_escape(). Xem: codex.wordpress.org/Class_Reference/iêu
Stephen Harris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.