这是重建给定用户会话的正确方法吗?

时间:2011-11-16 21:52:46

标签: php mysql session session-cookies

我的功能如下:

 $sid = mysql_real_escape_string( $_COOKIE['session_id'] );
if( $sid ) { session_id( $sid ); }

// Start session
if( !session_start() ) { die( 'Session could not be started.' ); }
$sid = session_id();

// Validate session id
 $user = $this->validateSessionId( $sid );

if( $user ) {
    if( !$user['uid'] ) {
        trigger_error( '`Services->__construct()` - Could not find user by session id \''.(string)$sid.'\'.',
                E_USER_ERROR );
    }

    $_SESSION['uid'] = $user['uid'];
    $_SESSION['user_name'] = $user['name'];
    $_SESSION['user_email'] = $user['email'];
    $_SESSION['user_created'] = $user['created'];
}

// If no valid session id, user is anonymous
else {
    $_SESSION['user_name'] = 'Anonymous';
    $_SESSION['user_created'] = time();
}

当用户首次登录时,会为其创建一个名为session_id的cookie,其ID为当前会话。此id也会添加到数据库表中。我的理解是会话最终会在客户端和服务器上到期,但是cookie和数据库条目可以设置为我想要的持续时间。

validateSessionId检查数据库中的会话ID表。如果找到会话,并且最近30天前没有访问过会话(如果是,则从表中删除),来自用户列表的关联数组表示与该会话ID关联的用户。然后将该用户的数据加载到当前会话中。

我是否正确理解了这种情况?

1 个答案:

答案 0 :(得分:1)

可以避免整个session_id()业务。当您调用session_start()时,PHP将自动检查是否存在会话cookie,并在那时检索会话的ID。你只是复制已经为你做的事情。

您的代码假定PHP发送以跟踪会话的cookie实际上是一个永久cookie。通常PHP只发送一个会话cookie(例如,当浏览器关闭时删除)。因此,用户在返回网站时将不会拥有任何会话cookie,并且每次都会获得一个全新的会话。