Haruskah saya menggunakan persiapan wpdb?

28

Saya baru mengenal SQL dan bertanya-tanya apakah saya perlu menggunakan wpdb->preparekueri berikut untuk tabel yang saya buat

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

Apakah saya perlu menggunakannya di preparesini? Bagaimana saya melakukannya?

Tepuk tangan

Richard Sweeney
sumber

Jawaban:

33

Ini praktik terbaik untuk selalu menggunakan preparetetapi penggunaan utama adalah untuk mencegah terhadap serangan injeksi SQL, dan karena tidak ada input dari pengguna / pengunjung atau mereka tidak dapat mempengaruhi permintaan maka itu bukan masalah dalam contoh Anda saat ini.

Tapi seperti yang saya katakan sebelumnya, praktik terbaik untuk menggunakannya dan sekali Anda mulai menggunakannya, Anda tidak pernah berhenti, jadi dalam contoh Anda, Anda dapat menggunakannya seperti ini:

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

untuk membaca lebih lanjut tentang cara menggunakannya menuju ke codex

Bainternet
sumber
Hai @ Netternet, terima kasih untuk penjelasan yang jelas - untuk beberapa alasan ketika saya mencoba kode Anda mengembalikan array kosong. Saya telah memeriksa dan menggandakan memeriksa kesalahan ketik. Jika saya melakukan permintaan yang tidak siap saya mendapatkan array. Saya tidak mengerti mengapa itu tidak berhasil ..!
Richard Sweeney
Aneh. Saya sudah mencoba menggunakan kode yang sama dengan permintaan lain: $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 ); Dan itu berhasil! Tidak yakin mengapa itu terjadi. Tapi saya mengerti sekarang!
Richard Sweeney
6
Menutup nama tabel dalam tanda kutip tunggal tidak akan berfungsi. The melarikan diri normal dengan tanda kutip mundur, sehingga permintaan Anda harus berakhir tampak seperti ini: SELECT * FROM `wp_my_custom_table`. Anda dapat mengaktifkan dukungan kutip ganda, tapi kemudian itu akan terlihat seperti ini: SELECT * FROM "wp_my_custom_table".
Jan Fabry
3
Saya tidak setuju dengan jawaban ini. Mengapa Anda harus melarikan diri ketika fungsi sudah lolos dari segalanya? Anda pikir Wordpress akan memutuskan untuk menghapus melarikan diri dari inti? JUGA tidak ada gunanya untuk melarikan diri dari nama tabel :) karena hardcoded dan Anda tahu itu ok. Saya tahu ini hanya contoh tapi jangan luput nama tabel, saya punya masalah ketika menggunakan mempersiapkan dengan nama tabel itu menambahkan backticks dan kesalahan SQL trows.
Tommixoft
@Tommixoft Jika Anda membaca jawabannya lagi Anda akan melihat bahwa Anda benar-benar mengatakan hal yang sama seperti yang saya katakan, dan bahwa nama tabel adalah contoh.
Bainternet
0

Ketika Anda menggunakan prep, itu melindungi kode dari kerentanan injeksi SQL.

Berikut adalah kode yang perlu Anda modifikasi untuk digunakan 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 );
kata sandi
sumber
0

Dalam kasus Anda tidak mungkin serangan injeksi SQL . Kode Anda tidak memerlukan perlindungan tambahan karena tidak menggunakan input pengguna seperti: posting, dapatkan, permintaan, cookie.

Jangan gunakan fungsi yang rumit saat tidak diperlukan untuk menghemat sumber daya server.

SaschArt
sumber