注: 例ではデータをエスケープするつもりはありませんが、mysqli または PDO を使用してエスケープする必要があります。
logged_in_users
次のようないくつかの列を持つテーブルなどを作成します。
create table logged_in_users(
user_id int unsigned,
login_date datetime,
hash_key char(32),
unique key user_hash_key(user_id, hash_key)
);
ユーザーがログインしたら、古いレコードを削除してから、次のように新しいメンバーを追加します。
$hash_key = md5(time().uniqid().rand(0,1000)); // Create a unique key
$_SESSION["hashkey"] = $hash_key;
// Remove the inactive members (this uses 10 minutes)
delete from logged_in_users where login_date > date_sub(now(), interval 10 minute);
// Add the user
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');
また、ユーザーがページをロードするときは、ユーザーがまだレコードを持っているかどうかを確認し、気に入らない場合はレコードを挿入する必要があります。
$hash_key = $_SESSION["hashkey"];
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key');
次に、ログインしている人数を知りたい場合は、次のようにします。
// Total people for a particular member
select count(*) as total from logged_in_users where user_id = 123;
// Total people logged in
select count(*) as total from logged_in_users;
// Total members logged in (not people)
select count(distinct user_id) as total from logged_in_users;
最後に、ユーザーがログアウトしたら、次のように削除します。
$hash_key = $_SESSION["hashkey"];
delete from logged_in_users where user_id = 123 and hash_key = '$hash_key';