Jak sprawdzić, czy użytkownik istnieje według danego identyfikatora

12

Czy jest jakiś sposób, aby sprawdzić, czy istnieje identyfikator użytkownika? Chcę utworzyć funkcję podobną do tej, username_exists()która zwróci się, jeśli identyfikator istnieje, czy nie.

Frankolin
źródło

Odpowiedzi:

2

Użyj tej funkcji:

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

}

Stosowanie:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
Daniel Patilea
źródło
5
możesz także użyć tej metody:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea
31

Zdecydowanie poleciłbym znacznie prostsze rozwiązanie Daniela niż to, które obecnie zostało wybrane jako prawidłowe:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Jani Uusitalo
źródło
Podoba mi się to o wiele bardziej niż tworzenie własnej funkcji tylko w tym celu. W moim przypadku i tak musiałem pracować z danymi użytkownika, więc… +1
GDY
Jeśli istnieje tablica identyfikatorów użytkowników i konieczne jest usunięcie usuniętych / nieistniejących użytkowników, można tego użyć jako wywołania zwrotnego filter_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv
5

W tym przypadku na pewno nie użyję get_userdata ($ user_id), gdy zwraca WP_User, więc jest bardziej chciwy niż zwykłe zapytanie.

Jeśli chodzi o zapytanie, zgadzam się przy użyciu metody przygotowania, ale SELECT COUNT (*) oznacza, że ​​zwracasz wszystkie kolumny , co jest tutaj bezużyteczne.

Polecam za pomocą SELECT COUNT (ID) unstead, w ten sposób pracujemy tylko na jednej kolumnie, która będzie szybsza.

W innym aspekcie zwracanej instrukcji byłoby bardziej czytelne dzięki Ternary Logic, takim jak:

zwróć 1 <$ count? prawda fałsz;

Podsumowując, zaimplementowałbym to w następujący sposób:

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;
}
Maxime Culea
źródło
Po prostu FYI SELECT COUNT(*)i SELECT COUNT(ID)oba zwracają jedną kolumnę ... liczbę.
James Cushing
2

Jeśli problemem jest wydajność, użyj:

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

W przeciwnym razie użyj get_userdata($user_id) !== false. Wywołanie to get_userdataspowoduje pobranie całego wiersza z bazy danych zamiast pojedynczej wartości, utworzenie nowego obiektu WP_User i buforowanie go w przypadku powodzenia.

le_m
źródło
0

Spróbuj To nie wyświetli ostrzeżenia, takiego jak Brakujący argument 2 dla wpdb :: preparat ()

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; }
}
Anand
źródło
Możesz po prostu napisaćreturn $count == 1;
fuxia
Muszę tylko sprawdzić, czy użytkownik istnieje, czy nie, a kiedy wywołam funkcję: if (! user_id_exists ($ userId)) {// robię rzeczy, gdy użytkownik nie istnieje}
Anand
0

Coś, co robi co najmniej kilku hakerów (wiem, bo przynajmniej raz grałem w tę ofiarę), to odwiedzić twoją stronę używając tego typu URL

domain.com/?author=0

domain.com/?author=1

itp.

Po udanej próbie dane wyjściowe witryny będą zawierały prawidłowe dane, ponadto nazwa użytkownika użytkownika będzie znajdować się w treści strony internetowej, a także może tam znajdować się pseudonim (w zależności od wyników stron).

W przypadku nieprawidłowej próby strona przejdzie na stronę 404 (lub cokolwiek innego, co ma się wydarzyć na stronie nie znaleziono błędu).

Budowanie skryptu przy użyciu cURL może być dość trywialne, które może testować od powiedzmy autor = 0 do autor = 999 w stosunkowo krótkim czasie i wyświetlać listę nazw użytkowników. Miałem hakera, który zrobił to dla jednej z moich stron, a następnie próbował zalogować się do każdego użytkownika przy użyciu innej listy popularnych haseł.

Jak możesz sobie wyobrazić, kiedy to się dzieje po raz pierwszy, trochę przerażające jest, że ktoś może dość łatwo znaleźć wszystkie twoje nazwy użytkowników. Na szczęście dla mnie silne hasła uratowały ten dzień, jestem pewien, że nie wszyscy mają tyle szczęścia.

Przetestowałem to na kilku znanych stronach internetowych (które pozostaną bezimienne w tym poście) i wydaje się, że nikt nie może jeszcze nic zrobić, aby temu zapobiec. Osobiście uważam, że wordpress powinien zamknąć ryzyko bezpieczeństwa.

EDYCJA :

Tutaj w przyszłości (początek 2016 r.) Teraz wiem, że istnieją metody / wtyczki, które mogą udaremnić atak polegający na wyliczeniu użytkowników. Ponadto zmieniłem swoje stanowisko w sprawie ryzyka związanego z bezpieczeństwem i nie sądzę, że WordPress powinien to zmienić.

KnightHawk
źródło