Bernd: Problem mit $_SESSION

Hallo,

was ich nicht verstehe ist folgendes. Ich habe am Anfang meiner Seite folgendes Script

if(isset($_POST['abschicken'])){       
        
if(isset($_POST['abschicken']) && empty($errors)) {

    $stmt = $mysqli->prepare("DELETE FROM permissions WHERE userID=?");
    $stmt->bind_param("s",$_GET['mitarbeiter']);
    $stmt->execute();

    if(is_array($_POST["bereich"]) && $_POST["bereich"][0]){
    
    foreach($_POST["bereich"] as $v){
            
     $stmt = $mysqli->prepare("INSERT INTO permissions (userID, bereichID)  VALUES (?, ?)");
                
                $userID      = $_GET['mitarbeiter'];
                $bereichID   = $v;
                
                $stmt->bind_param("ss", $userID, $bereichID);          
                $stmt->execute();
        }
    }

    $_SESSION['permissions'] = 1;
    
    header("Location: $extra");


    }
}

Etwas weiter unten dann folgendes für die Ausgabe

if (isset($_SESSION['berechtigungen'])) {

	if ($_SESSION['berechtigungen'] === 1) {
		echo "<div> Berechtigungen wurden erfolgreich aktualisiert.</div>";
    unset($_SESSION['berechtigungen']);
	}
}

Wenn ich jetzt den ganzen Krempel abschicke erhalte ich keine Ausgabe dass alles OK war.

Wenn ich allerdings diese Zeile deaktiviere

header("Location: $extra");
// in $extra steht meine URL

erhalte ich eine Ausgabe. Ist eine Session nicht für solche Zwecke da, dass ich später darauf zugreifen kann?

  1. Hallo Bernd,

        $_SESSION['permissions'] = 1;
    

    Etwas weiter unten dann folgendes für die Ausgabe

    if (isset($_SESSION['berechtigungen'])) {
    
    	if ($_SESSION['berechtigungen'] === 1) {
    

    Rechtschreibfehler oder steht da tatsächlich einmal "permissions" und einmal "berechtigungen"?

    Wenn ich jetzt den ganzen Krempel abschicke erhalte ich keine Ausgabe dass alles OK war.

    Wenn ich allerdings diese Zeile deaktiviere

    header("Location: $extra");
    // in $extra steht meine URL
    

    erhalte ich eine Ausgabe. Ist eine Session nicht für solche Zwecke da, dass ich später darauf zugreifen kann?

    header() beendet nicht das Script. Du wirst vermutlich deinen Session-Wert setzen und in der gleichen Script-Instanz auch wieder unset()zen. Setz ein exit() hinter deinen header()-Aufruf oder so.

    LG,
    CK

  2. Tach!

    Ist eine Session nicht für solche Zwecke da, dass ich später darauf zugreifen kann?

    Ist die Session auch eröffnet? Ich sehe kein session_start()-Aufruf. Gut, könnte auch per session.auto_start in der Konfiguration aktiviert worden sein, aber das so zu tun ist eher ungewöhnlich, und du auch nicht erwähnt das so zu haben. Jedenfalls speichert PHP den Inhalt von $_SESSION nicht ohne einen Session-Start.

    dedlfix.

    1. Hallo,

      ich habe in jedem Script ganz oben folgendes stehen

      ob_start();
      session_start();
      

      jetzt habe ich mal folgendes getestet wie Christian mit es geschrieben hat

      $_SESSION['berechtigungen'] = 1;
      header("Location: $extra");
      exit();
      

      bringt allerdings auch nicht. Und ja, ich lösche die Session im gleichen Script wieder, siehe hier

      if (isset($_SESSION['berechtigungen'])) {
      
      	if ($_SESSION['berechtigungen'] === 1) {
      		echo "<div> Berechtigungen wurden erfolgreich aktualisiert.</div>";
      		unset($_SESSION['berechtigungen']);
      	}
      }
      

      alles passiert in einer Datei.

      1. Tach!

        Ich kann mich nur wiederholen, was ich schon oft gesagt habe: Kontrollausgaben.

        Wenn es Probleme mit dem Programmfluss gibt, bau Kontrollausgaben ein, um zu sehen, welche Teile abgearbeitet werden und welche nicht.

        Das Session-Handling an sich ist jedenfalls sehr einfach und sehr zuverlässig.

        session_start();
        
        var_dump($_SESSION['test']); echo "\n";
        
        $_SESSION['test'] = time();
        
        var_dump($_SESSION['test']);
        

        Beim ersten Aufruf wirst du einmal null sehen, vielleicht garniert mit einer Notice-Meldung über das nicht vorhandenen "test" sowie eine Zeitangabe. Wenn nach einem Refreshen diese Zeit nun an erster Stelle zu sehen ist, ist der Session-Mechanismus grundsätzlich lauffähig. Wenn dieser einfache Test geklappt hat, liegt das Problem in deiner Programmlogik, zu der ich nicht viel sagen kann, wenn nur Ausschnitte vorliegen.

        Sessions benötigen Cookies.[1] Du kannst das nachvollziehen, wenn du dir die Requests in den Entwicklertools anschaust. Da muss beim Erstaufruf ein Set-Cookie in der Serverantwort zu sehen sein und bei Folgeaufrufen muss dieser Cookie im Request mitgesendet werden.

        dedlfix.


        1. Oder einen Key an der URL, was man aber nicht macht, weil eine solche URL leicht entwendbar ist und damit die Session übernommen werden kann. ↩︎

        1. Wenn ich das Script das erste mal aufrufe bekomme ich folgende Meldung

          NULL int(1558699978)

          Wenn ich dann auf speichern klicke erhalte ich folgendes

          int(1558699978) int(1558699983)

          1. Tach!

            Wenn ich das Script das erste mal aufrufe bekomme ich folgende Meldung

            NULL int(1558699978)

            Wenn ich dann auf speichern klicke erhalte ich folgendes

            int(1558699978) int(1558699983)

            Wunderbar, Sessions funktionieren grundsätzlich. Und das error_reporting unterdrückt Notice-Meldungen, was für die Entwicklungsumgebung nicht gut ist, weil damit eine Menge potentielle Probleme beim Zugriff auf nicht vorhandene Dinge nicht gemeldet werden.

            dedlfix.

            1. Ich habe etwas umgebaut

              
              $_SESSION['berechtigungen'] = 1;
              $_SESSION['berechtigungenVorname'] = $_POST["vorname"];
              $_SESSION['berechtigungenName'] = $_POST["name"];
                  
              header("Location: $extra");
              exit();
              
              if (isset($_SESSION['berechtigungen'])) {
              
              	if ($_SESSION['berechtigungen'] === 1) { ?>
              		<div> Berechtigungen wurden für <strong><?php echo $_SESSION['berechtigungenVorname'] . " " . $_SESSION['berechtigungenName'] ?></strong> erfolgreich aktualisiert.</div>
              		<?php 
              		$_SESSION['berechtigungen'] = 2;
              		$_SESSION['berechtigungenVorname'] = NULL;
              		$_SESSION['berechtigungenName'] = NULL;
              		unset($_SESSION['berechtigungen']);
              		unset($_SESSION['berechtigungenVorname']);
              		unset($_SESSION['berechtigungenName']);
              	}
              }
              

              Komischerweise funktioniert es jetzt 😨 Keine Ahnung was los war.

              Was ich jetzt wieder nicht verstehe ist das exit(); Exit heißt doch abbrechen? Warum wird mir dann mein HTML etwas weiter unten dennoch angezeigt? Oder hat ein ein exit nichts mit der Darstellung zu tun?

              1. Hallo Bernd,

                Ich habe etwas umgebaut

                
                $_SESSION['berechtigungen'] = 1;
                $_SESSION['berechtigungenVorname'] = $_POST["vorname"];
                $_SESSION['berechtigungenName'] = $_POST["name"];
                    
                header("Location: $extra");
                exit();
                
                if (isset($_SESSION['berechtigungen'])) {
                
                	if ($_SESSION['berechtigungen'] === 1) { ?>
                		<div> Berechtigungen wurden für <strong><?php echo $_SESSION['berechtigungenVorname'] . " " . $_SESSION['berechtigungenName'] ?></strong> erfolgreich aktualisiert.</div>
                		<?php 
                		$_SESSION['berechtigungen'] = 2;
                		$_SESSION['berechtigungenVorname'] = NULL;
                		$_SESSION['berechtigungenName'] = NULL;
                		unset($_SESSION['berechtigungen']);
                		unset($_SESSION['berechtigungenVorname']);
                		unset($_SESSION['berechtigungenName']);
                	}
                }
                

                Komischerweise funktioniert es jetzt 😨 Keine Ahnung was los war.

                Wenn der Code oben der ist, den du tatsächlich einsetzt, dann glaube ich das nicht.

                Was ich jetzt wieder nicht verstehe ist das exit(); Exit heißt doch abbrechen? Warum wird mir dann mein HTML etwas weiter unten dennoch angezeigt? Oder hat ein ein exit nichts mit der Darstellung zu tun?

                Unter der Annahme, dass du deinen Code oben nur verkürzt gepostet hast und er tatsächlich funktioniert: generell hast du es ja mit zwei Aufrufen zu tun. Ein Aufruf, bei dem du deine Datenbank-Operationen machst und an dessen Ende du deinen Redirect machst. Hier muss das exit() ausgeführt werden, damit die Verarbeitung abbricht und du deine Session nicht im gleichen Durchlauf wieder zurück setzt.

                Der zweite Aufruf passiert durch den Redirect. Hier hast du andere Parameter, deshalb geht der Programmablauf an deinen Datenbank-Einträgen vorbei und schickt dir die richtige Ausgabe.

                Das kannst du im Netzwerk-Tab der Entwickler-Tools deines Browsers auch nachvollziehen.

                Ich würde dir aber raten, die Erfolgsmeldung nicht im gleichen Script zu erzeugen in dem du auch deine Datenbank-Operationen machst. Da passieren zu schnell Fehler.

                LG,
                CK

              2. Tach!

                Was ich jetzt wieder nicht verstehe ist das exit(); Exit heißt doch abbrechen? Warum wird mir dann mein HTML etwas weiter unten dennoch angezeigt?

                Kann ich nicht nachvollziehen, bei mir bricht die Ausgabe an der Stelle ab. Das PHP-Handbuch nennt lediglich "Shutdown functions and object destructors" als Ausnahme.

                dedlfix.

  3. Danke Dir!!!

    1. Danke Dir!!!

      Gerne!