So überprüfen Sie, ob ein Benutzer anhand einer bestimmten ID vorhanden ist

12

Gibt es eine Möglichkeit zu überprüfen, ob eine Benutzer-ID vorhanden ist? Ich möchte eine ähnliche Funktion erstellen, die username_exists()jedoch zurückgibt, ob die ID vorhanden ist oder nicht.

Frankolin
quelle

Antworten:

2

Verwenden Sie diese Funktion:

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

}

Verwendung:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
Daniel Patilea
quelle
5
Sie können auch diese Methode auch verwenden:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Daniel Patilea
31

Ich würde Daniels viel einfachere Lösung wärmstens empfehlen als die derzeit als richtig ausgewählte:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Jani Uusitalo
quelle
Ich mag diese weit mehr als nur eine eigene Funktion dafür zu erstellen. In meinem Fall musste ich sowieso mit den Benutzerdaten arbeiten, also… +1
GDY
Wenn es ein Array von Benutzer-IDs gibt und Sie die gelöschten / nicht vorhandenen Benutzer entfernen müssen, kann dies als Rückruf für array_filter verwendet werden:$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv
5

In diesem Fall werde ich get_userdata ($ user_id) definitiv nicht verwenden, während es einen WP_User zurückgibt, daher ist es gieriger als nur eine benutzerdefinierte Abfrage.

In Bezug auf die Abfrage stimme ich der Verwendung der Vorbereitungsmethode zu, aber SELECT COUNT (*) bedeutet, dass Sie alle Spalten zurückgeben , was hier unbrauchbar ist.

Ich würde empfehlen, SELECT COUNT (ID) unstead zu verwenden. Auf diese Weise arbeiten wir nur an einer einzelnen Spalte, die schneller ist.

Ein anderer Aspekt für die zurückgebende Anweisung wäre mit einer ternären Logik wie: besser lesbar.

return 1 <$ count? wahr falsch;

Zusammenfassend hätte ich es wie folgt implementiert:

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
quelle
Nur zu Ihrer Information SELECT COUNT(*)und SELECT COUNT(ID)beide geben eine einzelne Spalte zurück ... eine Zählung.
James Cushing
2

Wenn die Leistung ein Problem darstellt, verwenden Sie:

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

Andernfalls verwenden Sie get_userdata($user_id) !== false. Der Aufruf von get_userdataruft anstelle eines einzelnen Werts eine ganze Zeile aus der Datenbank ab, erstellt ein neues WP_User-Objekt und speichert es bei Erfolg zwischen.

le_m
quelle
0

Versuchen Sie Dies zeigt Ihnen nicht die Warnung wie Fehlendes Argument 2 für 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
quelle
Sie können einfach schreibenreturn $count == 1;
fuxia
Ich muss nur überprüfen, ob der Benutzer existiert oder nicht und wenn ich die Funktion aufrufe wie folgt: if (! user_id_exists ($ userId)) {// Sachen machen, wenn der Benutzer nicht existiert}
Anand
0

Etwas, das von mindestens ein paar Hackern getan wird (ich weiß, weil ich mindestens einmal Opfer davon geworden bin), ist, Ihre Website unter Verwendung dieser Art von URL zu besuchen

domain.com/?author=0

domain.com/?author=1

etc.

Bei einem erfolgreichen Versuch enthält die Ausgabe der Website gültige Daten. Außerdem befindet sich der Benutzername im Inhalt der Website und möglicherweise auch der Spitzname (abhängig von der Ausgabe der Seite).

Bei einem ungültigen Versuch wechselt die Site zur 404-Seite (oder was auch immer auf einer Seite passiert ist, die nicht gefunden wurde).

Es kann ziemlich trivial sein, ein Skript mit cURL zu erstellen, das in relativ kurzer Zeit von beispielsweise author = 0 bis author = 999 testen und eine Liste von Benutzernamen ausgeben kann. Ich ließ dies von einem Hacker für eine meiner Websites ausführen und versuchte dann, mich bei jedem Benutzer mit einer anderen Liste beliebter Kennwörter anzumelden.

Wie Sie sich vorstellen können, ist es ein bisschen beängstigend zu sehen, dass jemand ganz einfach alle Ihre Benutzernamen herausfinden kann. Zum Glück haben mir starke Passwörter den Tag gerettet, ich bin sicher, nicht jeder hat so viel Glück.

Ich habe dies gegen ein paar bekannte Websites getestet (die in diesem Beitrag namenlos bleiben werden), und es scheint, dass noch niemand etwas tun kann, um dies zu verhindern. Ich persönlich denke, es ist ein Sicherheitsrisiko, dass WordPress geschlossen wird.

EDIT :

Hier in der Zukunft (Anfang 2016) weiß ich jetzt, dass es Methoden / Plugins gibt, die diesen Angriff auf die Benutzeraufzählung vereiteln können. Und ich habe meine Haltung zum Sicherheitsrisiko weiter geändert und ich denke nicht mehr, dass WordPress dies ändern sollte.

KnightHawk
quelle