วิธีการตรวจสอบว่ามีผู้ใช้อยู่ด้วยรหัสที่กำหนด


12

มีวิธีใดบ้างในการตรวจสอบว่ามี ID ผู้ใช้หรือไม่ ฉันต้องการสร้างฟังก์ชั่นที่คล้ายกับusername_exists()แต่จะส่งกลับหากมี ID อยู่หรือไม่

คำตอบ:


2

ใช้ฟังก์ชั่นนี้:

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
}

5
นอกจากนี้คุณยังสามารถใช้วิธีนี้ได้เช่นกัน:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea

31

ฉันขอแนะนำโซลูชันที่ง่ายกว่าของแดเนียลมากกว่าโซลูชันที่เลือกไว้ในปัจจุบันว่าถูกต้อง:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}

ฉันชอบอันนี้มากกว่าสร้างฟังก์ชั่นของตัวเองสำหรับสิ่งนี้ ในกรณีของฉันฉันต้องทำงานกับ userdata อยู่แล้วดังนั้น… +1
GDY

หากมี ID ผู้ใช้จำนวนมากและคุณจำเป็นต้องลบผู้ใช้ที่ถูกลบหรือไม่มีอยู่สิ่งนี้สามารถใช้เป็นการโทรกลับ array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv

5

ในกรณีนี้ฉันจะไม่ใช้get_userdata ($ user_id)ในขณะที่มันส่งคืน WP_User ดังนั้นมันจึงเป็นโลภมากกว่าแบบสอบถามที่กำหนดเอง

เกี่ยวกับข้อความค้นหาฉันยอมรับการใช้วิธีการจัดเตรียม แต่SELECT COUNT (*)หมายถึงคุณกำลังส่งคืนคอลัมน์ทั้งหมดซึ่งไม่มีประโยชน์ที่นี่

ฉันอยากจะแนะนำให้ใช้SELECT COUNT (ID) unstead ด้วยวิธีนี้เราจะทำงานในคอลัมน์เดียวเท่านั้นซึ่งจะเร็วขึ้น

ในด้านอื่น ๆ สำหรับคำสั่งที่ส่งคืนจะสามารถอ่านได้ง่ายขึ้นด้วย Ternary Logic เช่น:

ส่งคืน 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;
}

แค่ FYI SELECT COUNT(*)และSELECT COUNT(ID)ทั้งสองคืนคอลัมน์เดียว ... การนับ
James Cushing

2

หากประสิทธิภาพเป็นข้อกังวลให้ใช้:

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 ใหม่และแคชสำเร็จ


0

ลองสิ่งนี้จะไม่แสดงคำเตือนที่เหมือนการโต้แย้งที่ 2 สำหรับ wpdb :: prepare ()

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

ฉันต้องตรวจสอบผู้ใช้ว่ามีอยู่หรือไม่และเมื่อฉันเรียกใช้ฟังก์ชันเช่น: if (! user_id_exists ($ userId)) {// ทำเนื้อหาเมื่อไม่มีผู้ใช้}
Anand

0

สิ่งที่ทำโดยแฮ็กเกอร์อย่างน้อยสองสาม (ฉันรู้ว่าเพราะฉันเล่นเหยื่อนี้อย่างน้อยหนึ่งครั้ง) คือการเยี่ยมชมเว็บไซต์ของคุณโดยใช้ URL ประเภทนี้

domain.com/?author=0

domain.com/?author=1

เป็นต้น

ในความพยายามที่ประสบความสำเร็จผลลัพธ์ของเว็บไซต์จะมีข้อมูลที่ถูกต้องนอกจากนี้ชื่อผู้ใช้จะอยู่ในเนื้อหาของเว็บไซต์และชื่อเล่นอาจจะมีเช่นกัน (ขึ้นอยู่กับผลลัพธ์ของหน้าเว็บ)

ในความพยายามที่ไม่ถูกต้องเว็บไซต์จะไปที่หน้า 404 (หรือสิ่งที่กำหนดให้เกิดขึ้นในหน้าไม่พบข้อผิดพลาด)

มันค่อนข้างง่ายที่จะสร้างสคริปต์โดยใช้ cURL ที่สามารถทดสอบจากผู้เขียน say = 0 ถึงผู้เขียน = 999 ในระยะเวลาอันสั้นและส่งรายชื่อผู้ใช้ออกมา ฉันมีแฮ็กเกอร์ทำเช่นนี้กับหนึ่งในเว็บไซต์ของฉันแล้วลองลงชื่อเข้าใช้กับผู้ใช้แต่ละคนโดยใช้รายการรหัสผ่านยอดนิยมอื่น

ดังที่คุณสามารถจินตนาการได้ในครั้งแรกที่สิ่งนี้เกิดขึ้นมันค่อนข้างน่ากลัวที่จะเห็นว่ามีใครบางคนสามารถหาชื่อผู้ใช้ทั้งหมดของคุณได้อย่างง่ายดาย โชคดีสำหรับฉันรหัสผ่านที่แข็งแกร่งช่วยในวันนั้นฉันไม่แน่ใจว่าทุกคนจะโชคดี

ฉันได้ทดสอบสิ่งนี้กับเว็บไซต์ชื่อใหญ่สองสามแห่ง (ที่ยังคงไม่ระบุชื่อในโพสต์นี้) และดูเหมือนว่าอาจไม่มีอะไรที่ทุกคนสามารถทำได้เพื่อหยุดยั้งเรื่องนี้ ฉันคิดว่าเป็นการเสี่ยงด้านความปลอดภัยที่ wordpress ควรปิด

แก้ไข :

ที่นี่ในอนาคต (ต้นปี 2016) ตอนนี้ฉันรู้แล้วว่ามีวิธีการ / ปลั๊กอินที่สามารถป้องกันการโจมตีการแจงนับของผู้ใช้นี้ และฉันได้เปลี่ยนจุดยืนของฉันต่อความเสี่ยงด้านความปลอดภัยแล้วและฉันไม่คิดว่า WordPress จะเปลี่ยนสิ่งนี้อีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.