如何为匿名用户保存会话数据?


20

在上一个有关Drupal 6的项目中,我确实使用类似于以下代码的代码保存了数据:

$_SESSION['xxx'] = serialize($data);

在Drupal 7中,它不起作用。

我应该如何在Drupal 7中为匿名用户保存会话数据?

Answers:


4

这是因为drupal使用密钥保存会话,这意味着您应该执行以下操作

  $_SESSION['yourkey']['xxx'] = serialize($data);

你可以试试看

function lists_session($key, $value = NULL) {
  global $user;

  static $storage;

  // If the user is anonymous, force a session start.
  if(!user->uid) {
    drupal_session_start();
  }

  if ($value) {
    $storage[$key] = $value;
    $_SESSION['lists'][$key] = $value;   // I use 'lists' in case some other module uses 'type' in $_SESSION
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}

因此,要在会话中保存变量:

lists_session("xxx", serialize($data));

并检索值,只需使用:

$myVar = lists_session("xxx");

就像MOLOT提到的那样,有时会话未针对匿名用户启动,那么您应该drupal_session_start()手动进行。


2

根据docs,这就是您需要做的所有事情。

这意味着存在错误,或者正为匿名用户缓存您的页面,因此未读取会话数据。我会首先检查您的缓存设置。


谢谢。也许这是一个错误。但直到我决定使用它session_api
vitaly.batonov 2011年

@ vitaly.batonov您能详细说明如何使用session_api解决问题吗?
lathomas64

2

Drupal 7有时不会自动为匿名用户启动会话。要使用他们的会议,你可能需要开始与力会议drupal_session_start才能够使用$_SESSION


1
有没有办法告诉Drupal,总是为匿名用户启动会话?

1

通过以下方式保存数据后:

$_SESSION['xxx'] = serialize($data);

需要另一个功能:

drupal_session_start();

由于会话表需要一个id = 0的记录,因此您可以手动插入一个id = 0的记录。


0

在用户表中创建uid = 0的用户,因为drupal始终将uid用于匿名用户

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.