【问题标题】:Joomla 1.5.25 JSession set not writing to db on close after upgrade from 1.5.23从 1.5.23 升级后,Joomla 1.5.25 JSession 设置不写入数据库
【发布时间】:2012-03-05 07:46:19
【问题描述】:

Joomla 1.5.25 刚刚从 1.5.23 升级,在保存到会话和持久性方面存在问题,在 1.5.23 上完美运行,但是使用 JSession->set 时会话数据没有保存到数据库中

在 joomla 之上编写自定义应用程序,管理从旧系统导入的用户不能为此​​使用 joomla 用户(或者至少我没有而且我没有时间),登录工作如下:

  1. 用户发布电子邮件通行证
  2. 应用检查用户是否存在
  3. 如果用户存在,我将用户对象保存到会话中
  4. 将用户重定向到资源

这里是保存用户到会话的 sn-p

$session   = JFactory::getSession();
$session->set('appUserData', array(
    'data' => $USER_OBJECT,
    'timestamp' => time(),
    'role' => 0,
    'permits' => $permits
);, "custom_namespace");

现在,由于我在 joomla 范围之外执行此操作,所以我必须加强

define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define('JPATH_BASE', dirname(dirname(__FILE__)));

require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');

一旦我做 $session->set() 如果我在同一个脚本上尝试 $session->get() 它确实会提取我刚刚保存的全部资源,但是如果我尝试从另一个脚本中提取 $session 我一无所获,这是另一个脚本

<?php 
error_reporting(E_ALL);
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define('JPATH_BASE', dirname(dirname(__FILE__)));

require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');

$mainframe = JFactory::getApplication('site');
$session   = JFactory::getSession();

echo "<pre>";
print_r($_COOKIE);
print_r($session);
print_r($_SESSION);
echo "</pre>";
exit;

这里我只得到我的cookies数组和带有默认会话信息的会话数组:

Array
(
    [__default] => Array
        (
            [session.counter] => 3
            [session.timer.start] => 1329168055
            [session.timer.last] => 1329168057
            [session.timer.now] => 1329168062
            [session.client.browser] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 FirePHP/0.7.0
        )

)

数据库永远不会用我新创建的会话变量的内容进行更新,我尝试在写入数据库的写入数据库会话适配器上执行一些错误日志,我认为问题出在 (libraries/joomla/session /storage/database.php ) 第 82 行:

$session = &JTable::getInstance('session');
if ($session->load($id) == true) { /*...*/} // never entering here
else { /*...*/ } // always here

我尝试将 $id 的内容输出到日志中,它确实引用了 db 上的有效主键 id

error_log('SELECT * FROM jos_session WHERE session_id = "' . $id . '"');

返回类似 SELECT * FROM jos_session WHERE session_id = "38e6468f35f1994425de3919fa767a3d",我可以确认返回有效记录,我尝试从 1.5.23 中提取旧源,但即使这样也不会它再次起作用,有什么想法可能会升级并使其失败?

**更新**

我也尝试过截断表,实际上我认为更具体的问题是会话在写入数据库时​​失败,因为我有多个连接到正在使用的 mysql,会话的 JSession 数据库 Mysql 存储引擎感到困惑,更奇怪的是,在纯 1.5.23 的环境中不会发生这种混乱,为每个不同的连接创建资源,我经历了从 1.5.23 到 1.5.25 的更改,但我找不到任何东西与数据库资源管理或对 DBO 对象的任何松散引用有关,我想我需要分析每个连接并检查问题出在哪里,数据位于同一 mysql 服务器上但位于不同的数据库上

【问题讨论】:

    标签: php mysql session joomla joomla1.5


    【解决方案1】:

    问题是 JSession 正在使用数据库存储 JsessionStorageDatabase 因为我通过脚本执行连接到多个数据库我的 mysql_connect 调用并没有真正建立新的连接,他们重用旧的导致脚本失败时它没有'找不到在 JSession 的存储适配器想要写入时更改的选定数据库

    See mysql_connect documentation here 并查看另一个用户的this question,这有助于我了解我的问题并找到解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多