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

12

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.

Frankolin
fonte

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
}
Daniel Patilea
fonte
5
também você pode usar esse método também: #$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea
31

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

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Jani Uusitalo
fonte
Eu gosto muito mais deste do que criar uma função própria apenas para isso. No meu caso, eu tive que trabalhar com os dados do usuário de qualquer maneira… +1
GDY
Se houver uma matriz de IDs de usuário e você precisar remover os usuários excluídos / não existentes, isso poderá ser usado como retorno de chamada array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv 2/19/19
5

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

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

Eu recomendaria o uso de SELECIONAR CONTAGEM (ID) não- estável, dessa maneira, estamos trabalhando apenas em uma única coluna que será mais rápida.

Em outro aspecto da declaração de retorno, seria mais legível com uma lógica ternária como:

retornar 1 <$ contagem? verdadeiro falso;

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;
}
Maxime Culea
fonte
Apenas para sua informação, SELECT COUNT(*)e SELECT COUNT(ID)ambos retornam uma única coluna ... uma contagem.
James Cushing
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_userdatarecuperará uma linha inteira do banco de dados em vez de um único valor, criará um novo objeto WP_User e o armazenará em cache com êxito.

le_m
fonte
0

Tente isto não exibirá o aviso como Argumento ausente 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; }
}
Anand
fonte
Você pode simplesmente escreverreturn $count == 1;
fuxia
i precisa verificar apenas o exist usuário ou não, e quando eu chamar a função como: if {// fazer animais quando o usuário não existe} (user_id_exists ($ userId)!)
Anand
0

Algo que é feito por pelo menos alguns hackers (eu sei porque fui vítima disso 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 nome do usuário estará no conteúdo do site e o apelido também 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 estiver definido para ocorrer em um erro de página não encontrada).

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

Como você pode imaginar na primeira vez que isso acontece, é um pouco assustador ver que alguém pode facilmente descobrir todos os seus nomes de usuário. Para minha sorte, senhas fortes salvaram o dia naquele momento, tenho certeza que nem todo mundo tem tanta sorte.

Eu testei isso em alguns sites de grandes nomes (que permanecerão sem nome neste post) e parece que ainda não há nada que alguém possa fazer para impedir que isso aconteça. Pessoalmente, acho que é risco de segurança que o wordpress feche.

EDIT :

Aqui no futuro (início de 2016) agora eu sei que existem métodos / plugins que podem impedir esse ataque de enumeração de usuários. Além disso, mudei minha posição sobre o risco de segurança disso e não acho mais que o WordPress deva mudar isso.

KnightHawk
fonte