2

我正在使用 mysql 数据库来存储用户会话数据。我将用户重定向到另一个服务器,并将会话 ID 作为变量 (GET),然后我需要使用 ID 从数据库中检索会话。

我的远程服务器中使用的代码:

  Yii::app()->session->sessionID = $sessionID;
  Yii::app()->session->open();

结果是会话在没有数据的情况下被覆盖(打开了新会话)。我如何从数据库中检索会话?我需要为表格创建模型还是可以使用 YII 会话功能?

谢谢,丹尼

4

2 回答 2

4

由于CDbHttpSession ,您不必为会话表创建模型relies on PDO to access database

您的会话组件的配置是什么?

您指定会话 ID 并通过调用open()方法手动启动会话。此方法使用 PHP 的session_set_save_handler函数设置会话回调方法。readSession($id)是其中之一,根据手册页:session_set_save_handler

当会话开始或调用 session_start() 时,PHP 会在内部调用此回调。

由于session_start creates a session or resumes the current one您必须在设置会话标识符之前授予该会话不会自动启动。Yii 的会话实例的autoStart属性对此负责,并且必须设置为false(默认为true)。

还必须指定用于检索会话数据的数据库连接的标识符 connectionID 这很重要,否则:

如果未设置,将自动创建和使用 SQLite 数据库。

牢记这一切,我想您的会话组件的配置必须如下所示:

'session' => array(
    'class' => 'CDbHttpSession',
    'autoStart' => false,
    'connectionID' => 'db',
    'sessionTableName' => 'your_session_table_name',
    'autoCreateSessionTable' => false    // for performance reasons
)
于 2013-06-17T22:54:41.617 回答
0

php 使用这个名称( PHPSESSID )将 sessionid 存储在 cookie 中 yii 还将会话 id 存储在浏览器的 cookie 中(因为它使用 php 默认会话)。如果您更改 cookie 中的 PHPSESSID 变量,您将能够更改我们的会话。只是你必须这样做

setcookie('PHPSESSID',$sessionId);// 其中 $sessionId 是您从 db 读取的会话 ID,并且该会话必须存在。

于 2013-06-17T22:58:46.380 回答