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

17 окт. 2014 г., 16:59:39
Просмотры: 42.1K
Голосов: 16

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

0
Все ответы на вопрос 7
2
47

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

$user = get_userdata( $user_id );
if ( $user === false ) {
    // ID пользователя не существует
} else {
    // ID пользователя существует
}
4 мар. 2015 г. 17:38:19
Комментарии

Мне этот вариант нравится гораздо больше, чем создание отдельной функции только для этого. В моём случае всё равно приходилось работать с userdata, так что… +1

GDY GDY
29 мар. 2018 г. 20:10:31

Если есть массив ID пользователей и нужно удалить удалённых/несуществующих пользователей, можно использовать это как callback для array_filter: $user_ids = array_filter( $user_ids, 'get_userdata' );

Oksana Romaniv Oksana Romaniv
2 окт. 2019 г. 20:55:27
2

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

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

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

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

return 1 < $count ? true : false;

Подводя итог, я бы реализовал это следующим образом:

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 нояб. 2015 г. 12:40:14
Комментарии

Просто к сведению: SELECT COUNT(*) и SELECT COUNT(ID) оба возвращают один столбец... количество.

Cush Cush
13 апр. 2019 г. 20:12:42

Это хорошо аргументировано и имеет смысл. На самом деле всё зависит от места выполнения. Если это где-то, где пользователь уже был извлечён из БД, данные кэшируются, поэтому get_userdata не навредит.

Buzut Buzut
9 июн. 2022 г. 12:30:50
0

Если важна производительность, используйте:

function user_id_exists($user_id) {
    global $wpdb;

    // Проверка кеша:
    if (wp_cache_get($user_id, 'users')) return true;

    // Проверка базы данных:
    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. Вызов get_userdata извлечёт всю строку из базы данных вместо одного значения, создаст новый объект WP_User и закеширует его при успешном выполнении.

6 мар. 2017 г. 00:24:55
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)){ 
    //пользователь существует
} else {
    //пользователя не существует
}
17 окт. 2014 г. 17:02:09
Комментарии

также можно использовать этот метод: $user = get_userdata( $user_id ); if ( $user == false ){ // пользователь с таким ID не существует } else { // пользователь с таким ID существует

Dan Dan
17 окт. 2014 г. 17:27:25

WP эволюционировал, но это по-прежнему актуально. Ответ @Dan — правильный путь. Альтернативно, get_user_by('id', $user_id) тоже отлично работает. В любом случае, использовать SQL-запрос только для этого — излишне.

Buzut Buzut
9 июн. 2022 г. 12:25:08
1

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

domain.com/?author=0

domain.com/?author=1

и так далее.

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

При неудачной попытке сайт перейдет на страницу 404 (или ту, что настроена для ошибки "страница не найдена").

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

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

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

ОБНОВЛЕНИЕ:

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

17 окт. 2014 г. 18:39:10
Комментарии

В любом случае, необходимо ограничивать количество неудачных попыток входа. После 3-5 неудачных попыток за менее чем 5 минут, можно заблокировать пользователя на некоторое время. Это значительно замедлит атаки по словарю или методом грубой силы.

Buzut Buzut
9 июн. 2022 г. 12:33:48
2

Попробуйте этот вариант, чтобы избежать предупреждения "Missing argument 2 for 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 июн. 2015 г. 12:13:06
Комментарии

Вы можете просто написать return $count == 1;

fuxia fuxia
12 июн. 2015 г. 13:02:14

мне нужно просто проверить, существует пользователь или нет, и когда я вызываю функцию вот так:

if(!user_id_exists($userId)){ // выполнить действия, если пользователь не существует }

Anand Anand
12 июн. 2015 г. 13:04:14
0

Эта функция, которую я использую, не обязательно меняет способ получения количества из других ответов здесь, она просто упрощает возвращаемое значение до булевого, строго сравнивая количество с 1.

/**
 * Определяет, существует ли пользователь по его идентификатору
 *
 * @global wpdb $wpdb Объект абстракции базы данных WordPress.
 *
 * @param int $user_id Идентификатор пользователя WordPress для проверки.
 *
 * @return bool True, если пользователь с указанным ID существует, иначе false.
 */
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 мар. 2024 г. 15:48:52