Ответы:
Используйте эту функцию:
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
}
Я очень рекомендую гораздо более простое решение Дэниела по сравнению с тем, которое в настоящее время выбрано как правильное:
$user = get_userdata( $user_id );
if ( $user === false ) {
//user id does not exist
} else {
//user id exists
}
$user_ids = array_filter( $user_ids, 'get_userdata' );
В этом случае я определенно не буду использовать 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)
оба возвращают один столбец ... количество.
Если производительность является проблемой, используйте:
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 и кеширует его в случае успеха.
Попробуйте это не будет отображать предупреждение как пропущенный аргумент 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;
По крайней мере, несколько хакеров (я знаю, потому что я был жертвой этого, по крайней мере, один раз) должен посетить ваш сайт, используя этот тип URL
domain.com/?author=0
domain.com/?author=1
и т.п.
При успешной попытке на выходе сайта будут действительные данные, кроме того, в его содержимом будет указано имя пользователя и псевдоним (в зависимости от вывода страниц).
При недопустимой попытке сайт перейдет на страницу 404 (или что-то еще, что должно произойти на странице не найдена ошибка).
Может быть довольно тривиально создать скрипт с использованием cURL, который может проверить, скажем, от author = 0 до author = 999 за относительно короткий промежуток времени, и вывести список имен пользователей. Я сделал, чтобы хакер сделал это для одного из моих сайтов, а затем попытался войти в систему для каждого пользователя, используя другой список популярных паролей.
Как вы можете себе представить, когда это происходит в первый раз, немного страшно видеть, что кто-то может довольно легко узнать все ваши имена пользователей. К счастью для меня, надежные пароли спасли тот день, я уверен, что не всем так везет.
Я проверил это на нескольких известных веб-сайтах (которые останутся безымянными в этом посте), и кажется, что пока что никто ничего не может сделать, чтобы этого не произошло. Лично я считаю, что WordPress должен закрыть риск для безопасности.
РЕДАКТИРОВАТЬ :
Здесь, в будущем (в начале 2016 года), теперь я знаю, что существуют методы / плагины, которые могут предотвратить эту атаку перечисления пользователей. Кроме того, я изменил свою позицию в отношении угрозы безопасности, и я больше не думаю, что WordPress должен это изменить.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists