जवाबों:
इस फ़ंक्शन का उपयोग करें:
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; }
}
उपयोग:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
मैं अत्यधिक वर्तमान में सही के रूप में चयनित डैनियल के बहुत सरल समाधान की सिफारिश करूंगा :
$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' );
इस मामले में, मैं निश्चित रूप से get_userdata ($ user_id) का उपयोग नहीं करूंगा, जबकि यह WP_User लौटा रहा है, इसलिए यह सिर्फ एक कस्टम क्वेरी से अधिक लालची है।
क्वेरी के बारे में, मैं तैयार विधि का उपयोग करने से सहमत हूं, लेकिन SELECT COUNT (*) का अर्थ है कि आप सभी कॉलम लौटा रहे हैं , जो यहां बेकार है।
मैं SELECT COUNT (ID) का उपयोग नहीं करने की सलाह दूंगा, इस तरह से हम केवल एक ही कॉलम पर काम कर रहे हैं जो कि तेज होगा।
रिटर्निंग स्टेटमेंट के अन्य पहलू पर, यह टर्नरी लॉजिक के साथ अधिक पठनीय होगा:
वापसी 1 <$ गिनती? सही गलत;
संक्षेप में, मैं इसे लागू करूँगा:
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(*)
और SELECT COUNT(ID)
दोनों एक ही कॉलम ... एक गिनती।
यदि प्रदर्शन एक चिंता का विषय है, तो उपयोग करें:
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;
}
अन्यथा, उपयोग करें get_userdata($user_id) !== false
। get_userdata
एकल मान के बजाय डेटाबेस से पूरी पंक्ति को पुनः प्राप्त करने के लिए कॉल , एक नया WP_User ऑब्जेक्ट बनाता है और इसे सफलता पर कैश करता है।
यह आज़माएँ आपको wpdb के लिए मिसिंग तर्क 2 जैसी चेतावनी नहीं दिखाएगा :: तैयार ()
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;
ऐसा कुछ जो कम से कम कुछ हैकर्स द्वारा किया जाता है (मुझे पता है क्योंकि मैंने कम से कम एक बार इसका शिकार किया था) इस प्रकार के URL का उपयोग करके आपकी साइट पर जाना है
domain.com/?author=0
domain.com/?author=1
आदि।
एक सफल प्रयास में साइट के आउटपुट में वैध डेटा होगा, इसके अलावा उपयोगकर्ता का नाम वेबसाइट की सामग्री में होगा और उपनाम वहाँ भी हो सकता है (पेज आउटपुट के आधार पर)।
एक अवैध प्रयास पर साइट 404 पृष्ठ पर जाएगी (या जो भी पृष्ठ पर होने वाली त्रुटि के लिए निर्धारित नहीं है)।
यह बल्कि CURL का उपयोग करके एक स्क्रिप्ट बनाने के लिए तुच्छ हो सकता है जो लेखक से 0 = लेखक तक कह सकता है = अपेक्षाकृत कम समय में लेखक = 999 तक और उपयोगकर्ता नाम की एक सूची का उत्पादन करता है। मैंने अपनी साइटों में से एक के लिए एक हैकर ऐसा किया था और फिर लोकप्रिय पासवर्ड की दूसरी सूची का उपयोग करके प्रत्येक उपयोगकर्ता को लॉगिन करने का प्रयास किया।
जैसा कि आप पहली बार कल्पना कर सकते हैं कि यह थोड़ा डरावना है यह देखने के लिए कि कोई आपके सभी उपयोगकर्ता नामों को आसानी से जान सकता है। मेरे लिए भाग्यशाली पासवर्ड उस दिन बचाए गए, मुझे यकीन है कि हर कोई इतना भाग्यशाली नहीं है।
मैंने कुछ बड़े नाम वाली वेबसाइटों के खिलाफ इसका परीक्षण किया है (जो इस पद पर बिना नाम के रहेंगे) और ऐसा लगता है कि ऐसा होने से रोकने के लिए अभी तक कोई कुछ नहीं कर सकता है। मुझे व्यक्तिगत रूप से लगता है कि यह सुरक्षा जोखिम है जो वर्डप्रेस को बंद करना चाहिए।
संपादित करें :
यहां भविष्य में (2016 की शुरुआत में) अब मुझे पता है कि ऐसे तरीके / प्लगइन्स हैं जो इस यूजर एन्यूमरेशन अटैक को विफल कर सकते हैं। और मैंने आगे इस के सुरक्षा जोखिम पर अपना रुख बदल दिया है और मुझे नहीं लगता कि वर्डप्रेस को इसे बदलना चाहिए।
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists