Come verificare se esiste un utente per un determinato ID


12

Esiste un modo per verificare se esiste un ID utente? Voglio creare una funzione simile a username_exists()ma che ritorna se l'id esiste o no.

Risposte:


2

Usa questa funzione:

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
}

5
inoltre puoi usare anche questo metodo:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea,

31

Consiglio vivamente la soluzione molto più semplice di Daniel rispetto a quella attualmente selezionata come corretta:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}

Mi piace molto di più che creare una propria funzione proprio per questo. Nel mio caso, ho dovuto lavorare comunque con i dati utente, quindi ... +1
GDY

Se esiste una matrice di ID utente e devi rimuovere gli utenti eliminati / non esistenti, questo può essere usato come callback array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv

5

In questo caso non userò sicuramente get_userdata ($ user_id) mentre restituisce un WP_User, quindi è più avido di una semplice query personalizzata.

Per quanto riguarda la query, accetto l'utilizzo del metodo di preparazione, ma SELECT COUNT (*) indica che stai restituendo tutte le colonne , il che è inutile qui.

Consiglierei di utilizzare SELECT COUNT (ID) nonstead, in questo modo stiamo lavorando solo su una singola colonna che sarà più veloce.

Su un altro aspetto della dichiarazione di ritorno, sarebbe più leggibile con una logica ternaria come:

restituisce 1 <$ count? vero falso;

Per riassumere, l'avrei implementato come:

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

Cordiali saluti SELECT COUNT(*)ed SELECT COUNT(ID)entrambi restituiscono una singola colonna ... un conteggio.
James Cushing,

2

Se le prestazioni sono un problema, utilizzare:

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

Altrimenti, usa get_userdata($user_id) !== false. La chiamata a get_userdatarecupererà un'intera riga dal database anziché un singolo valore, creerà un nuovo oggetto WP_User e lo memorizzerà nella cache in caso di successo.


0

Prova Questo non ti mostrerà un avviso come Argomento mancante 2 per wpdb :: prepar ()

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

Puoi semplicemente scriverereturn $count == 1;
fuxia

ho solo bisogno di verificare se l'utente esiste o meno e quando chiamo la funzione come: if (! user_id_exists ($ userId)) {// fai cose quando l'utente non esiste}
Anand,

0

Qualcosa che viene fatto da almeno alcuni hacker (lo so perché l'ho giocato almeno una volta) è visitare il tuo sito usando questo tipo di URL

domain.com/?author=0

domain.com/?author=1

eccetera.

In caso di esito positivo, l'output del sito avrà dati validi, inoltre il nome utente verrà inserito nel contenuto del sito Web e il nickname potrebbe anche essere presente (a seconda dell'output delle pagine).

In caso di tentativo non valido, il sito passerà alla pagina 404 (o qualsiasi cosa sia impostata per accadere in una pagina non trovata errore).

Può essere piuttosto banale costruire uno script usando cURL che può testare da say autore = 0 fino a autore = 999 in un tempo relativamente breve e generare un elenco di nomi utente. Ho fatto fare a un hacker questo per uno dei miei siti e poi ho provato ad accedere a ciascun utente usando un altro elenco di password popolari.

Come puoi immaginare la prima volta che succede, è un po 'spaventoso vedere che qualcuno può facilmente scoprire tutti i tuoi nomi utente. Fortunatamente per me password sicure salvate quel giorno, sono sicuro che non tutti sono così fortunati.

Ho testato questo su un paio di siti Web di grandi nomi (che rimarranno senza nome in questo post) e sembra che potrebbe non esserci ancora niente che nessuno possa fare per impedire che ciò accada. Personalmente penso che sia il rischio per la sicurezza che WordPress dovrebbe chiudere.

MODIFICA :

Qui in futuro (inizio 2016) ora so che ci sono metodi / plugin che possono contrastare questo attacco di enumerazione utente. E ho ulteriormente cambiato la mia posizione sul rischio per la sicurezza di questo e non penso più che WordPress dovrebbe cambiare questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.