特定の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
ダニエルPatilea

31

現在正しいと選択されているソリューションよりも、Danielのはるかに単純なソリューションを強くお勧めします。

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

これのために独自の関数を作成するよりも、これが好きです。私の場合、とにかく
ユーザー

そこにユーザーIDの配列であり、あなたが削除した/存在しないユーザーを削除する必要がある場合は、これはarray_filterコールバックとして使用することができます:$user_ids = array_filter( $user_ids, 'get_userdata' );
オクサナRomaniv

5

この場合、WP_Userを返している間はget_userdata($ user_id)を使用しないので、カスタムクエリよりも貪欲です。

クエリについては、prepareメソッドの使用に同意しますが、SELECT COUNT(*)すべての列を返すことを意味しますが、ここでは役に立ちません。

SELECT COUNT(ID)を代わりに使用することをお勧めします。この方法では、より高速になる単一の列のみを処理します。

returnステートメントの他の側面では、次のようなTernary Logicを使用するとより読みやすくなります。

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)両方とも1つの列を返します...カウント。
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

私はちょうど、ユーザーが存在かどうかをチェックする必要があると私は次のように関数を呼び出すとき:もし{//行う詰め込むユーザーはいない存在する場合}(user_id_exists($ USERID)!)
アナンド

0

少なくとも数人のハッカー(私はこれの被害者を少なくとも1度はプレイしたので知っています)によって行われることは、このタイプのURLを使用してサイトにアクセスすることです

domain.com/?author=0

domain.com/?author=1

成功すると、サイトの出力には有効なデータが含まれます。さらに、ユーザーnicenameがWebサイトのコンテンツに含まれ、ニックネームもそこに表示される場合があります(ページの出力によって異なります)。

無効な試みが行われると、サイトは404ページ(または、ページが見つからないというエラーで発生するように設定されているもの)に移動します。

cURLを使用して、比較的短い時間で、たとえばauthor = 0からauthor = 999までをテストし、ユーザー名のリストを出力できるスクリプトを作成するのは簡単です。私のサイトの1つでハッカーにこれを実行させ、人気のあるパスワードの別のリストを使用して各ユーザーにログインしてみました。

これが最初に起こることを想像できるように、誰かがあなたのすべてのユーザー名を非常に簡単に見つけることができるのを見るのは少し怖いです。私にとって幸運なことに、その日は強力なパスワードを保存できました。誰もがそんなに幸運であるとは限りません。

私はこれをいくつかの有名なWebサイト(この投稿では名前のないままです)に対してテストしましたが、これを防ぐために今のところ誰もできることはないようです。私は個人的に、ワードプレスが閉じるべきセキュリティ上のリスクだと思います。

編集

ここ(2016年初頭)には、このユーザー列挙攻撃を阻止できるメソッド/プラグインがあることがわかりました。そして、これのセキュリティリスクに対する私のスタンスをさらに変更しました。WordPressがこれを変更する必要はもうないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.