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.