Câu trả lời:
Sử dụng chức năng này:
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; }
}
Sử dụng:
if(user_id_exists(1)){
//it does exists
} else {
//it doesn't
}
Tôi rất muốn giới thiệu giải pháp đơn giản hơn nhiều của Daniel so với giải pháp hiện được chọn là chính xác:
$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' );
Trong trường hợp này, tôi chắc chắn sẽ không sử dụng get_userdata ($ user_id) trong khi nó đang trả về WP_User, vì vậy nó tham lam hơn là chỉ truy vấn tùy chỉnh.
Về truy vấn, tôi đồng ý sử dụng phương thức chuẩn bị, nhưng CHỌN COUNT (*) có nghĩa là bạn đang trả về tất cả các cột , điều này là vô ích ở đây.
Tôi khuyên bạn nên sử dụng CHỌN CHỌN (ID) không ổn định, theo cách này, chúng tôi chỉ làm việc trên một cột duy nhất sẽ nhanh hơn.
Ở khía cạnh khác cho câu lệnh trả về, nó sẽ dễ đọc hơn với Logic Ternary như:
trả lại 1 <$? đúng sai;
Tóm lại, tôi wouldd đã thực hiện nó như sau:
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(*)
và SELECT COUNT(ID)
cả hai trả về một cột duy nhất ... một số đếm.
Nếu hiệu suất là một mối quan tâm, sử dụng:
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;
}
Nếu không, sử dụng get_userdata($user_id) !== false
. Cuộc gọi đến get_userdata
sẽ lấy toàn bộ một hàng từ cơ sở dữ liệu thay vì một giá trị duy nhất, tạo một đối tượng WP_User mới và lưu trữ thành công.
Hãy thử Điều này sẽ không hiển thị cho bạn cảnh báo như Thiếu đối số 2 cho 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;
Một cái gì đó được thực hiện bởi ít nhất một vài tin tặc (tôi biết vì tôi đã chơi nạn nhân này ít nhất một lần) là truy cập trang web của bạn bằng loại URL này
domain.com/?author=0
domain.com/?author=1
Vân vân.
Khi thử thành công, đầu ra của trang sẽ có dữ liệu hợp lệ, ngoài ra tên người dùng sẽ có trong nội dung của trang web và biệt danh cũng có thể ở đó (tùy thuộc vào đầu ra của trang).
Khi thử không hợp lệ, trang web sẽ chuyển đến trang 404 (hoặc bất cứ điều gì được đặt xảy ra trên một trang không tìm thấy lỗi).
Việc xây dựng một tập lệnh bằng cURL có thể khá đơn giản, có thể kiểm tra từ say Author = 0 cho đến tác giả = 999 trong một khoảng thời gian tương đối ngắn và đưa ra danh sách tên người dùng. Tôi đã có một hacker làm điều này cho một trong các trang web của tôi và sau đó cố gắng đăng nhập vào mỗi người dùng bằng cách sử dụng một danh sách mật khẩu phổ biến khác.
Như bạn có thể tưởng tượng lần đầu tiên điều này xảy ra, thật đáng sợ khi thấy rằng ai đó có thể dễ dàng tìm ra tất cả tên người dùng của bạn. May mắn cho tôi mật khẩu mạnh đã lưu vào ngày hôm đó, tôi chắc chắn không phải ai cũng may mắn như vậy.
Tôi đã thử nghiệm điều này với một vài trang web tên tuổi lớn (những người sẽ vẫn không tên trong bài đăng này) và dường như có thể không có ai có thể làm gì để ngăn chặn điều này xảy ra. Cá nhân tôi nghĩ rằng đó là rủi ro bảo mật mà wordpress nên đóng.
CHỈNH SỬA :
Ở đây trong tương lai (đầu năm 2016) bây giờ tôi biết rằng có các phương thức / plugin có thể ngăn chặn cuộc tấn công liệt kê của người dùng này. Và tôi đã thay đổi quan điểm của mình về rủi ro bảo mật của điều này và tôi không còn nghĩ rằng WordPress nên thay đổi điều này.
$user = get_userdata( $user_id ); if ( $user == false ){ //user id does not exist } else { //user id exists