Як перевірити, чи існує користувач за заданим ідентифікатором


12

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

Відповіді:


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
}

Мені це подобається набагато більше, ніж створити власну функцію саме для цього. У моєму випадку мені довелося працювати з даними користувача, так що ... +1
GDY

Якщо є масив ідентифікаторів користувачів і вам потрібно видалити видалені / неіснуючі користувачі, це може використовуватися як зворотний виклик array_filter:$user_ids = array_filter( $user_ids, 'get_userdata' );
Оксана Романів

5

У цьому випадку я точно не буду використовувати get_userdata ($ user_id), поки він повертає WP_User, тому він є більш жадібним, ніж просто спеціальний запит.

Щодо запиту, я погоджуюся використовувати метод підготовки, але SELECT COUNT (*) означає, що ви повертаєте всі стовпці , що тут марно.

Я рекомендую використовувати SELECT COUNT (ID) unstead, таким чином ми працюємо лише над однією колоною, яка буде швидшою.

В іншому аспекті повернення, яке було б повернено, було б легше читати за допомогою Ternary Logic, як:

повернути 1 <$ кол? правда: хибна;

Підводячи підсумок, я би реалізував це так:

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

Просто FYI 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. Заклик до get_userdataотримає цілий рядок із бази даних замість одного значення, створить новий об'єкт WP_User і кешуватиме його на успіх.


0

Спробуйте це не показуватиме вам попередження, як-от пропущений аргумент 2 для wpdb :: ready ()

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

тощо.

Після успішної спроби у виводу на сайт будуть дійсні дані, крім того, ім’я користувача nice буде містити вміст веб-сайту, а псевдонім також може бути там (залежно від виводу сторінок).

У разі недійсної спроби сайт перейде на сторінку 404 (або все, що встановлено для того, що на сторінці не знайдена помилка).

Створити сценарій за допомогою cURL можна досить тривіально, за порівняно короткий проміжок часу можна перевірити від скажучого автора = 0 до автора = 999 та вивести список імен користувачів. У мене був хакер зробити це для одного зі своїх сайтів, а потім спробувати увійти до кожного користувача, використовуючи інший список популярних паролів.

Як ви можете собі уявити, коли вперше це трапляється, трохи страшно бачити, що хтось може досить легко дізнатися всі ваші імена користувачів. Пощастило для мене міцними паролями врятував день того часу, я впевнений, що не всім так пощастило.

Я перевірив це на кількох веб-сайтах з великими іменами (які залишаться безіменними на цій посаді), і, здається, ніхто не може зробити нічого, поки не зупинить цього. Я особисто думаю, що ризик для безпеки Wordpress повинен закритися.

Редагувати :

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.