Seite 1 von 2

Sessionvariable $userdata verwenden

Verfasst: 02.04.2008 11:31
von Arokh73
Hallo mit phpbbler !

Ich suche eine Möglichkeit, in die Sessionvariable $userdata eigene Werte zu speichern, um sie sessionübergreifend verwenden zu können.

Im Array $userdata sind ja diverse phpbb-Usereinstellungen gespeichert, wie auch hieraus hervorgeht: http://www.phpbb.de/doku/kb/phpbb_seite

Ich habe die obige Anleitung verwendet, um eigene Seiten in phpbb einzubinden. Eigene Sessionvariablen kann ich doch sicher nicht verwenden, weil ja bereits eine Session gestartet ist:

Code: Alles auswählen

$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
Wenn ich einfach neue Werte belege, zB. mit:

Code: Alles auswählen

$userdata['test']="test";
werden diese nicht sessionübergreifend gespeichert.


Gebt mir mal einen Tipp ;-)

Danke und Gruß
Arokh

Verfasst: 02.04.2008 11:49
von gn#36
Sowas kannst du nur entweder direkt in irgend einer Datei oder in der Datenbank speichern, $userdata ist nicht das gleiche wie in einem anderen PHP Skript $_SESSION. Von $userdata wird gar nichts in der Datenbank gespeichert, der Weg funktioniert nur andersrum (also aus der DB in das Array), das Array wird somit für jeden Seitenaufbau neu geladen. Du kannst also nur
  • Ein neues Feld in der DB in der Tabelle phpbb_users anlegen für solche Dinge
  • Sowas in einer speziellen Datei selbst speichern
  • Dir selbst ein paar Session Funktionen zusammenschreiben, so dass du beliebige Daten Zugriffsübergreifend speichern kannst

Verfasst: 02.04.2008 12:04
von Arokh73
gn#36 hat geschrieben:
  • Sowas in einer speziellen Datei selbst speichern
Du meinst auf Dateiebene ?
gn#36 hat geschrieben:
  • Dir selbst ein paar Session Funktionen zusammenschreiben, so dass du beliebige Daten Zugriffsübergreifend speichern kannst
Wie stelle ich das an ?
Ich muss ja die bestehende Session verwenden oder kann man mehrere Sessions gleichzeitig starten ?
Sowas wie:

Code: Alles auswählen

$_SESSION['test']="test";
...
print "Test: $_SESSION[test]";
funktioniert doch wohl nicht oder ?

Sorry, aber ich habe bis jetzt noch nie eigene Sessions programmiert :oops:

Verfasst: 02.04.2008 12:33
von gn#36
$userdata ist im Prinzip keine Sessionvariable sondern nur der Inhalt einer Datenbankzeile. D.h. der Inhalt von $userdata überdauert keinen Seitenaufruf.

Wenn du trotzdem ständig auf wechselnde Daten stößt die du für jeden User zwischenspeichern musst dann würde ich das so machen:
  • Leg in der Tabelle phpbb_users ein neues Feld an (z.b. dyn_vars) vom Typ Text oder Blob
  • Schreib dir eine Funktion, z.b. set_svar($varname, $value) mit der du dieses Feld für den aktuellen User belegst:

    Code: Alles auswählen

    set_svar($varname ='', $value = '') 
    {
    global $userdata, $db;
    if(!is_array($userdata['dyn_vars']))
    {
    $userdata['dyn_vars'] = unserialize($userdata['dyn_vars']);
    }
    if(!$varname)
    {
    return;
    }
    $userdata['dyn_vars'][$varname] = $value;
    $sql = 'UPDATE ' . USERS_TABLE . ' SET dyn_vars = ' . addslashes(serialize($userdata['dyn_vars'])) . ' WHERE user_id = ' . $userdata['user_id'];
    if(!$db->sql_query($sql))
    {
    message_die(GENERAL_ERROR, 'Dynamische Speicherung fehlgeschlagen', '', __LINE__, __FILE__, $sql);
    }
    }
    
  • Benutzung dann eben durch initialisierung per set_svar(); und anschließenden Zugriff über $userdata['dyn_vars']['variablenname']
  • Setzen neuer Variablen über set_svar('variablenname', 'wert'); Du kannst die Werte auch setzen über $userdata['dyn_vars']['variable'] = xxx, musst aber im Anschluss irgendwann auf jeden Fall noch set_svar mit nichtleeren Parametern aufrufen (oder du schreibst die Funktion so um, dass sie bei jedem Aufruf grundsätzlich immer das Array speichert, kann je nach dem wie häufig du das brauchst sinnvoller sein).
Das soll nur eine (nicht mehr ganz so) grobe Anleitung sein. Ich habe das weder getestet noch würde ich ausschließen dass da kleinere Fehler drin sind, aber prinzipiell könntest du das so machen.

Wenn du immer wieder die gleichen Werte hast die du brauchst kannst du natürlich auch durch hinzufügen von Tabellenspalten in der user Tabelle diese direkt ansprechen statt ein Feld als "Mädchen für alles" zu benutzen. Das hätte dann den Vorteil dass du in der Tabelle auch direkt nach dieser Eigenschaft suchen könntest.

Auf Dateiebene ginge das quasi wie bei einem Cache, also per [php:fopen] die Datei öffnen (wobei du z.b. die User_id in den Dateinamen schreibst um die User voneinander zu unterscheiden), dann per [php:fwrite] oder [php:fprintf] was reinschreiben oder [php:fread] rauslesen und per [php:fclose] wieder schließen wobei du das ganze am besten in ein paar Funktionen oder eine Klasse verpackst, damit du das nicht überall wo du es brauchst von Hand machen musst.

Verfasst: 02.04.2008 13:08
von Arokh73
Danke erstmal für die umfangreiche Antwort :D


Das Speichern in eine Datenbanktabelle in meinem Fall jedoch nicht sinnvoll, da ich die Daten immer nur für die jeweilige Session brauche.

Ich werde wohl mit einer temporären Datei und fopen arbeiten, da ich anschließend sowieso mit Dateioperationen weitermache.

Thanks und Good Bye !

Verfasst: 02.04.2008 14:47
von Arokh73
OK ich nochmal:

Es hat mir doch keine Ruhe gelassen und ich hab deinen Vorschlag mit dem zusätzlichen Feld in der php-Datenbank implementiert.
Bis auf 2 fehlende Anführungszeichen im MySQL-Statement hat dein Code auch optimal gestimmt !

Code: Alles auswählen

$sql = 'UPDATE ' . USERS_TABLE . ' SET dyn_vars =" ' . addslashes(serialize($userdata['dyn_vars'])) . '" WHERE user_id = ' . $userdata['user_id']; 
Also vielen Dank nochmal, das hat wirklich sehr geholfen und die Lösung ist wirklich außerordentlich elegant jetzt :D

Verfasst: 02.04.2008 19:37
von error-phpbb
@gn#36 / alle anderen

gibts sowas auch fürs phpbb3? ich hab noch nix dazu gefunden.
Wäre sehr glücklich über eine Antwort.

Danke schonmal

Verfasst: 02.04.2008 21:42
von Boecki91
Natürlich gibt es da da auch nur das es dort keine User-Array mehr gibt sondern eine Klasse, die DB-Teile sind fast identisch, allerdings musst du dich bei dem Code an die Vorgaben für phpBB3 hateln die du auch in deinem docs Verzeichniss findest.

Verfasst: 02.04.2008 21:43
von gn#36
Das kannst du analog machen, allerdings dann eben statt $userdata $user->data verwenden.

Verfasst: 08.04.2008 07:55
von error-phpbb
hätt aber noch kurz ne andere frage.
ich kann nirgend finden, wie das prinzip des $user objekts funktioniert. wie halten sich da die daten am leben?
ich würde das auch gern nutzen