Cum să verifici dacă un utilizator există după un ID dat

17 oct. 2014, 16:59:39
Vizualizări: 42.1K
Voturi: 16

Există vreo modalitate de a verifica dacă un ID de utilizator există? Vreau să creez o funcție similară cu username_exists() dar care să returneze dacă ID-ul există sau nu.

0
Toate răspunsurile la întrebare 7
2
47

Aș recomanda cu mare încredere soluția mult mai simplă a lui Daniel în locul celei selectate în prezent ca fiind corectă:

$user = get_userdata( $user_id );
if ( $user === false ) {
    // ID-ul utilizatorului nu există
} else {
    // ID-ul utilizatorului există
}
4 mar. 2015 17:38:19
Comentarii

Îmi place această soluție mult mai mult decât crearea unei funcții separate doar pentru asta. În cazul meu, trebuia să lucrez cu datele utilizatorului oricum, așa că... +1

GDY GDY
29 mar. 2018 20:10:31

Dacă există un array de ID-uri de utilizatori și trebuie să eliminați utilizatorii șterși/inexistenți, aceasta poate fi folosită ca callback pentru array_filter: $user_ids = array_filter( $user_ids, 'get_userdata' );

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

În acest caz, cu siguranță nu voi folosi get_userdata( $user_id ) deoarece returnează un obiect WP_User, fiind astfel mai greedy decât un query personalizat.

Referitor la interogare, sunt de acord cu utilizarea metodei prepare, dar SELECT COUNT(*) înseamnă că returnezi toate coloanele, ceea ce este inutil aici.

Aș recomanda să folosești SELECT COUNT(ID) în schimb, astfel lucrăm doar cu o singură coloană, ceea ce va fi mai rapid.

Un alt aspect legat de instrucțiunea de returnare, ar fi mai lizibilă cu o logică ternară precum:

return 1 < $count ? true : false;

Pentru a rezuma, aș fi implementat astfel:

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
Comentarii

Doar pentru informație, atât SELECT COUNT(*) cât și SELECT COUNT(ID) returnează o singură coloană... un număr.

Cush Cush
13 apr. 2019 20:12:42

Acest argument este bine structurat și are logică. De fapt, totul depinde de locul în care este executat. Dacă este într-un loc unde utilizatorul a fost deja preluat din baza de date, datele sunt stocate în cache, astfel încât get_userdata nu va afecta performanța.

Buzut Buzut
9 iun. 2022 12:30:50
0

Dacă performanța este o preocupare, folosiți:

function user_id_exists($user_id) {
    global $wpdb;

    // Verifică cache-ul:
    if (wp_cache_get($user_id, 'users')) return true;

    // Verifică baza de date:
    if ($wpdb->get_var($wpdb->prepare("SELECT EXISTS (SELECT 1 FROM $wpdb->users WHERE ID = %d)", $user_id))) return true;

    return false;
}

În caz contrar, folosiți get_userdata($user_id) !== false. Apelul către get_userdata va prelua un întreg rând din baza de date în loc de o singură valoare, va crea un nou obiect WP_User și îl va stoca în cache în caz de succes.

6 mar. 2017 00:24:55
2

Folosește această funcție:

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

}

Utilizare:

if(user_id_exists(1)){ 
    //există
} else {
    //nu există
}
17 oct. 2014 17:02:09
Comentarii

de asemenea, poți folosi și această metodă: $user = get_userdata( $user_id ); if ( $user == false ){ // ID-ul utilizatorului nu există } else { // ID-ul utilizatorului există

Dan Dan
17 oct. 2014 17:27:25

WP a evoluat, dar acest lucru este încă foarte relevant. Răspunsul lui @Dan este soluția recomandată. Alternativ, get_user_by('id', $user_id) funcționează la fel de bine. În orice caz, a executa o interogare SQL doar pentru asta este exagerat.

Buzut Buzut
9 iun. 2022 12:25:08
1

Ceva ce este făcut de cel puțin câțiva hackeri (știu pentru că am fost victima acestui lucru cel puțin o dată) este să viziteze site-ul tău folosind acest tip de URL:

domain.com/?author=0

domain.com/?author=1

etc.

La o încercare reușită, site-ul va afișa date valide, iar numele utilizatorului (user nicename) va fi în conținutul site-ului, iar porecla (nickname) poate fi de asemenea prezentă (în funcție de conținutul paginii).

La o încercare invalidă, site-ul va merge la pagina 404 (sau orice este setat să se întâmple în cazul unei erori de pagină negăsită).

Poate fi destul de simplu să construiești un script folosind cURL care să testeze de la, să zicem, author=0 până la author=999 într-un timp relativ scurt și să afișeze o listă de nume de utilizatori. Am avut un hacker care a făcut asta pentru unul dintre site-urile mele și apoi a încercat să se autentifice la fiecare utilizator folosind o altă listă de parole populare.

După cum vă puteți imagina, prima dată când se întâmplă acest lucru este puțin înfricoșător să vezi că cineva poate afla destul de ușor toate numele de utilizatori. Din fericire pentru mine, parolele puternice m-au salvat de data aceea, sunt sigur că nu toată lumea are aceeași noroc.

Am testat acest lucru pe câteva site-uri mari (pe care nu le voi numi în acest post) și se pare că poate nu există nimic ce poate fi făcut până acum pentru a opri acest lucru. Personal, cred că este un risc de securitate pe care WordPress ar trebui să-l rezolve.

EDIT:

Aici, în viitor (începutul anului 2016), știu acum că există metode/plugin-uri care pot împiedica acest atac de enumerare a utilizatorilor. Și, în plus, mi-am schimbat părerea cu privire la riscul de securitate al acestui lucru și nu mai cred că WordPress ar trebui să schimbe asta.

17 oct. 2014 18:39:10
Comentarii

În orice caz, trebuie să limitezi încercările eșuate de autentificare. După 3 până la 5 eșecuri în mai puțin de 5 minute, poți bloca utilizatorul pentru o anumită perioadă. Acest lucru va încetini semnificativ atacurile de tip dicționar sau brute force.

Buzut Buzut
9 iun. 2022 12:33:48
2

Încearcă acest lucru și nu vei primi avertismentul precum Lipsă argumentul 2 pentru 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 iun. 2015 12:13:06
Comentarii

Poți să scrii simplu return $count == 1;

fuxia fuxia
12 iun. 2015 13:02:14

Trebuie doar să verific dacă utilizatorul există sau nu și când apelez funcția astfel:

if(!user_id_exists($userId)){ // fac acțiuni când utilizatorul nu există }

Anand Anand
12 iun. 2015 13:04:14
0

Această funcție pe care o folosesc nu schimbă neapărat modul în care numărul este obținut față de celelalte răspunsuri de aici, ci doar simplifică returnarea ca o valoare booleană prin compararea strictă a numărului cu 1.

/**
 * Determină dacă un utilizator există pe baza ID-ului de utilizator
 *
 * @global wpdb $wpdb Obiectul de abstractizare a bazei de date WordPress.
 *
 * @param int $user_id ID-ul WordPress al utilizatorului de verificat.
 *
 * @return bool True dacă ID-ul utilizatorului există, false în caz contrar.
 */
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