Sessionvariable $userdata verwenden

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB2 oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Arokh73
Mitglied
Beiträge: 11
Registriert: 28.02.2008 14:42

Sessionvariable $userdata verwenden

Beitrag 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
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Arokh73
Mitglied
Beiträge: 11
Registriert: 28.02.2008 14:42

Beitrag 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:
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Arokh73
Mitglied
Beiträge: 11
Registriert: 28.02.2008 14:42

Beitrag 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 !
Arokh73
Mitglied
Beiträge: 11
Registriert: 28.02.2008 14:42

Beitrag 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
error-phpbb
Mitglied
Beiträge: 26
Registriert: 22.03.2006 21:59

Beitrag 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
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag 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.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Das kannst du analog machen, allerdings dann eben statt $userdata $user->data verwenden.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
error-phpbb
Mitglied
Beiträge: 26
Registriert: 22.03.2006 21:59

Beitrag 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
Antworten

Zurück zu „phpBB 2.0: Mod-Bastelstube“