Cómo verificar si un usuario existe por una identificación dada

12

¿Hay alguna forma de verificar si existe una identificación de usuario? Quiero crear una función similar username_exists()pero que regrese si la identificación existe o no.

Frankolin
fuente

Respuestas:

2

Utiliza esta función:

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
fuente
55
También puede utilizar este método también:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea
31

Recomiendo encarecidamente la solución mucho más simple de Daniel sobre la seleccionada actualmente como correcta:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Jani Uusitalo
fuente
Me gusta mucho más que crear una función propia solo para esto. En mi caso, tuve que trabajar con los datos de usuario de todos modos, así que ... +1
GDY
Si hay una matriz de ID de usuario y necesita eliminar los usuarios eliminados / no existentes, esto puede usarse como devolución de llamada de array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv
5

En este caso, definitivamente no usaré get_userdata ($ user_id) mientras devuelve un WP_User, por lo que es más codicioso que solo una consulta personalizada.

Acerca de la consulta, acepto usar el método de preparación, pero SELECT COUNT (*) significa que está devolviendo todas las columnas , lo cual es inútil aquí.

Recomendaría usar SELECT COUNT (ID) en su lugar, de esta manera solo estamos trabajando en una sola columna que será más rápida.

En otro aspecto para la declaración de devolución, sería más legible con una lógica ternaria como:

volver 1 <$ cuenta? verdadero Falso;

En resumen, lo habría 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
fuente
Solo para su información SELECT COUNT(*)y SELECT COUNT(ID)ambos devuelven una sola columna ... un recuento.
James Cushing el
2

Si el rendimiento es una preocupación, 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;
}

De lo contrario, use get_userdata($user_id) !== false. La llamada a get_userdatarecuperará una fila completa de la base de datos en lugar de un solo valor, creará un nuevo objeto WP_User y lo almacenará en caché en caso de éxito.

le_m
fuente
0

Pruebe Esto no le mostrará la advertencia como Falta el 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; }
}
Anand
fuente
Puedes escribirreturn $count == 1;
fuxia
solo necesito verificar si el usuario existe o no y cuando llamo a la función como: if (! user_id_exists ($ userId)) {// hacer cosas cuando el usuario no existe}
Anand
0

Algo que hacen al menos unos pocos hackers (lo sé porque jugué víctima de esto al menos una vez) es visitar su sitio utilizando este tipo de URL

domain.com/?author=0

domain.com/?author=1

etc.

En un intento exitoso, la salida del sitio tendrá datos válidos, además el nombre del usuario estará en el contenido del sitio web y el apodo también puede estar allí (dependiendo de la salida de las páginas).

En un intento no válido, el sitio irá a la página 404 (o lo que sea que ocurra en un error de página no encontrada).

Puede ser bastante trivial construir un script usando cURL que pueda probar desde say author = 0 hasta author = 999 en un tiempo relativamente corto y generar una lista de nombres de usuario. Hice que un hacker hiciera esto para uno de mis sitios y luego intentara iniciar sesión en cada usuario utilizando otra lista de contraseñas populares.

Como puede imaginar la primera vez que esto sucede, da un poco de miedo ver que alguien puede encontrar fácilmente todos sus nombres de usuario. Por suerte para mí, las contraseñas seguras se salvaron ese día, estoy seguro de que no todos tienen tanta suerte.

He probado esto contra un par de sitios web de renombre (que permanecerán sin nombre en esta publicación) y parece que todavía no hay nada que nadie pueda hacer para evitar que esto suceda. Personalmente, creo que es un riesgo de seguridad que WordPress se cierre.

EDITAR :

Aquí en el futuro (principios de 2016) ahora sé que hay métodos / complementos que pueden frustrar este ataque de enumeración de usuarios. Además, he cambiado mi postura sobre el riesgo de seguridad de esto y ya no creo que WordPress deba cambiar esto.

KnightHawk
fuente