Joomla 1.5.25 JSession не записывает в БД при закрытии после обновления с 1.5.23 - PullRequest
3 голосов
/ 14 февраля 2012

Joomla 1.5.25 только что обновлена ​​с 1.5.23, имеет проблемы с сохранением в сеанс и постоянство, отлично работает на 1.5.23, но данные сеанса не сохраняются в БД при использовании JSession-> set

НаписалПользовательское приложение поверх Joomla, управляющее пользователями, импортированными из прежней системы, не может использовать Joomla Users для этого (или, по крайней мере, у меня его нет и у меня нет времени), вход в систему работает следующим образом:

  1. Пользовательотправляет сообщение электронной почты pass
  2. приложение проверяет, существует ли пользователь
  3. если пользователь существует, я сохраняю объект пользователя в сеансе
  4. перенаправляем пользователя на ресурс

Здесьэто фрагмент для сохранения пользователя в сеансе

$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 () для того же сценария, он извлекает весь ресурс, который я только что сохранил, но если я пытаюсь извлечь $ сеанс из другого сценария, я ничего не получаю, вот сценарий Other

<code><?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 "
"; выход;

Здесь яполучить только мой массив cookie и массив сеанса с информацией о сеансе по умолчанию:

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
        )

)

БД никогда не обновляется с содержимым моей только что созданной переменной сеанса, я пытался сделать несколько error_logs на базе данных writeАдаптер сеанса, который записывает в БД, и я думаю, что проблема здесь (библиотеки / joomla / сессия / хранилище / database.php), строка 82:

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

Я попытался вывести в журнал содержимое$ id и ссылается на действительный идентификатор первичного ключа в db

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

возвращает что-то вроде этого SELECT * FROM jos_session WHERE session_id = "38e6468f35f1994425de3919fa767a3d" , что я могу подтвердитьвозвращает верную запись, я попытался вытащить сюда старый источник из 1.5.23, но даже если это не заставит его работать снова, есть какие-нибудь идеи по поводу того, что могло бы быть обновлено и провалилось?

**ОБНОВЛЕНИЕ **

Я тоже пытался обрезать таблицы, на самом деле, я думаю, что проблема более конкретно заключается в том, что в какой-то момент сеансПри записи в db, поскольку у меня есть несколько подключений к mysql, механизм хранения базы данных JSession Mysql для сессии запутывается, даже страннее то, что в среде с чистым 1.5.23 эта путаница не возникает, ресурсы создаютсядля каждого отдельного соединения я прошел через изменения с 1.5.23 до 1.5.25 и не могу найти ничего, связанного с управлением ресурсами БД или какой-либо свободной ссылкой на объект DBO, я думаю, мне нужно профилировать каждое соединение и проверить, гдепроблема, данные живут на том же сервере MySQL, но на разных БД

1 Ответ

0 голосов
/ 16 февраля 2012

Проблема в том, что JSession использует хранилище базы данных JsessionStorageDatabase, так как я подключаюсь к нескольким базам данных во время выполнения скрипта, мои вызовы mysql_connect на самом деле не устанавливают новое соединение, они повторно используют старое, вызывая сбой сценария, когда онНе удалось найти выбранную базу данных, которая изменилась к тому времени, когда адаптер хранения для JSession захотел сделать запись

См. mysql_connect документацию здесь и отметьте этот вопрос от другого пользователя, который помог мне понять мою проблему и найти решение

...