Cách kiểm tra xem người dùng có tồn tại bởi một id đã cho không


12

Có cách nào để kiểm tra xem id người dùng có tồn tại không? Tôi muốn tạo một hàm tương tự username_exists()nhưng trả về nếu id tồn tại hay không.

Câu trả lời:


2

Sử dụng chức năng này:

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

}

Sử dụng:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}

5
bạn cũng có thể sử dụng phương pháp này:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea

31

Tôi rất muốn giới thiệu giải pháp đơn giản hơn nhiều của Daniel so với giải pháp hiện được chọn là chính xác:

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

Tôi thích cái này hơn nhiều so với việc tạo một chức năng riêng cho việc này. Trong trường hợp của tôi, tôi đã phải làm việc với userdata vì vậy, +1 +1
GDY

Nếu có một mảng ID người dùng và bạn cần xóa người dùng đã xóa / không tồn tại, điều này có thể được sử dụng như cuộc gọi lại mảng_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv

5

Trong trường hợp này, tôi chắc chắn sẽ không sử dụng get_userdata ($ user_id) trong khi nó đang trả về WP_User, vì vậy nó tham lam hơn là chỉ truy vấn tùy chỉnh.

Về truy vấn, tôi đồng ý sử dụng phương thức chuẩn bị, nhưng CHỌN COUNT (*) có nghĩa là bạn đang trả về tất cả các cột , điều này là vô ích ở đây.

Tôi khuyên bạn nên sử dụng CHỌN CHỌN (ID) không ổn định, theo cách này, chúng tôi chỉ làm việc trên một cột duy nhất sẽ nhanh hơn.

Ở khía cạnh khác cho câu lệnh trả về, nó sẽ dễ đọc hơn với Logic Ternary như:

trả lại 1 <$? đúng sai;

Tóm lại, tôi wouldd đã thực hiện nó như sau:

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

Chỉ cần FYI SELECT COUNT(*)SELECT COUNT(ID)cả hai trả về một cột duy nhất ... một số đếm.
James Cushing

2

Nếu hiệu suất là một mối quan tâm, sử dụng:

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

Nếu không, sử dụng get_userdata($user_id) !== false. Cuộc gọi đến get_userdatasẽ lấy toàn bộ một hàng từ cơ sở dữ liệu thay vì một giá trị duy nhất, tạo một đối tượng WP_User mới và lưu trữ thành công.


0

Hãy thử Điều này sẽ không hiển thị cho bạn cảnh báo như Thiếu đối số 2 cho wpdb :: ready ()

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

Bạn chỉ có thể viếtreturn $count == 1;
fuxia

Tôi chỉ cần kiểm tra người dùng có tồn tại hay không và khi tôi gọi hàm như: if (! user_id_exists ($ userId)) {// làm công cụ khi người dùng không tồn tại}
Anand

0

Một cái gì đó được thực hiện bởi ít nhất một vài tin tặc (tôi biết vì tôi đã chơi nạn nhân này ít nhất một lần) là truy cập trang web của bạn bằng loại URL này

domain.com/?author=0

domain.com/?author=1

Vân vân.

Khi thử thành công, đầu ra của trang sẽ có dữ liệu hợp lệ, ngoài ra tên người dùng sẽ có trong nội dung của trang web và biệt danh cũng có thể ở đó (tùy thuộc vào đầu ra của trang).

Khi thử không hợp lệ, trang web sẽ chuyển đến trang 404 (hoặc bất cứ điều gì được đặt xảy ra trên một trang không tìm thấy lỗi).

Việc xây dựng một tập lệnh bằng cURL có thể khá đơn giản, có thể kiểm tra từ say Author = 0 cho đến tác giả = 999 trong một khoảng thời gian tương đối ngắn và đưa ra danh sách tên người dùng. Tôi đã có một hacker làm điều này cho một trong các trang web của tôi và sau đó cố gắng đăng nhập vào mỗi người dùng bằng cách sử dụng một danh sách mật khẩu phổ biến khác.

Như bạn có thể tưởng tượng lần đầu tiên điều này xảy ra, thật đáng sợ khi thấy rằng ai đó có thể dễ dàng tìm ra tất cả tên người dùng của bạn. May mắn cho tôi mật khẩu mạnh đã lưu vào ngày hôm đó, tôi chắc chắn không phải ai cũng may mắn như vậy.

Tôi đã thử nghiệm điều này với một vài trang web tên tuổi lớn (những người sẽ vẫn không tên trong bài đăng này) và dường như có thể không có ai có thể làm gì để ngăn chặn điều này xảy ra. Cá nhân tôi nghĩ rằng đó là rủi ro bảo mật mà wordpress nên đóng.

CHỈNH SỬA :

Ở đây trong tương lai (đầu năm 2016) bây giờ tôi biết rằng có các phương thức / plugin có thể ngăn chặn cuộc tấn công liệt kê của người dùng này. Và tôi đã thay đổi quan điểm của mình về rủi ro bảo mật của điều này và tôi không còn nghĩ rằng WordPress nên thay đổi điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.