2

私の Web サイトではユーザー ログインにセッションを使用しています。各ページに、アカウントにログインしているコンピューターの数をユーザーに示すメッセージを表示したいと考えています (Gmail のように)。

たとえば、2 台の異なるコンピューターにログインしている場合、次のようなメッセージが表示されます。

You are logged in on 2 computers.

彼らがログインしているかどうかを確認する方法を知っています。$_SESSION['username']変数を確認するだけで、変数が設定されていれば、そのコンピューターにログインしています。しかし、他のセッションで同じものが設定されているかどうかを確認するにはどうすればよいですかusername(他のコンピューターにログインしていることを示しています)。

4

4 に答える 4

2

セッションデータをデータベースに保存したいと思うでしょう。同じ ID を持つ複数のユーザーが存在する場合は、データベースにクエリを実行できます。

于 2013-07-29T17:45:15.057 に答える
2

デフォルトのファイルベースの PHP セッションでは、これを行うのは非常に困難です。デフォルトでは、PHP はファイル システム内のファイルの不透明な BLOB にセッション情報を格納するだけで、ファイルの名前がセッション ID になります。これらのファイルを 1 つずつ開いて評価しない限り、これらのファイルのデータに直接アクセスすることはできません。

必要なのは、その情報をデータベースに移動することです。同時ログイン数のみをデータベースに保存し、他のセッションをそのまま維持することもできますが、同期を維持するのは困難です。ファイル ベースのストレージの代わりに、セッション用の完全なデータベース バックエンドに切り替えることをお勧めします。これにより、ユーザーのセッション数に関する統計情報を簡単に取得するなど、セッション内のデータを透過的にクエリできます。

于 2013-07-29T17:46:41.640 に答える
1

注: 例ではデータをエスケープするつもりはありませんが、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';
于 2013-07-29T18:01:49.567 に答える
0

ユーザー テーブルにログイン カウント用の追加の列を作成するだけです。ユーザーがサーバーにログインすると、列が1カウント増加し、ユーザーがログオフすると1カウント減少します...

ちなみに、セッションはブラウザごとに作成されます..セッションから他のセッション変数にアクセスすることはできません

于 2013-07-29T17:47:34.280 に答える