簡単なログイン関数を作成し、session_set_save_handler を使用してセッション データを管理用にデータベースに保存します。 ここで問題が発生します。最初のユーザーが同じブラウザでログインしたとき、2 番目のユーザーがログインしたときに行うのは正常です。同じブラウザ内に存在できるセッション ID は 1 つだけなので、新しいセッションを作成します
コードは次のとおりです
function open($save_path, $session_name) {
return(true) );
}
function close() {
return(true);
function read($id) {
$sql = "sess_id='$id' のセッションから * を選択"
if ($result = mysql_query($ sql) {
) IF ($ row = MySQL_FETCH_ARAY ($ Result)) {
Return $ row ["session_data"] ITE ($ ID, $sess_data) {
$data_array =explode("username",$); sess_data);
$i = 0;
foreach ($data_array as $data_item){
if($i == 1){
$data_array_sub =explode (""",$data_item);
if($username ! = null && strlen($username ) & gt; 0) {
$ con = mysql_connect ("127.0.0.1", "root", "111111");
mysql_select_db ("session"); ()."',`session_data`='$sess_data' where `username`='$username' and `sess_id`='$id'";
$result = mysql_query($sql);
if ($result= =true) {
を通じて を通じて を通じて を通じて ' s ' ‐ ‐‐‐‐‐‐‐‐ if ($result==true) session set sess_id=' ',session_data='' where sess_id='$id'";
if ($result = mysql_query($sql)) {
}
function gc($maxlifetime) {
$sql = "`セッション` を更新 set sess_id= '',session_data='' where unix_timestamp(now()) -`session_time` > '1800' and LENGTH(sess_id)>1";
$result = mysql_query($sql) ;
if ($result == true) {
echo $sql;
return true; } else {
echo "error"; return false }
}
session_set_save_handler("open", "close", "read", "write", " destroy", "gc");
session_start();
?>
//ファイル名は session_user_start.php です
login.php のコードは
require_once "config/session_user_start.php";
$_SESSION['login'] = 1;
$_SESSION['id_user'] =11;
...login.php のコードは省略されています
問題ありませんそうすることで
ここで問題が発生します。セッション ID が同じであるため、2 番目のユーザーがログインするときに、以前にログインしたセッション データをクリアしたいので、login.php を次のように変更します
require_once "config/session_user_start .php";
session_unset() ;
session_destroy();
require_once "config/session_user_start.php";
$_SESSION['login'] = 1;
$_SESSION['id_user'] =11;
... login.php に続く .code は省略されています
破棄するときは destroy 関数が呼び出されますが、破棄後、login.php が実行を終了して write($id, $sess_data) を呼び出すと
$sess_data の値は空です、そして2 番目のセッション データを書き込むことができません。
session_unset();
session_destroy(); これらの 2 つの文を実行した後、再試行してください
session_set_save_handler("open", "close", "read", "write", "destroy", " gc");
session_start() ;それは不可能ですか? なぜデータを取得できないのですか? 教えてください
session_unset()
は現在メモリ内に作成されているすべての $_SESSION 変数を解放しますが、セッション ファイルを削除せず、対応するセッション ID を解放しません
session_destroy()
現在のユーザーに対応するセッション ファイルを削除し、セッション ID を解放します
メモリ内の $_SESSION 変数の内容は保持されます。破棄されてから session_start() が呼び出された場合、セッション ID の値は変わりません。
require_once "config/session_user_start.php";ロードされているため、後で何度実行しても無効になります session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
sessionidの値を変更するには、session_regenerate_id関数を使用します
そのため、プロセスは次のようにする必要があります
require_once "config /session_user_start.php";
if (yes New user) {
session_regenerate_id();
$_SESSION 割り当て操作
}
通常の検証操作
sessionid が変更されているため、元の sessionid は当然無効になります
gc によってクリーンアップが完了します
require_once "config/session_user_start .php";
一度ロードするとロードされないので、後から何度実行しても無効になります
session_set_save_handler("open", "close", "read ", "write", "destroy", "gc") ;
これは単なるバインディング作業関数であり、特定のデータとは何の関係もありません。何度も実行しても意味がありません
sessionidの値を変更するにはsession_regenerate_id関数を使います
そのため、処理は
require_once "config/session_user_start. php";
if (yes New user?) {
session_regenerate_id();
$_SESSION 割り当て操作
}
通常の検証操作
sessionid が変更されているため、元の sessionid は当然無効になります
gc によってクリーンアップが完了します
ありがとう