Tôi có nên sử dụng chuẩn bị wpdb?


28

Tôi mới sử dụng SQL và đang tự hỏi liệu tôi có cần sử dụng wpdb->preparecho truy vấn sau vào bảng tôi đã tạo không

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

Tôi có cần sử dụng prepareở đây không? Làm thế nào tôi sẽ làm điều đó?

Chúc mừng

Câu trả lời:


33

Cách tốt nhất là luôn luôn sử dụng preparenhưng công dụng chính của nó là ngăn chặn các cuộc tấn công tiêm nhiễm SQL và vì không có đầu vào từ người dùng / khách truy cập hoặc họ không thể thực hiện truy vấn nên đó không phải là vấn đề trong ví dụ hiện tại của bạn.

Nhưng như tôi đã nói trước đây, đó là cách tốt nhất để sử dụng nó và một khi bạn bắt đầu sử dụng nó, bạn sẽ không bao giờ dừng lại, vì vậy trong ví dụ của bạn, bạn có thể sử dụng nó như vậy:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

để đọc thêm về cách sử dụng nó vào codex


Xin chào @Bai Internet, cảm ơn vì lời giải thích rõ ràng như vậy - vì một số lý do khi tôi thử mã của bạn, nó trả về một mảng trống. Tôi đã kiểm tra và nhân đôi kiểm tra lỗi chính tả. Nếu tôi thực hiện truy vấn chưa chuẩn bị, tôi nhận được mảng. Tôi không hiểu tại sao nó không hoạt động ..!
Richard Sweeney

Kì lạ Tôi đã thử sử dụng cùng một mã với một truy vấn khác: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); Và nó hoạt động rất tốt! Không chắc chắn tại sao điều đó sẽ được. Nhưng tôi nhận được nó bây giờ trong mọi trường hợp!
Richard Sweeney

6
Việc đóng tên bảng trong dấu ngoặc đơn sẽ không hoạt động. Lối thoát bình thường là với backticks, vì vậy truy vấn của bạn sẽ trông giống như thế này : SELECT * FROM `wp_my_custom_table`. Bạn có thể kích hoạt hỗ trợ báo giá kép, nhưng sau đó nó sẽ phải như thế này : SELECT * FROM "wp_my_custom_table".
Jan Fabry

3
Tôi không đồng ý với câu trả lời này. Tại sao bạn nên thoát khi chức năng đã thoát khỏi mọi thứ? Bạn nghĩ Wordpress sẽ quyết định loại bỏ thoát khỏi cốt lõi? Ngoài ra không có điểm nào để thoát tên bảng :) bởi vì nó được mã hóa cứng và bạn biết nó ổn. Tôi biết đây chỉ là ví dụ nhưng dù sao cũng không thoát được tên bảng, tôi gặp vấn đề khi sử dụng chuẩn bị với tên bảng, nó thêm backticks và lỗi SQL trows.
Tommixoft

@Tommixoft Nếu bạn đọc lại câu trả lời, bạn sẽ thấy rằng bạn thực sự nói điều tương tự như tôi đã nói, và tên bảng là một ví dụ.
Bai Internet

0

Khi bạn sử dụng chuẩn bị, nó sẽ bảo vệ mã khỏi các lỗ hổng SQL tiêm.

Đây là mã bạn cần sửa đổi để sử dụng prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );

0

Trong trường hợp của bạn là không thể tấn công SQL tiêm . Mã của bạn không cần bảo vệ bổ sung vì không sử dụng đầu vào của người dùng như: đăng, nhận, yêu cầu, cookie.

Không sử dụng chức năng phức tạp khi không cần thiết để tiết kiệm tài nguyên máy chủ.

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.