Ankündigung

Einklappen
Keine Ankündigung bisher.

Wo ist der Fehler?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wo ist der Fehler?

    Hallo,
    also, ich habe ein Login-Script, welches auf Sessions basiert:

    intern.php
    Code:
    <?php
    include ("checkuser.php");
    ?>
    <html>
    <head>
      <title>Interne Seite</title>
    </head>
    <body>
      BenutzerId: <?php echo $_SESSION["user_id"]; ?>
    
      Nickname: <?php echo $_SESSION["user_nickname"]; ?>
    
      Nachname: <?php echo $_SESSION["user_nachname"]; ?>
    
      Vorname: <?php echo $_SESSION["user_vorname"]; ?>
      <hr>
      Ausloggen
    </body>
    </html>
    checkuser.php
    Code:
     <?php session_start (); ?>
    <html>
    <head>
      <title>Checkuser</title>
    </head>
    <body>
    <?php
    if (!isset ($_SESSION["user_id"]))
    {
      header ("Location: formular.php");
    }
    ?> 
    </body>
    </html>
    formular.php
    Code:
     <?php session_start (); ?>
    <html>
    <head>
      <title>Login</title>
    </head>
    
    <body>
    <?php
    if (isset ($_REQUEST["fehler=1"]))
    {
      echo "Die Zugangsdaten waren ungültig.";
    }
    ?>
    <form action="login.php" method="post">
      Name: <input type="text" name="name" size="20">
    
      Kennwort: <input type="password" name="pwd" size="20">
    
      <input type="submit" value="Login">
    </form>
    </body>
    </html>
    login.php
    Code:
     <?php
    session_start ();
    ?>
    <html>
    <head>
      <title>Login</title>
    </head>
    <body>
    <?php
    // Datenbankverbindung aufbauen
    $connectionid = mysql_connect ("turbozoidberg.planet-school.de", "m38**-1", "*****");
    if (!mysql_select_db ("m38**-1", $connectionid))
    {
      die ("Keine Verbindung zur Datenbank");
    }
    
    $sql = "SELECT ".
        "Id, Nickname, Nachname, Vorname ".
      "FROM ".
        "benutzerdaten ".
      "WHERE ".
        "(Nickname like '".$_REQUEST["name"]."') AND ".
        "(Kennwort = '".md5 ($_REQUEST["pwd"])."')";
    $result = mysql_query ($sql);
    
    if (mysql_num_rows ($result) > 0)
    {
      // Benutzerdaten in ein Array auslesen.
      $data = mysql_fetch_array ($result);
    
      // Sessionvariablen erstellen und registrieren
      $_SESSION["user_id"] = $data["Id"];
      $_SESSION["user_nickname"] = $data["Nickname"];
      $_SESSION["user_nachname"] = $data["Nachname"];
      $_SESSION["user_vorname"] = $data["Vorname"];
    
      header ("intern.php");
    }
    else
    {
      header ("formular.php?fehler=1");
    }
    ?> 
    </body>
    </html>
    logout.php
    Code:
     <?php
    // Wird ausgeführt um mit der Ausgabe des Headers zu warten.
    ob_start ();
    
    session_start ();
    session_unset ();
    session_destroy ();
    ?>
    <html>
    <head>
      <title>Logout</title>
    </head>
    <body>
    <?php
    header ("Location: formular.php");
    ob_end_flush ();
    ?> 
    </body>
    </html>
    Soweit so gut. Aber es hat 2 Fehler:

    1. Beim Login
    Wenn man sich einloggt, dann kommt folgende Fehlermeldung:
    Warning: Cannot modify header information - headers already sent by (output started at /home/www/kunden/domain.de/intern/login.php:9) in /home/www/kunden/domain.de/intern/login.php on line 37
    Allerdings kann man hinterher die Datei "intern.php" aufrufen, und man gilt als "eingeloggt"...

    2. Nicht eingeloggt, aber Versuch von Zugriff auf "intern.php"
    Ruft man die Datei "intern.php" auf, und ist NICHT eingeloggt, kommt diese Fehlermeldung:
    Warning: Cannot modify header information - headers already sent by (output started at /home/www/kunden/domain.de/intern/checkuser.php:7) in /home/www/kunden/domain.de/intern/checkuser.php on line 10
    und die seite wird angezeigt (bis auf, dass die daten nicht ausgelsen werden können).

    Das Script online könnt ihr euhc hier angucken:
    Link rausgenommen

    Die Daten:
    Nickname: admin
    Passwort: admin

  • #2
    nen leerzeichen wurde gesendet, bevor session_start initialisiert wurde.
    was nicht sein darf

    nicht so..
    Code:
     <?php 
    session_start (); 
    ?>

    wenn dann so..
    Code:
    <?php 
    session_start (); 
    ?>

    Kommentar


    • #3
      Hi ich hab genau den gleichen Fehler..

      Und @ Clan .. Das funktioniert trotzdem nicht

      bye

      Kommentar


      • #4
        dann ahste warscheinlich ne html-ausgabe gehabt, bevor die session gestartet bzw. ne session erstellt wurde.

        Kommentar


        • #5
          Danke für die Antwort! Aber daran kanns nicht liegen. Der Fehler war nur beim Einfügen hier ins Forum... Außerdem funzt "intern.php" ja. Nur nihct "checkuser.php" und "login.php"... thx

          Kommentar


          • #6
            Zitat von DaNnYy
            Danke für die Antwort! Aber daran kanns nicht liegen.
            Natürlich liegt es daran, wie Du der Fehlermeldung ja entnehmen kannst.

            Fehler:
            1. in intern.php wird keine Session gestartet
            2. in checkuser wird die Session korrekt gestartet, aber vor header() HTML ausgegeben.
            3. da Du keinen Fallback (Client will keinen Keks) vorsiehst, wird sich die Freude an dem Script sicher in Grenzen halten.
            4. header('Location: ...') erfordert einen absoluten URL (siehe Beispiel im Handbuch)
            5. nach dem Location-header muß ein exit folgen.
            6. formular.php wäre fast richtig. Da Du aber auch da keinen Fallback für die Session_id vorsiehst... (s.o.)
            7. login.php ist ebenfalls Murks. Auch hier gibts Du HTML aus.
            Sowas ist Humbug:
            Code:
            header ("intern.php");
            } 
            else 
            { 
              header ("formular.php?fehler=1"); 
            }
            PHP kann den header nicht wegschicken, da Du schon Content ausgegeben hast, und der Client könnte mit dem Header nix anfangen, weil er falsch ist.
            8. logout.php ist ebenfalls Humbug. Ebenfalls wird dort sinnfreies HTML ausgegeben, was keinen interessiert, denn der Client soll ja stattdessen einen anderen URL anfordern.
            9. auch hier wieder ein relativer URL in Location.

            Kommentar


            • #7
              man kann natürlich auch einfach mal in die standardfehlermeldungen schauen und sich das ganze gefrage hier ersparen ..

              http://www.dclp-faq.de/ch/ch-errors.html
              [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

              Kommentar


              • #8
                Danke für die Antwort! Hab jetzt alles berichtigt...
                Nur bei Nr. 7 weiß ich nicht, wie ich das ändern soll

                achja: wegen den "keksen": da hab ich schon was gefunden: http://www.dclp-faq.de/q/q-sessions-cookie.html *gg*

                @ Ben: Danke für den Link!

                Kommentar


                • #9
                  Zitat von DaNnYy
                  Danke für die Antwort! Hab jetzt alles berichtigt...
                  Nur bei Nr. 7 weiß ich nicht, wie ich das ändern soll
                  Das HTML löschen, weil Du ja den Client entweder zu formular.php oder zu intern.php schicken willst.
                  Das muß geändert werden:
                  Code:
                  if (mysql_num_rows ($result) > 0) 
                  { 
                    // Benutzerdaten in ein Array auslesen. 
                    $data = mysql_fetch_array ($result); 
                  
                    // Sessionvariablen erstellen und registrieren 
                    $_SESSION["user_id"] = $data["Id"]; 
                    $_SESSION["user_nickname"] = $data["Nickname"]; 
                    $_SESSION["user_nachname"] = $data["Nachname"]; 
                    $_SESSION["user_vorname"] = $data["Vorname"]; 
                  
                    session_write_close();
                    header ('Location: http://' . $_SERVER['SERVER_NAME'] . '/intern.php?' . SID); 
                  } 
                  else 
                  {
                    session_write_close();
                    header ('Location: http://' . $_SERVER['SERVER_NAME'] . '/formular.php?fehler=1&' . SID); 
                  } 
                  exit;
                  # Scriptende!
                  ?>
                  Die anderen Script sinngemäß anpassen. Beachte, daß Du bei formular.php ebenfalls dann die Session_id übergeben mußt, wenn der Client keinen Keks haben wollte.

                  Kommentar


                  • #10
                    Ich weiß, ich nerve, aber ich habe immernohc folgendes Problem:
                    bei ungültigem Login, wird man zwar zum Loginformular zurückgeleitet, allerdings gibt der Server die Fehlermeldung (Das der Login ungültig ist) nicht aus...

                    Die login.php sieht jetzt so aus:
                    Code:
                    <?php
                    session_start ();
                    
                    // Datenbankverbindung aufbauen
                    $connectionid = mysql_connect ("turbozoidberg.planet-school.de", "m3861-1", "***");
                    if (!mysql_select_db ("m3861-1", $connectionid))
                    {
                      die ("Keine Verbindung zur Datenbank");
                    }
                    
                    $sql = "SELECT ".
                        "Id, Nickname, Nachname, Vorname ".
                      "FROM ".
                        "benutzerdaten ".
                      "WHERE ".
                        "(Nickname like '".$_REQUEST["name"]."') AND ".
                        "(Kennwort = '".md5 ($_REQUEST["pwd"])."')";
                    $result = mysql_query ($sql);
                    
                    if (mysql_num_rows ($result) > 0)
                    {
                      // Benutzerdaten in ein Array auslesen.
                      $data = mysql_fetch_array ($result);
                    
                      // Sessionvariablen erstellen und registrieren
                      $_SESSION["user_id"] = $data["Id"];
                      $_SESSION["user_nickname"] = $data["Nickname"];
                      $_SESSION["user_nachname"] = $data["Nachname"];
                      $_SESSION["user_vorname"] = $data["Vorname"];
                    
                      session_write_close();
                      header ('Location: http://' . $_SERVER['SERVER_NAME'] . '/intern/intern.php?' . SID);
                    }
                    else
                    {
                      session_write_close();
                      header ('Location: http://' . $_SERVER['SERVER_NAME'] . '/intern/formular.php?fehler=1&' . SID);
                    }
                    exit;
                    # Scriptende!
                    ?>

                    Kommentar


                    • #11
                      Zitat von DaNnYy
                      Ich weiß, ich nerve, aber ich habe immernohc folgendes Problem:
                      bei ungültigem Login, wird man zwar zum Loginformular zurückgeleitet, allerdings gibt der Server die Fehlermeldung (Das der Login ungültig ist) nicht aus...
                      Weil das falsch ist:
                      Code:
                      if (isset ($_REQUEST["fehler=1"])) <--
                      { 
                        echo "Die Zugangsdaten waren ungültig."; 
                      }
                      Richtig wäre:
                      Code:
                      if (isset ($_REQUEST['fehler]) AND $_REQUEST['fehler] == 1)
                      { 
                        echo "Die Zugangsdaten waren ungültig."; 
                      }

                      Kommentar


                      • #12
                        Danke für euere Hilfe!! Es funktioniert jetzt alles! Vielen Dank!!!

                        Kommentar

                        Lädt...
                        X