Odpowiedzi:
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
}
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
}
$user_ids = array_filter( $user_ids, 'get_userdata' );
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;
}
SELECT COUNT(*)
i SELECT COUNT(ID)
oba zwracają jedną kolumnę ... liczbę.
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_userdata
spowoduje pobranie całego wiersza z bazy danych zamiast pojedynczej wartości, utworzenie nowego obiektu WP_User i buforowanie go w przypadku powodzenia.
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; }
}
return $count == 1;
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ć.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists