Yanıtlar:
Bu işlevi kullanın:
function user_id_exists($user){
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user));
if($count == 1){ return true; }else{ return false; }
}
Kullanımı:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Daniel'in şu anda doğru olarak seçilmiş olana göre çok daha basit çözümünü şiddetle tavsiye ederim :
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
$user_ids = array_filter( $user_ids, 'get_userdata' );
Bu durumda kesinlikle bir WP_User döndürürken get_userdata ($ user_id) kullanmayacağım, bu yüzden sadece özel bir sorgudan daha açgözlü .
Sorgu hakkında, hazırlama yöntemini kullanmayı kabul ediyorum, ancak SELECT COUNT (*) , burada işe yaramayan tüm sütunları döndürdüğünüz anlamına gelir .
SELECT COUNT (ID) dengesiz kullanmanızı öneririm, bu şekilde yalnızca daha hızlı olacak tek bir sütun üzerinde çalışıyoruz.
Dönen ifadenin diğer yönüne göre, aşağıdaki gibi Üçlü Mantık ile daha okunabilir olacaktır:
1 <$ sayımı döndürür? doğru yanlış;
Özetle, ben bunu gibi olurdu:
function user_id_exists( $user_id ) {
global $wpdb;
$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM $wpdb->users WHERE ID = %d", $user_id ) );
return empty( $count ) || 1 > $count ? false : true;
}
SELECT COUNT(*)
ve SELECT COUNT(ID)
her ikisi de tek bir sütun döndürür ... bir sayı.
Performans bir endişe kaynağıysa, şunları kullanın:
function user_id_exists($user_id) {
global $wpdb;
// Check cache:
if (wp_cache_get($user_id, 'users')) return true;
// Check database:
if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;
return false;
}
Aksi takdirde kullanın get_userdata($user_id) !== false
. Çağrısı get_userdata
yeni bir WP_User nesnesi oluşturmak ve başarı üzerine önbelleğe, yerine tek değerin veritabanından tüm satır alır.
Bu deneyin wpdb :: ready () için Eksik argüman 2 gibi bir uyarı göstermeyecek
function user_id_exists($user_id){
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d",$user_id));
if($count == 1){ return true; }else{ return false; }
}
return $count == 1;
En az birkaç hacker tarafından yapılan bir şey (bunun en az bir kez kurban oynadığımı biliyorum) bu tür bir URL kullanarak sitenizi ziyaret etmektir
domain.com/?author=0
domain.com/?author=1
vb.
Başarılı bir denemede sitenin çıktısı geçerli verilere sahip olacak, buna ek olarak kullanıcı adı web sitesinin içeriğinde olacak ve takma ad da olabilir (sayfa çıktısına bağlı olarak).
Geçersiz bir denemede site 404 sayfasına gider (veya sayfada bulunamayan bir hatada ne olursa olsun ayarlanır).
Göreceli olarak kısa sürede yazar = 0'dan yazar = 999'a kadar test edebilen ve kullanıcı adlarının bir listesini çıkarabilen cURL kullanarak bir komut dosyası oluşturmak oldukça önemsiz olabilir. Bir bilgisayar korsanı sitelerimden biri için bunu yaptım ve daha sonra popüler şifrelerin başka bir listesini kullanarak her kullanıcıya giriş yapmaya çalıştım.
Bunun ilk kez hayal edebileceğiniz gibi, birisinin tüm kullanıcı adlarınızı kolayca bulabileceğini görmek biraz korkutucu. Benim için şanslı o gün kurtarılan güçlü şifreler, eminim ki herkes çok şanslı değil.
Ben (kim bu yazıda isimsiz kalacak) bir çift büyük isim web siteleri karşı test ettik ve kimse henüz bu olmasını durdurmak için yapabileceği bir şey olabilir gibi görünüyor. Şahsen wordpress'in kapanması güvenlik riski olduğunu düşünüyorum.
DÜZENLE :
Gelecekte (2016 başı) artık bu kullanıcı numaralandırma saldırısını engelleyebilecek yöntemler / eklentiler olduğunu biliyorum. Bunun güvenlik riski konusundaki tutumumu daha da değiştirdim ve artık WordPress'in bunu değiştirmesi gerektiğini düşünmüyorum.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists