Как проверить, существует ли пользователь по данному идентификатору

12

Есть ли способ проверить, существует ли идентификатор пользователя? Я хочу создать функцию, аналогичную, username_exists()но которая возвращает, если идентификатор существует или нет.

Frankolin
источник

Ответы:

2

Используйте эту функцию:

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

}

Использование:

if(user_id_exists(1)){ 
    //it does exists
} else {
    //it doesn't
}
Даниэль Патилея
источник
5
Также вы можете использовать этот метод тоже:$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists
Даниэль Патилея
31

Я очень рекомендую гораздо более простое решение Дэниела по сравнению с тем, которое в настоящее время выбрано как правильное:

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}
Яни Ууситало
источник
Мне это нравится гораздо больше, чем создание собственной функции только для этого. В моем случае мне все равно пришлось поработать с userdata, так что ... +1
GDY
Если существует массив идентификаторов пользователей, и вам нужно удалить удаленных / не существующих пользователей, это можно использовать в качестве обратного вызова array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Оксана Романив
5

В этом случае я определенно не буду использовать get_userdata ($ user_id), когда он возвращает WP_User, поэтому он более жадный, чем просто пользовательский запрос.

Что касается запроса, я согласен с использованием метода prepare, но SELECT COUNT (*) означает, что вы возвращаете все столбцы , что здесь бесполезно.

Я бы порекомендовал использовать SELECT COUNT (ID) unstead, поэтому мы работаем только с одним столбцом, который будет быстрее.

Что касается другого аспекта для возвращаемого оператора, он был бы более читабельным при использовании троичной логики:

вернуть 1 <$ count? правда: ложь;

Подводя итог, я бы реализовал это так:

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;
}
Максим Кулеа
источник
Просто к вашему сведению, SELECT COUNT(*)и SELECT COUNT(ID)оба возвращают один столбец ... количество.
Джеймс Кушинг
2

Если производительность является проблемой, используйте:

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

В противном случае используйте get_userdata($user_id) !== false. Вызов to get_userdataизвлечет целую строку из базы данных вместо одного значения, создаст новый объект WP_User и кеширует его в случае успеха.

le_m
источник
0

Попробуйте это не будет отображать предупреждение как пропущенный аргумент 2 для 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; }
}
Ананд
источник
Можно просто написатьreturn $count == 1;
fuxia
мне нужно просто проверить, существует ли пользователь или нет, и когда я вызываю функцию, например: if (! user_id_exists ($ userId)) {// делать вещи, когда пользователя не существует}
Anand
0

По крайней мере, несколько хакеров (я знаю, потому что я был жертвой этого, по крайней мере, один раз) должен посетить ваш сайт, используя этот тип URL

domain.com/?author=0

domain.com/?author=1

и т.п.

При успешной попытке на выходе сайта будут действительные данные, кроме того, в его содержимом будет указано имя пользователя и псевдоним (в зависимости от вывода страниц).

При недопустимой попытке сайт перейдет на страницу 404 (или что-то еще, что должно произойти на странице не найдена ошибка).

Может быть довольно тривиально создать скрипт с использованием cURL, который может проверить, скажем, от author = 0 до author = 999 за относительно короткий промежуток времени, и вывести список имен пользователей. Я сделал, чтобы хакер сделал это для одного из моих сайтов, а затем попытался войти в систему для каждого пользователя, используя другой список популярных паролей.

Как вы можете себе представить, когда это происходит в первый раз, немного страшно видеть, что кто-то может довольно легко узнать все ваши имена пользователей. К счастью для меня, надежные пароли спасли тот день, я уверен, что не всем так везет.

Я проверил это на нескольких известных веб-сайтах (которые останутся безымянными в этом посте), и кажется, что пока что никто ничего не может сделать, чтобы этого не произошло. Лично я считаю, что WordPress должен закрыть риск для безопасности.

РЕДАКТИРОВАТЬ :

Здесь, в будущем (в начале 2016 года), теперь я знаю, что существуют методы / плагины, которые могут предотвратить эту атаку перечисления пользователей. Кроме того, я изменил свою позицию в отношении угрозы безопасности, и я больше не думаю, что WordPress должен это изменить.

ястреб
источник