Session - Problem

  • Hallo zusammen,


    ich habe eine index.php die nur dann funktionieren soll, wenn die $_SESSION['logged'] == 1 ist. Oder andersrum, wenn sie == 0 ist soll es wieder zurück auf die login.php


    Hierzu habe ich in der Header.php folgendes gemacht:


    PHP
    <?php
    $page = basename($_SERVER['PHP_SELF']);
    session_start();
    if(!isset($_SESSION['logged'])){
        $_SESSION['logged'] = 0;
    }

    Definiere die logged Session als 0


    Dann login-skript, dass mir die Session auf 1 setzt.


    Anschließend, wenn ich die $_SESSION ausgebe, bekomme ich folgendes:


    1Array


    (

    [logged] => 1

    ....


    Auf der Index.php frage ich jetzt ab, ob die Session 0 ist, dann soll er wieder auf login.

    Code
    if($_SESSION['logged'] == 0){
      header("Location: login.php");
    }

    Da die logged-Session ja aber 1 ist, möchte ich die Umleitung auf login.php nicht.


    Trotzdem leitet er mich immer wieder auf Login.php trotz der Session-logged = 1


    Wisst ihr, wieso?

  • Warum willst du unbedingt eine Session-Variable setzen, wenn man nicht eingeloggt ist? Das ist doch Quatsch. Mit

    Code
    if (! isset($_SESSION['logged']))

    kannst du prüfen, ob man eingeloggt ist oder nicht.


    Hast du in allen Scripts am Anfang ein session_start()?

    Hast du das Error-Reporting mal hochgedreht?

  • Hast recht, normalerweise muss ich nicht zwingend wissen ob jemand nicht eingeloggt ist. Aber ich dachte es wäre ganz praktisch, dann kann ich (evtl. nachträglich) noch unterscheiden wer nicht eingeloggt ist (logged 0)..


    Und ich binde die header.php und die footer.php per include ein.


    Wenn ich in die index.php ein session_start() mache dann funktionierts. Aber gleichzeitig erhalte ich auch folgenden Fehler:


    Notice: session_start(): Ignoring session_start() because a session is already active in C:\xampp\htdocs\cp-own\header.php on line 3


    Hier der Anfang der index.php

    PHP
    <?php
    session_start();
    if($_SESSION['logged'] == 0){
      header("Location: login.php");
    }
    include('header.php');
    ?>


    Und das finde ich unlogisch. Mache ich kein session_start() gehts nicht. Mache ich es aber, dann sagt er mir es wird ignoriert, weil es bereits ein session start gibt.. Das ist völlig unverständlich

  • Wenn du in der header.php ein session_start stehen hast, dann muss diese logischerweise vor dem if($_SESSION['logged'] == 0) eingebunden werden und ist dann in der index.php nicht mehr erforderlich.


    Zitat

    Aber ich dachte es wäre ganz praktisch, dann kann ich (evtl. nachträglich) noch unterscheiden wer nicht eingeloggt ist (logged 0)..

    Das kannst du mit isset jederzeit, dein $_SESSION['logged'] = 0 ist völlig unnötig.

  • Nachtrag: Ich habe jetzt mal dein Skript genommen und einfach gefragt, wenn die Session nicht vorhanden ist.


    Hier die index.php Anfang dazu

    PHP
    <?php
    if(!isset($_SESSION['logged'])){
      header("Location: login.php");
    }
    include('header.php');
    ?>


    Allerdings führt das genau zum gleichen Problem. Die login.php wird angezeigt und nicht die index.php...

    Mache ich davor wieder ein session_start() sagt er wieder dass man das nicht braucht, weil bereits eine Session vorhanden ist....

  • Noch ein Hinweis:


    Richtig debuggen

    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
  • Okay, vielen lieben Dank!


    Bedeutet, dass ich entweder das include vorher mache, was aber glaube ich nicht so gut möglich ist weil ich danach kein Code mehr machen kann (weil in der header.php auch html steht) oder ich meinen header ohne session_start mache


    PHP: header.php
    <?php
    $page = basename($_SERVER['PHP_SELF']);
    //session_start();
    if(!isset($_SESSION['logged'])){
        $_SESSION['logged'] = 0;
    }
    require("func.php");
    require("config.php");


    und dann anschließend die sessions jeweils in den seiten selbst starte, richtig? Was hältst du für sinnvoller?


    Das mit dem logged == 0 lösche ich natürlich noch.


    Ich bin gerade dabei ein UCP zu programieren, habe allerdings vom Vorgänger viel hinterlassen bekommen und muss jetzt erstmal seine Funktionen benutzen, bzw. mich zurechtfinden, ehe ich dann meine Logik einbaue.

  • Die einzige Problematik die ich jetzt habe ist ein Umleitungsfehler.

    Da ich ja auch in der login.php den header einbinde und der wiederum prüft, ob die session vorhanden ist und sonst auf login.php umleitet bin ich in der dauerschleife


    Fehler: Umleitungsfehler


    Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

  • Genau, so hatte ich es dann auch gemacht, danke dir


    PHP
    <?php
    $page = basename($_SERVER['PHP_SELF']);
    session_start();
    if(!isset($_SESSION['logged'])){
      if($page != 'login.php'){
        header("Location: login.php");
        exit();
      }
    }

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!