Comment vérifier si un utilisateur existe par un identifiant donné

12

Existe-t-il un moyen de vérifier si un ID utilisateur existe? Je veux créer une fonction similaire à username_exists()mais qui retourne si l'id existe ou non.

Frankolin
la source

Réponses:

2

Utilisez cette fonction:

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

}

Usage:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
Daniel Patilea
la source
5
vous pouvez aussi utiliser cette méthode aussi:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea
31

Je recommanderais fortement la solution beaucoup plus simple de Daniel par rapport à celle actuellement sélectionnée comme correcte:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Jani Uusitalo
la source
J'aime bien celui-ci beaucoup plus que de créer une fonction propre juste pour cela. Dans mon cas, je devais quand même travailler avec les données utilisateur alors ... +1
GDY
S'il existe un tableau d'ID utilisateur et que vous devez supprimer les utilisateurs supprimés / non existants, cela peut être utilisé comme rappel array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv
5

Dans ce cas, je n'utiliserai certainement pas get_userdata ($ user_id) pendant qu'il renvoie un WP_User, il est donc plus gourmand qu'une simple requête personnalisée.

Concernant la requête, j'accepte d'utiliser la méthode prepare, mais le SELECT COUNT (*) signifie que vous renvoyez toutes les colonnes , ce qui est inutile ici.

Je recommanderais d'utiliser SELECT COUNT (ID) unstead, de cette façon, nous ne travaillons que sur une seule colonne qui sera plus rapide.

Sur un autre aspect de la déclaration de retour, elle serait plus lisible avec une logique ternaire comme:

retourner 1 <$ count? vrai faux;

Pour résumer, je l'aurais implémenté comme:

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
la source
Juste pour info SELECT COUNT(*)et les SELECT COUNT(ID)deux renvoient une seule colonne ... un compte.
James Cushing
2

Si les performances sont un problème, utilisez:

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

Sinon, utilisez get_userdata($user_id) !== false. L'appel à get_userdatarécupérera une ligne entière de la base de données au lieu d'une seule valeur, créera un nouvel objet WP_User et le mettra en cache en cas de succès.

le_m
la source
0

Essayez ceci ne vous montrera pas l'avertissement comme l'argument manquant 2 pour 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
la source
Vous pouvez simplement écrirereturn $count == 1;
fuxia
j'ai juste besoin de vérifier que l'utilisateur existe ou non et quand j'appelle la fonction comme: if (! user_id_exists ($ userId)) {// fait des trucs quand l'utilisateur n'existe pas}
Anand
0

Quelque chose qui est fait par au moins quelques pirates (je le sais parce que j'en ai été victime au moins une fois) est de visiter votre site en utilisant ce type d'URL

domain.com/?author=0

domain.com/?author=1

etc.

En cas de succès, la sortie du site aura des données valides, en plus le nom d'utilisateur sera dans le contenu du site Web et le surnom peut également être là (selon la sortie des pages).

En cas de tentative non valide, le site ira à la page 404 (ou tout ce qui devrait se produire sur une page introuvable).

Il peut être assez trivial de créer un script en utilisant cURL qui peut tester de say author = 0 à author = 999 en un temps relativement court et produire une liste de noms d'utilisateurs. J'ai demandé à un pirate de le faire pour l'un de mes sites, puis d'essayer de me connecter à chaque utilisateur en utilisant une autre liste de mots de passe populaires.

Comme vous pouvez l'imaginer la première fois que cela se produit, il est un peu effrayant de voir que quelqu'un peut facilement trouver tous vos noms d'utilisateur. Heureusement pour moi, des mots de passe forts ont sauvé la journée, je suis sûr que tout le monde n'a pas autant de chance.

J'ai testé cela contre quelques sites Web de grands noms (qui resteront sans nom dans ce post) et il semble que personne ne puisse rien faire pour empêcher cela de se produire. Je pense personnellement que la fermeture de wordpress constitue un risque pour la sécurité.

MODIFIER :

Ici à l'avenir (début 2016), je sais maintenant qu'il existe des méthodes / plugins qui peuvent contrecarrer cette attaque d'énumération des utilisateurs. Et j'ai encore changé ma position sur le risque de sécurité de cela et je ne pense plus que WordPress devrait changer cela.

KnightHawk
la source