Dirk3456: Session Variable wird nicht übertragen

Hallo zusammen,

ich habe 2 Skripte:

(1) loeschen.php

  
<?php  
session_start();  
include("../../../files/mysqlzugangsdaten.php");  
$mysqli = new mysqli($host, $benutzer, $passwort, $db);  
$_SESSION['systemmeldung'] = 'Bane';  
  
echo '1<br />';  
// ÜBERPRÜFEN DER ID, DIE GELOESCHT WERDEN SOLL  
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {$_SESSION['systemmeldung'] = 'Die ID zum Löschen des Kunden ist ungültig!'; header("Location: kunden_verwalten.php"); exit();}  
  
echo '2<br />';  
// VERBINDUNG ZUR DATENBANK AUFBAUEN  
if (mysqli_connect_errno()) {$_SESSION['systemmeldung'] .= 'SQL Verbindung konnte nicht aufebaut werden.<br />'.mysqli_connect_error(); header("Location: kunden_verwalten.php"); exit();}  
  
echo '3<br />';  
  
$id = $mysqli->real_escape_string($_GET['id']);  
$sql = "DELETE FROM kunden WHERE id=? LIMIT 1;";  
  
if   ($stmt = $mysqli->prepare($sql))  
	 {  
	 $stmt->bind_param("i", $id);  
	 $stmt->execute();  
	 $stmt->close();  
	 $mysqli->close();  
	 $_SESSION['systemmeldung'] .= 'Kunde wurde erfolgreich gelöscht!.<br />';  
	 }  
else {  
	 $mysqli->close();  
	 $_SESSION['systemmeldung'] .= 'Prepared Statement zum Löschen des Kunden konnte nicht ausgeführt werden!<br />';  
	 }  
  
	 $_SESSION['systemmeldung'] .= 'Hallo!<br />';  
  
echo 'HALLO!'.$_SESSION['systemmeldung'];	  
header("Location: kunden_verwalten.php"); exit();  
?>  

(2) kunden_verwalten.php
[...]

  
<?php  
session_start(); // SETZE ICH SCHON GANZ OBEN AUF DER SEITE. HAB ICH NUR VOLLSTÄNDIGKEITSHALNBER DRIN  
echo 'HALLO BÄR!'.$_SESSION['systemmeldung'];  
// AUSGEBEN DER SYSTEMMELDUNG  
if (isset($_SESSION['systemmeldung']) && !empty($_SESSION['systemmeldung'])) {echo '  
<div class="inhalt">  
<h1>Systemmeldung:</h1>  
<p>'.$_SESSION['systemmeldung'].'<p>  
</div>  
'; unset($_SESSION['systemmeldung']);}  
?>  

[...]

Nun, das Löschen Skript funktioniert super, wenn ich es einzeln aufrufe, bekomme ich auch alle Debugging Infos angezeigt. Nur die SESSION['systemmeldung'] nimmt er nicht mit auf die verwalten Seite. Warum ist das so? Mach ich was falsch? Liegt es am Server?

Lg, der Dirk.

  1. Moin!

    Mal was ganz anderes:

    (1) loeschen.php

    <?php
    [...]
    $id = $mysqli->real_escape_string($_GET['id']);
    $sql = "DELETE FROM kunden WHERE id=? LIMIT 1;";

    if   ($stmt = $mysqli->prepare($sql))

      
    Warum rufst du die Escaping-Funktion auf, wenn du Prepared Statements verwendest?  
      
    Weil du hier eine numerische ID hast, ändert das Escaping an deren Erscheinung nichts, aber es ist vollkommen sinnlos, weil du dir dadurch potentiell alle DB-Einträge zerschießt (im Sinne von: Escaping-Zeichen zusätzlich mit einträgst).  
      
     - Sven Rautenberg
    
    1. Warum rufst du die Escaping-Funktion auf, wenn du Prepared Statements verwendest?

      Danke für den Tip. Ich war mir nicht sicher, ob man das als Sicherheitsmaßnahme noch braucht oder man alle problematischen Fälle mit dem Bind löst. Hat sich das Buch, das ich gelesen habe, um mein Wissen aufzufrischen, nicht so recht ausgekäst.

  2. Hi,

    echo 'HALLO!'.$_SESSION['systemmeldung'];

    header("Location: kunden_verwalten.php"); exit();

      
    Abgesehen davon, dass dieser Location-Header fehlerhaft ist, weil du keinen vollständigen URL angibst, wie es der Standard \*fordert\* - sind Weiterleitungen in Kombination mit (gerade erst initial gestarteten) Sessions teilweise problematisch, weil manche Browser dabei den Session-Cookie nicht annehmen wollen.  
      
    Entweder übergibst du die Session-ID in so einem Fall explizit per GET (selber an die Weitelreitungs-Adresse anhängen) - oder du strukturierst deine Scripte so, dass diese Weiterleitung gar nicht mehr nötig ist.  
    Weiterleitungen haben zwar teilweise ihre Berechtigung - aber vielfach setzen Seitenautoren sie auch einfach nur ein, weil sie ihr Script und dessen Abläufe nicht vernünftig durchdacht haben. Und das sollte man m.E. lieber vermeiden, wenn es geht.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Danke Dir.

      Abgesehen davon, dass dieser Location-Header fehlerhaft ist, weil du keinen vollständigen URL angibst, wie es der Standard *fordert* - sind Weiterleitungen in Kombination mit (gerade erst initial gestarteten) Sessions teilweise problematisch, weil manche Browser dabei den Session-Cookie nicht annehmen wollen.

      Auch mit einer richtigen URL geht es nicht. Ich verwende den aktuellen Firefox und Chrome, in anderen Browsern hab ich nicht getestet, aber ich möchte eh eine browserunabhängige Lösung. Kann ich das irgendwie beeinflussen, daß die Session richtig übergeben wird? Früher hat sowas immer problemlos funktioniert. Liegt es vielleicht am Server? Könnte man da mit anderen Einstellungen was verbessern? Oder mit einem anderen Befehl den Cookie erzwingen?

      oder du strukturierst deine Scripte so, dass diese Weiterleitung gar nicht mehr nötig ist.
      Weiterleitungen haben zwar teilweise ihre Berechtigung - aber vielfach setzen Seitenautoren sie auch einfach nur ein, weil sie ihr Script und dessen Abläufe nicht vernünftig durchdacht haben. Und das sollte man m.E. lieber vermeiden, wenn es geht.

      Hmm. Ich dachte schon, insgesamt eine gut durchdachte Lösung zu haben, lasse mich aber auch gern eines besseren belehren. Idee ist folgende: Ich habe eine Hauptübersichtsseite, auf der alle DB Einträge aufgelistet werden. Die Funktionen eintragen, ändern und löschen lagere ich jeweils in eine eigene Datei aus, das find ich übersichtlicher, als alles in die Hauptdatei zu quetschen. Das Feedback aus den ausgelagerten Dateien übertrage ich per Session zurück zur Hauptseite und unsette anschliessend wieder die Session Variable. Natürlich kann ich das auch per Get machen, ich fand die Lösung mit den Sessions aber irgendwie eleganter, schon allein aus dem Grund, daß die Sessions sicherheitstechnisch weniger manipulierbar sind.

      Ach ja, wieso meinst Du, ich soll die Session ID per Get übertragen? Dann kann ich doch eigentlich auch gleich das Feedback per Get übergeben, oder? Oder geht es, wenn ich die Session ID übertrage und sonst alles gleich lasse?

      1. Hi,

        Hmm. Ich dachte schon, insgesamt eine gut durchdachte Lösung zu haben, lasse mich aber auch gern eines besseren belehren. Idee ist folgende: Ich habe eine Hauptübersichtsseite, auf der alle DB Einträge aufgelistet werden. Die Funktionen eintragen, ändern und löschen lagere ich jeweils in eine eigene Datei aus, das find ich übersichtlicher, als alles in die Hauptdatei zu quetschen.

        Dateien müssen nichts mit URLs zu tun haben.

        Ach ja, wieso meinst Du, ich soll die Session ID per Get übertragen?

        Das schrieb ich doch - damit sie überhaupt übergeben wird.

        Hast du mal ein bisschen simples Debugging betrieben und *überprüft*, ob die Übergabe der Session-ID derzeit klappt?

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Vielen Dank für Eure Hilfe. Hab den Fehler gefunden. War ein Programmierfehler meinerseits in der Menüseite, in der ich die Variable jeweils neu gesetzt hab. Da konnte dann natürlich nichts drin stehen.

          Viele Grüße, Dirk.