Wpdb hazır kullanmalı mıyım?


28

SQL'de yeniyim ve wpdb->prepareoluşturduğum bir tabloda aşağıdaki sorgu için kullanmam gerekip gerekmediğini merak ediyorum

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

prepareBurada kullanmam gerekir mi? Bunu nasıl yaparım?

Şerefe

Yanıtlar:


33

Her zaman kullanmak en iyisidir, prepareancak asıl kullanımı, SQL enjeksiyon saldırılarına karşı önlem almaktır ve kullanıcılar / ziyaretçilerden hiçbir girdi olmadığından veya sorguyu etkileyemediğinden geçerli örneğinizde sorun değildir.

Ama kullanmamın en iyi yöntemi olduğunu söylediğim gibi ve kullanmaya başladığınızda, asla durmazsınız, bu nedenle örneğinizde şöyle kullanabilirsiniz:

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

daha nasıl kullanılacağı hakkında bilgi almak için bu kadar kafa kodeksine


Hi @Bainternet, açık ve net bir açıklama için teşekkürler - kodunuzu denediğim zaman boş bir dizi döndürür. Yazım denetledi ve yazım denetleme ikiye katlandı. Hazırlıksız sorguyu yaparsam diziyi alırım. Neden işe yaramadığını anlamıyorum ..!
Richard Sweeney

Garip. Aynı kodu başka bir sorgu ile kullanmayı denedim: $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 ); Ve harika çalışıyor! Bunun neden olacağından emin değilim. Ama şimdi her durumda anlıyorum!
Richard Sweeney

6
Çevreleyen tablo adını içinde tek tırnak çalışmaz. Sorgu bu benzeyen sonunda bu yüzden, normal kaçış, ters tırnakların ile geçerli: SELECT * FROM `wp_my_custom_table`. Sen çift tırnak desteğini etkinleştirmek, ancak o zaman bu gibi bakmak gerekir: SELECT * FROM "wp_my_custom_table".
Jan Fabry

3
Bu cevaba katılmıyorum. İşlev zaten her şeyden kaçarken neden kaçmalısınız? Wordpress'in kaçmayı ortadan kaldırmak için karar vereceğini mi düşünüyorsun? Ayrıca tablo adından kaçmanın bir anlamı yok :) çünkü kodlanmış ve bunun doğru olduğunu biliyorsunuz. Bunun sadece bir örnek olduğunu biliyorum ama yine de tablo isimlerinden kaçma, tablo isimleriyle hazırladığımda backticks ve SQL hatalarını ekleyen sorunlarım var.
Tommixoft

@ Tommixoft Eğer cevabı tekrar okursanız, söylediklerimi aynen söylediğinizi ve tablonun adının bir örnek olduğunu göreceksiniz.
Bainternet

0

Kullandığınızda hazırlayın, kodu SQL enjeksiyon güvenlik açıklarından koruyor.

İşte kullanmak için değiştirmeniz gereken kod 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

Senin durumunda mümkün değil, SQL enjeksiyon saldırısı . Kodunuz, ek korumaya ihtiyaç duymaz, çünkü kullanıcı girişi: post, get, request, cookie kullanmaz.

Sunucu kaynaklarını kaydetmek için gerekli olmadığında karmaşık işlev kullanmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.