주어진 ID로 사용자가 존재하는지 확인하는 방법


12

사용자 ID가 있는지 확인하는 방법이 있습니까? 비슷한 기능을 만들고 싶지만 username_exists()id가 존재하는지 여부를 반환합니다.

답변:


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
Daniel Patilea

31

현재 올바른 것으로 선택한 솔루션보다 Daniel의 훨씬 간단한 솔루션 을 강력히 권장 합니다.

$user = get_userdata( $user_id );
if ( $user === false ) {
    //user id does not exist
} else {
    //user id exists
}

나는 이것을 위해 자신의 함수를 만드는 것보다 훨씬 더 좋아합니다. 내 경우에는 어쨌든 userdata로 작업해야했습니다 ... +1
GDY

사용자 ID 배열이 있고 삭제되거나 기존 사용자가 아닌 사용자를 제거해야하는 경우 array_filter 콜백으로 사용할 수 있습니다.$user_ids = array_filter( $user_ids, 'get_userdata' );
Oksana Romaniv

5

이 경우 WP_User를 반환하는 동안 get_userdata ($ user_id) 를 사용하지 않기 때문에 사용자 지정 쿼리보다 더 욕심이 많습니다.

쿼리에 대해서는 준비 메소드를 사용하는 데 동의하지만 SELECT COUNT (*)모든 열을 반환한다는 것을 의미합니다 . 여기서는 쓸모가 없습니다.

대신 SELECT COUNT (ID)를 사용하는 것이 좋습니다 .이 방법으로 더 빠른 단일 열에서만 작업하고 있습니다.

returning statement의 다른 측면에서 다음과 같은 Ternary Logic을 사용하면 더 읽기 쉽습니다.

return 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)둘 다 단일 열을 반환합니다 ... 카운트.
James Cushing

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

wpdb :: prepare ()에 대한 인수 2 누락과 같은 경고가 표시되지 않습니다.

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

기타

시도가 성공적으로 이루어지면, 사이트의 출력에 유효한 데이터가 있으며, 사용자 nicename은 웹 사이트 컨텐츠에 있으며 별명도있을 수 있습니다 (페이지 출력에 따라 다름).

잘못된 시도에서 사이트는 404 페이지로 이동합니다 (또는 페이지를 찾을 수 없음 오류로 설정되어 있음).

cURL을 사용하여 비교적 짧은 시간에 author = 0에서 author = 999까지 테스트하고 사용자 이름 목록을 출력 할 수있는 스크립트를 작성하는 것은 다소 사소한 일입니다. 해커가 내 사이트 중 하나에 대해이 작업을 수행 한 다음 다른 인기있는 암호 목록을 사용하여 각 사용자에게 로그인하려고합니다.

처음 이런 일이 발생한다고 상상할 수 있듯이 누군가가 모든 사용자 이름을 쉽게 찾을 수 있다는 것은 다소 두려운 일입니다. 저에게 행운의 암호는 그날 저축되었습니다. 모두가 그렇게 운이 좋은 것은 아닙니다.

나는이 큰 이름 웹 사이트 (이 게시물에서 이름이없는 채로 있음)에 대해 이것을 테스트했으며 아직이 일을 막기 위해 아무도 할 수있는 일이 없을 것 같습니다. 개인적으로 워드 프레스가 닫히는 것이 보안 위험이라고 생각합니다.

편집 :

앞으로 (2016 년 초)이 사용자 열거 공격을 막을 수있는 메소드 / 플러그인이 있음을 알고 있습니다. 그리고 나는 이것의 보안 위험에 대한 입장을 더 바꾸었고 더 이상 WordPress가 이것을 바꿀 것이라고 생각하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.