PHP Sessions in REDAXO
Quell-ID: GitHub Discussion #10
Use Case
Code soll nur beim ersten Besuch einer Website ausgeführt werden (z.B. ein Popup oder eine Willkommensnachricht). Die Information, ob der Besucher die Seite bereits besucht hat, soll in einer PHP-Session gespeichert werden.
Verwendete AddOns
- REDAXO Core
Zielbeschreibung
Session-Variablen sollen in REDAXO korrekt gesetzt und abgefragt werden, um Code nur einmalig pro Browser-Session auszuführen.
Lösung
In REDAXO werden alle Superglobals über rex_request abgehandelt. Für Sessions gibt es spezielle Funktionen:
Session-Funktionen
| Funktion | Beschreibung |
|---|---|
rex_login::startSession() |
Startet eine neue Session |
rex_session('key') |
Liest eine Session-Variable |
rex_set_session('key', 'value') |
Setzt eine Session-Variable |
rex_unset_session('key') |
Löscht eine Session-Variable |
Vollständiges Beispiel
<?php
// Session starten (falls noch nicht gestartet)
rex_login::startSession();
if (rex_session('MeineVariable')) {
// Code wird ausgeführt, wenn die Variable bereits gesetzt ist
// (also bei jedem Aufruf NACH dem ersten)
} else {
// Code wird nur beim ERSTEN Aufruf ausgeführt
echo '<div class="welcome-popup">Willkommen auf unserer Seite!</div>';
}
// Variable setzen für zukünftige Aufrufe
rex_set_session('MeineVariable', 'MeinWert');
Hinweis zur Session-Lebensdauer
Die Session bleibt aktiv, bis der Browser geschlossen wird. Für dauerhafte Speicherung über mehrere Browser-Sessions hinweg sollten Cookies verwendet werden.
Besserer Ansatz
Mit Timestamp für einmalige Aktionen
<?php
rex_login::startSession();
$lastVisit = rex_session('last_visit', 'int', 0);
$currentTime = time();
// Erstes Mal oder länger als 24 Stunden her
if ($lastVisit === 0 || ($currentTime - $lastVisit) > 86400) {
// Willkommensnachricht oder Popup anzeigen
echo '<div class="welcome-message">Willkommen zurück!</div>';
}
rex_set_session('last_visit', $currentTime);
Für Seiten-spezifische Einmalaktionen
<?php
rex_login::startSession();
$articleId = rex_article::getCurrentId();
$viewedArticles = rex_session('viewed_articles', 'array', []);
if (!in_array($articleId, $viewedArticles)) {
// Erste Ansicht dieses Artikels
echo '<div class="first-view-hint">Tipp: Scrollen Sie nach unten für mehr Infos!</div>';
$viewedArticles[] = $articleId;
rex_set_session('viewed_articles', $viewedArticles);
}
Mit Typ-Validierung
<?php
rex_login::startSession();
// rex_session mit Typ und Standardwert
$counter = rex_session('visit_counter', 'int', 0);
$counter++;
rex_set_session('visit_counter', $counter);
echo "Sie haben diese Seite $counter mal besucht.";
Sicherheitshinweis
Bei der Arbeit mit Sessions sollte beachtet werden:
- Sessions nicht für sicherheitskritische Daten ohne zusätzliche Validierung verwenden
- Session-Daten können vom Benutzer nicht direkt manipuliert werden
- Bei sensiblen Aktionen zusätzlich CSRF-Token verwenden