3 Stimmen

Joomla 1.5.25 JSession Set schreibt nach Upgrade von 1.5.23 beim Schließen nicht in die Datenbank

Joomla 1.5.25 wurde gerade von 1.5.23 aktualisiert und hat Probleme mit dem Speichern in der Sitzung und der Persistenz, funktioniert perfekt auf 1.5.23, aber die Sitzungsdaten werden nicht in der Datenbank gespeichert, wenn JSession->set verwendet wird

Schrieb benutzerdefinierte app auf joomla, Verwaltung von Benutzern aus Altsystem importiert kann nicht verwenden joomla Benutzer für diese (oder zumindest habe ich nicht und ich habe nicht die Zeit), Login funktioniert wie folgt:

  1. Benutzer stellt E-Mail-Pass ein
  2. app prüft, ob Benutzer existiert
  3. wenn der Benutzer existiert, speichere ich das Benutzerobjekt in der Sitzung
  4. Benutzer zur Ressource umleiten

Hier ist das Snippet zum Speichern des Benutzers in der Sitzung

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

Nun, da ich dies außerhalb des Joomla-Bereichs tue, muss ich boostrap

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');

Wenn ich $session->set() ausführe und $session->get() im selben Skript ausprobiere, wird die gesamte Ressource, die ich gerade gespeichert habe, abgerufen, aber wenn ich versuche, die $session aus einem anderen Skript abzurufen, erhalte ich nichts, hier das andere Skript

<?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;

Hier erhalte ich nur mein Cookie-Array und das Array der Sitzung mit den Standard-Sitzungsinformationen:

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
        )

)

Die Datenbank wird nie mit dem Inhalt meiner neu erstellten Sitzungsvariable aktualisiert. Ich habe versucht, einige error_logs auf dem Write-DB-Sitzungsadapter zu machen, der derjenige ist, der in die Datenbank schreibt, und ich denke, das Problem ist hier (libraries/joomla/session/storage/database.php) Zeile 82:

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

Ich habe versucht, den Inhalt von $id in das Protokoll auszugeben, und es bezieht sich auf eine gültige Primärschlüssel-ID in der Datenbank

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

gibt etwa Folgendes zurück SELECT * FROM jos_session WHERE session_id = "38e6468f35f1994425de3919fa767a3d" Ich habe versucht, den alten Quellcode von 1.5.23 hierher zu ziehen, aber auch damit funktioniert es nicht mehr. Gibt es irgendwelche Ideen, was das Upgrade verursacht haben könnte?

**UPDATE**

Ich habe versucht, die Tabellen zu kürzen, in der Tat ich denke, das Problem spezifischer ist, dass an einem gewissen Punkt die Sitzung auf Schreiben zu DB fehlschlägt, da ich mehrere Verbindungen zu Mysql verwendet werden, die JSession Datenbank Mysql Storage-Engine für die Sitzung verwirrt wird, noch seltsamer ist, dass auf eine Umgebung mit reinen 1.5. 23 diese Verwirrung nicht auftritt, Ressourcen werden für jede verschiedene Verbindung erstellt, ich bin die Änderungen von 1.5.23 bis 1.5.25 durchgegangen und kann nichts finden, was mit dem DB-Ressourcenmanagement oder irgendeinem losen Verweis auf das DBO-Objekt zu tun hat, ich denke, ich muss für jede Verbindung ein Profil erstellen und prüfen, wo das Problem liegt, die Daten befinden sich auf demselben Mysql-Server, aber auf verschiedenen Datenbanken.

0voto

rroche Punkte 1262

Problem ist JSession ist mit der Datenbank Storage JsessionStorageDatabase, da ich eine Verbindung zu mehreren Datenbanken durch die Skriptausführung meine mysql_connect Anrufe waren nicht wirklich eine neue Verbindung zu machen, sie waren wiederverwenden die alten verursacht das Skript zu scheitern, wenn es nicht finden, die ausgewählte db, die durch die Zeit der Storage-Adapter für JSession wollte ein Schreiben zu tun geändert

Voir mysql_connect Dokumentation hier und prüfen diese Frage von einem anderen Benutzer, der mir half, mein Problem zu verstehen und eine Lösung zu finden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X