Sessionproblem

MaxMara

Mitglied
Hallo.
Ich grüble schon längere Zeit an einem Problem mit Sessions und wende mich jetzt damit an euch :)
Meine Seite besteht eigentlich nur aus der index.php in der die einzelnen Contentseiten per includes eingebunden werden. Die erste Zeile dieser index.php startet die Session mit
PHP:
<?php session_start (); ?>
. Wenn ein User eingeloggt ist, dann enthält die Session unter anderem seine UserID.
Einzelne Unterseiten sind für alle zugänglich, andere nur für eingeloggte User.
Wenn ich jetzt eine Unterseite einbinden möchte die nur für eingeloggte User zugänglich sein soll, dann möchte ich natürlich den Zugriff auf die Seite sperren, wenn die UserID nicht gesetzt ist. Gemacht hab ich das mit:
PHP:
<?php if (!isset($_SESSION['user_id'])) { header("Location: index.php?what=nosession");}?>
Nur kommt dann ein
Code:
Warning: Cannot modify header information - headers already sent by (output started at /data/www/nickname/new/index.php:3) in /data/www/nickname/new/incl/changeprofile.php on line 2
und der Rest der Seite wird trotzdem angezeigt.

Wie kann ich das am besten (und vor allem sicher) lösen?

Danke für eure Hilfe!
Grüße
Christian
 
Das ist genau das Problem.
Ich kann diese Abfrage (falls Du if (!isset($_SESSION['user_id'])) meinst) nicht direkt nach dem Start der Session stellen.
Die Entscheidung welcher der Subseiten inkludiert wird erfolgt erst später im Code und einige dieser Subseiten sind ja für alle zugänglich.
 
Wahrscheinlich gibst du vorher schon ein paar HTML-Zeilen an den User aus (z.B. per echo/print)

Wenn dies passiert ist, kannst wie Gumbo schon sagte nichts mehr am Header ändern.

Das Problem lässt sich recht einfach lösen, wenn du anstatt der direkten Ausgabe per echo deinen Ausgabecode in einer Variablen speicherst (z.B. $output) und diese erst ganz am Ende, nachdem alles eingebunden wurde, einmalig per echo ausgibst.

Somit ist gewährleistet das der Header als letzte Aktion deines Programms gesendet wird.
 
Doch. Hab es jetzt mal so gelöst:
PHP:
function redirect($filename) {
   if (!headers_sent())
       header('Location: '.$filename);
   else {
       echo '<script type="text/javascript">';
       echo 'window.location.href="'.$filename.'";';
       echo '</script>';
       echo '<noscript>';
       echo '<meta http-equiv="refresh" content="0;url='.$filename.'" />';
       echo '</noscript>';
   }
}

Mal schauen, ob es für mich reicht.

Danke für deine Hilfe.
 
Zurück