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:

  1. Sessions nicht für sicherheitskritische Daten ohne zusätzliche Validierung verwenden
  2. Session-Daten können vom Benutzer nicht direkt manipuliert werden
  3. Bei sensiblen Aktionen zusätzlich CSRF-Token verwenden