Cómo verificar si un usuario existe por un ID determinado

17 oct 2014, 16:59:39
Vistas: 42.1K
Votos: 16

¿Existe alguna manera de verificar si existe un ID de usuario? Quiero crear una función similar a username_exists() pero que devuelva si el ID existe o no.

0
Todas las respuestas a la pregunta 7
2
47

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

$user = get_userdata( $user_id );
if ( $user === false ) {
    //el ID de usuario no existe
} else {
    //el ID de usuario existe
}
4 mar 2015 17:38:19
Comentarios

Me gusta más esta opción que crear una función propia solo para esto. En mi caso, de todos modos tenía que trabajar con los datos de usuario así que... +1

GDY GDY
29 mar 2018 20:10:31

Si hay un array de IDs de usuario y necesitas eliminar los usuarios borrados/no existentes, esto puede usarse como callback para array_filter: $user_ids = array_filter( $user_ids, 'get_userdata' );

Oksana Romaniv Oksana Romaniv
2 oct 2019 20:55:27
2

En este caso, definitivamente no usaría get_userdata( $user_id ) ya que retorna un WP_User, lo que lo hace más costoso en recursos que una consulta personalizada.

Sobre la consulta, estoy de acuerdo en usar el método prepare, pero SELECT COUNT(*) significa que estás retornando todas las columnas, lo cual es innecesario aquí.

Recomendaría usar SELECT COUNT(ID) en su lugar, de esta manera solo trabajamos con una sola columna, lo que será más rápido.

Otro aspecto sobre la sentencia de retorno, sería más legible con una Lógica Ternaria como:

return 1 < $count ? true : false;

En resumen, lo hubiera implementado así:

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;
}
18 nov 2015 12:40:14
Comentarios

Solo para tu información, SELECT COUNT(*) y SELECT COUNT(ID) ambos devuelven una sola columna... un conteo.

Cush Cush
13 abr 2019 20:12:42

Esto está bien argumentado y tiene sentido. En realidad todo depende de dónde se ejecute esto. Si es en un lugar donde el usuario ya ha sido obtenido de la base de datos, los datos están en caché, así que el get_userdata no causará problema.

Buzut Buzut
9 jun 2022 12:30:50
0

Si el rendimiento es una preocupación, utiliza:

function user_id_exists($user_id) {
    global $wpdb;

    // Verificar caché:
    if (wp_cache_get($user_id, 'users')) return true;

    // Verificar base de datos:
    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, usa get_userdata($user_id) !== false. La llamada a get_userdata recuperará 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é si tiene éxito.

6 mar 2017 00:24:55
2

Usa 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)){ 
    //existe
} else {
    //no existe
}
17 oct 2014 17:02:09
Comentarios

también puedes usar este método: $user = get_userdata( $user_id ); if ( $user == false ){ //el ID de usuario no existe } else { //el ID de usuario existe

Dan Dan
17 oct 2014 17:27:25

WP ha evolucionado pero esto sigue siendo muy relevante. La respuesta de @Dan es el camino a seguir. Alternativamente, get_user_by('id', $user_id) también funciona perfectamente. En cualquier caso, lanzar una consulta SQL solo para eso es excesivo.

Buzut Buzut
9 jun 2022 12:25:08
1

Algo que hacen algunos hackers (lo sé porque fui víctima de esto al menos una vez) es visitar tu sitio usando 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 nicename del usuario estará en el contenido del sitio web y el apodo también puede aparecer (dependiendo de la salida de las páginas).

En un intento inválido, el sitio irá a la página 404 (o lo que esté configurado para ocurrir en un error de página no encontrada).

Puede ser bastante trivial construir un script usando cURL que pruebe desde, digamos, author=0 hasta author=999 en un tiempo relativamente corto y genere una lista de nombres de usuario. Un hacker hizo esto con uno de mis sitios y luego intentó iniciar sesión en cada usuario usando otra lista de contraseñas populares.

Como puedes imaginar, la primera vez que esto ocurre es un poco aterrador ver que alguien puede descubrir fácilmente todos tus nombres de usuario. Por suerte para mí, las contraseñas fuertes salvaron el día esa vez, estoy seguro de que no todos tienen tanta suerte.

He probado esto en un par de sitios web importantes (que permanecerán anónimos en esta publicación) y parece que puede que no haya nada que nadie pueda hacer hasta ahora para evitar que esto ocurra. Personalmente, creo que es un riesgo de seguridad que WordPress debería solucionar.

ACTUALIZACIÓN:

Aquí en el futuro (principios de 2016) ahora sé que hay métodos/plugins 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.

17 oct 2014 18:39:10
Comentarios

En cualquier caso, necesitas limitar los intentos fallidos de inicio de sesión. Después de 3 a 5 fallos en menos de 5 minutos, puedes bloquear al usuario por un tiempo. Esto realmente ralentizará los ataques de diccionario o fuerza bruta.

Buzut Buzut
9 jun 2022 12:33:48
2

Prueba esto para que no te muestre 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; }
}
12 jun 2015 12:13:06
Comentarios

Puedes simplemente escribir return $count == 1;

fuxia fuxia
12 jun 2015 13:02:14

necesito solo verificar si el usuario existe o no y cuando llamo a la función así:

if(!user_id_exists($userId)){ // hacer cosas cuando el usuario no existe }

Anand Anand
12 jun 2015 13:04:14
0

Esta función que estoy usando no necesariamente cambia cómo se obtiene el conteo de las otras respuestas aquí, simplemente simplifica el retorno como un valor booleano comparando estrictamente el conteo con 1.

/**
 * Determina si un usuario existe basado en su ID de usuario
 *
 * @global wpdb $wpdb Objeto de abstracción de la base de datos de WordPress.
 *
 * @param int $user_id El ID de usuario de WordPress a verificar.
 *
 * @return bool Verdadero si el ID de usuario existe, falso en caso contrario.
 */
function user_id_exists($user_id)
{
    global $wpdb;
    return 1 === (int)$wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users WHERE ID = %d", $user_id));
}
26 mar 2024 15:48:52