Como verificar se um usuário existe por um determinado ID

10

Existe alguma maneira de verificar se existe um ID de usuário? Eu quero criar uma função semelhante a username_exists() , mas que retorna se o id existe ou não.

    
por Frankolin 17.10.2014 / 15:59

6 respostas

2

Use esta função:

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

}

Uso:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
    
por Daniel Patilea 17.10.2014 / 16:02
23

Eu recomendo A solução muito mais simples do Daniel sobre a atualmente selecionada como correta:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
    
por Jani Uusitalo 04.03.2015 / 16:38
5

Neste caso, eu definitivamente não usarei o get_userdata ($ user_id) enquanto ele estiver retornando um WP_User, então é mais ganancioso do que apenas uma consulta personalizada.

Sobre a consulta, concordo com o método prepare, mas o SELECT COUNT (*) significa que você está retornando todas as colunas , o que é inútil aqui.

Eu recomendaria usar o SELECT COUNT (ID) desabilitado, dessa forma, estamos trabalhando apenas em uma única coluna, que será mais rápida.

Em outro aspecto para a instrução de retorno, seria mais legível com uma Lógica Ternária como:

return 1 < $count ? true : false;

Para resumir, eu teria implementado como:

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;
}
    
por Maxime Culea 18.11.2015 / 11:40
2

Se o desempenho for uma preocupação, use:

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

Caso contrário, use get_userdata($user_id) !== false . A chamada para get_userdata recuperará uma linha inteira do banco de dados em vez de um único valor, criará um novo objeto WP_User e armazenará em cache o mesmo com sucesso.

    
por le_m 05.03.2017 / 23:24
0

Tente Isto não irá mostrar-lhe o aviso como Faltando argumento 2 para 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; }
}
    
por Anand 12.06.2015 / 11:13
0

Algo que é feito por pelo menos alguns hackers (eu sei, porque eu já fiz isso pelo menos uma vez) é visitar seu site usando esse tipo de URL

domain.com/?author=0

domain.com/?author=1

etc.

Em uma tentativa bem-sucedida, a saída do site terá dados válidos; além disso, o usuário nicename estará no conteúdo do site e o apelido também poderá estar lá (dependendo da saída das páginas).

Em uma tentativa inválida, o site irá para a página 404 (ou o que quer que esteja configurado para acontecer em uma página que não encontrou o erro).

Pode ser bastante trivial construir um script usando cURL que pode testar de autor = 0 até autor = 999 em um período de tempo relativamente curto e gerar uma lista de nomes de usuários. Eu fiz um hacker fazer isso em um dos meus sites e tente fazer login em cada usuário usando outra lista de senhas populares.

Como você pode imaginar a primeira vez que isso acontece, é um pouco assustador ver que alguém pode facilmente encontrar todos os seus nomes de usuários. Sorte para mim senhas strongs salvou o dia que o tempo, tenho certeza que nem todo mundo tem tanta sorte.

Eu testei isso contra alguns sites de grande nome (que permanecerão sem nome neste post) e parece que pode haver nada que alguém possa fazer ainda para impedir que isso aconteça. Eu pessoalmente acho que é um risco de segurança que o wordpress deva fechar.

EDITAR :

Aqui no futuro (começo de 2016), agora sei que há métodos / plug-ins que podem impedir esse ataque de enumeração de usuário. Além disso, mudei minha postura quanto ao risco de segurança disso e não acho mais que o WordPress deva mudar isso.

    
por KnightHawk 17.10.2014 / 17:39