Der Keks: Login mit sessions

Hallo ihr da draußen,

ich hab mir ein Login mittels sessions gebastelt:

index.php:

  
<?php  
  
if (isset($_POST["Passwort"]) && isset($_POST["Loginname"]) && $_POST["Loginname"] == "Keks" && $_POST["Passwort"] == "Passwort") {  
  
    session_start();  
  
    $_SESSION["Zugang"] = "ok";  
    $_SESSION["Name"] = $_POST["Loginname"];  
  
     header("Location: loginstart.php?" . session_name() . "=" . session_id());  
  
} elseif (isset($_POST["Passwort"]) && isset($_POST["Loginname"]) && $_POST["Loginname"] != "Keks" && $_POST["Passwort"] != "Passwort") {  
  
     header("Location: loginfalsch.php");  
  
}  
?>  

[...]

  
<form method="post" action="index.php">  
  
                             <p>Loginname:<br><input name="Loginname" type="text" size="20" maxlength="30"/></p>  
                             <p>Passwort:    <br><input name="passwort"   type="password" size="20" maxlength="30"/></p>  
                 <input type="submit" value="Einloggen"/>  
</form>  
  

loginstart.php:

  
<?php  
  
  session_start();  
  
if (isset($_SESSION["Zugang"]) && $_SESSION["Zugang"] != "ok") {  
  
    header("Location: loginfalsch.php");  
  
}  
  
?>  

Wenn ich jetzt auf einloggen klicke geschieht gar nichts.

Wo liegt(en) den der/die Fehler ?

Mit krümeligen Grüßen,
Der Keks

  1. echo $begrüßung;

    Wenn ich jetzt auf einloggen klicke geschieht gar nichts.

    Wie hast du geprüft, dass "gar nichts" passiert? Vielleicht passiert ja doch was. Verwende Kontrollausgaben von Variableninhalten, um den Ablauf von "gar nichts" zu verfolgen. Vielleicht findest du dann auch die Ursache (unterschiedliche Schreibweisen beispielsweise). Für Kontrollausgaben eignet sich schon ein einfaches echo. Aber auch print_r() und var_dump() (mit vorhergehendem <pre>) bei komplexen Variablen (z.B. Arrays) ist hilfreich.

    echo "$verabschiedung $name";

  2. Hallo Keks ^^

    Neben dem, was dedlfix schon sagte solltest du session_start() immer an den Anfang des Scriptes setzen.
    Der Grund dafür ist, dass zum Start des Session ein Session-Cookie gesetzt werden muss, und dieser muss über den Header festgelegt werden. Wenn du allerdings vorher schon eine Ausgabe gemacht hast, wurde der Header schon (ohne die Session-Angaben) gesickt und die Session wird nicht mehr funktionieren!

    Lg Niko

    1. echo $begrüßung;

      Neben dem, was dedlfix schon sagte solltest du session_start() immer an den Anfang des Scriptes setzen.
      Der Grund dafür ist, dass zum Start des Session ein Session-Cookie gesetzt werden muss, und dieser muss über den Header festgelegt werden. Wenn du allerdings vorher schon eine Ausgabe gemacht hast, wurde der Header schon (ohne die Session-Angaben) gesickt und die Session wird nicht mehr funktionieren!

      Ja, dazu muss start_session() aber nicht am Anfang stehen (kann es auch gar nicht, davor muss ja noch <?php). Es kann beliebig weit hinten stehen, solange, wie du ja implizit sagst, der vorher ausgeführte Code keine Ausgabe erzeugt.

      Das ist aber nicht das Problem des OP, denn das äußert sich mit der allseits bekannten Cannot-send-blafasel-Meldung. Es sei denn, die Ausgabe von Fehlermeldungen ist unterdrückt. Womit ich mir ein gutes Stichwort gab, denn das error_reporting auf E_ALL (und display_errors auf on) zu setzen ist beim Fehlersuchen auch oft hilfreich.

      echo "$verabschiedung $name";

    2. Hallo ihr da draußen,

      Hallo Keks ^^

      Ich weis jeder mag kekse ;)

      »»Neben dem, was dedlfix schon sagte solltest du session_start() immer an den »»Anfang des Scriptes setzen.

      Sollte ich dann session start ganz an den anfang schrieben und einfach wenn das passwort falsch ist session_destroy verwenden?

      »»Besser wäre es wenn du die zweite Abfrage (elseif) weglässt und stattdessen »»direkt einen unbedingten Zweig machst (else). Dann ist immer wenn etwas »»nicht richtig eingegeben wurde automatisch falsch.

      Danke, ich hab den Fehler behoben aber einfach else ist möglich weil man sonst sofort beim aufruf von index.php auf loginfalsch.php umgeleitet wird ;)

      »», denn das error_reporting auf E_ALL (und display_errors auf on) zu setzen »»ist beim Fehlersuchen auch oft hilfreich.

      Hab ich gemacht aber ausgeben tut mir das nichts oder muss ich da noch etwas mit echo machen??
      Könntest du mir das genauer erklären??

      PS: an den einstellungen der php.ini kann der fehler nicht liegen, oder???

      Mit krümeligen Grüßen,
      Der Keks

      1. echo $begrüßung;

        »»Neben dem, was dedlfix schon sagte solltest du session_start() immer an den »»Anfang des Scriptes setzen.

        Bitte die Zitat-Zeichen nicht verändern. Danke.

        Sollte ich dann session start ganz an den anfang schrieben und einfach wenn das passwort falsch ist session_destroy verwenden?

        Es ist egal, wo du dein session_start() stehen hast, solange keine Ausgabe erfolgte. Wieviel Code zwischen dem Dateianfang und dem session_start() steht, ist also nicht von Belang.

        session_destroy() macht nicht automtisch das was session_start() eingeleitet hat wieder rückgängig. Wenn es deine Logik vorsieht, die Session erst zu starten, wenn die Benutzereingaben überprüft wurden, dann spricht überhaupt nichts gegen diese Vorgehensweise (solange dabei keine Ausgabe erfolgt).

        », denn das error_reporting auf E_ALL (und display_errors auf on) zu setzen ist beim Fehlersuchen auch oft hilfreich.
        Hab ich gemacht aber ausgeben tut mir das nichts oder muss ich da noch etwas mit echo machen??
        Könntest du mir das genauer erklären??

        Die Standard-Einstellung von error_reporting unterdrückt Meldungen vom Typ Notice. Diese kommen beispielsweise, wenn versucht wird, lesend auf nicht existierende Variablen zuzugreifen. Bei einem Tippfehler im Variablennamen erhält man eine solche Meldung, aber auch, wenn man vergessen hat, seine Variablen explizit zu initialisieren.

        PS: an den einstellungen der php.ini kann der fehler nicht liegen, oder???

        Das kann man erst dann sagen, wenn man die Ursache kennt. Was hast du bisher an Kontrollausgaben gemacht? Man kann damit nicht nur Variableninhalte anzeigen sondern auch die Ergebnisse von Ausdrücken. var_dump(isset($_POST["Passwort"])); könnte dir beispielsweise ein FALSE anzeigen. Dann könntest du dich auf die Suche nach der Ursache dafür begeben. var_dump($_POST); könnte dann ergeben, dass es kein Element namens Passwort gibt, aber eins das passwort heißt. Kontrollausgaben zu machen ist eine grundlegende Fehlersuchmethode, die du immer wieder benötigst, um die Differenzen zwischen Wunsch und Wirklichkeit ausfindig zu machen.

        echo "$verabschiedung $name";

  3. Hallo,

    Was gleich ins Auge sticht, ist das du nur zwei Fälle abfragst.

    Entweder es werden beide Angaben richtig eingegeben (was auch gewünscht ist), oder es werden beide Angaben falsch eingegeben (da du die zwei Abfragen mit und verknüpfst), daher kann nichts passieren wenn du nur das Passwort oder nur den Benutzernamen falsch eingibst.

    Besser wäre es wenn du die zweite Abfrage (elseif) weglässt und stattdessen direkt einen unbedingten Zweig machst (else). Dann ist immer wenn etwas nicht richtig eingegeben wurde automatisch falsch.

    Gruß,

    Fay