PHP-Newbie: LOGIN-Script

Hallo! Habe mir nen Script zum Login gebastelt! Ich bekomme bloß immer, egal was ich für einen Benutzernamen eingebe; Benutzer existiert nicht! Die Benutzer werden in einer User.txt angelegt!

Auch wenn ich einen Benutzer anlegen kommt; Benutzer schon vorhanden!

Was mache ich falsch? Hier mal meine beiden Dateien;

LOGIN.PHP

<html>
<head>
<title>Login</title>
<meta name="author" content="Andavos">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<br><br>

<?php

$username = $_POST["username"];
$password = $_POST["password"];
$password = md5($password);
$log=0;

$userdatei = fopen ("user.txt","r");
while (!feof($userdatei))
   {
   $zeile = fgets($userdatei,500);
   $userdata = explode("|", $zeile);

if ($userdata[0]==$username and $password==trim($userdata[1]))
      {
      echo "Benutzername: $username";
      $log = 1;
      }
   }
fclose($userdatei);

if ($log==0)
   {
   echo "Zugriff verweigert <a href="login.html">Zur&uuml;ck</a>";
   }
?>
</body>
</html>

EINTRAGEN.PHP

<html>
<head>
<title>Neuen Benutzernamen Registieren></title>
<meta name="author" content="Andavos">
<meta name="generator" content="Symtec Development Studio 2.0">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<?php
$username = $HTTP_POST_VARS["username"];
$password = $HTTP_POST_VARS["password"];
$password2 = $HTTP_POST_VARS["password2"];

if ($password == $password2)
   {
   $user_vorhanden = array();
   $password = md5($password);

$userdatei = fopen ("user.txt","r");
   while (!feof($userdatei))
      {
      $zeile = fgets($userdatei,500);
      $userdata = explode("|", $zeile);
      array_push ($user_vorhanden,$userdata[0]);
      }
   fclose($userdatei);

if (in_array($username,$user_vorhanden))
      {
      echo "Username schon vorhanden <br> <a href="eintragen.html">zur&uuml;ck</a>";
      }

else
      {
      $userdatei = fopen ("user.txt","a");
      fwrite($userdatei, $username);
      fwrite($userdatei, "|");
      fwrite($userdatei, $password);
      fwrite($userdatei, "\n");
      fclose($userdatei);
      echo "$username, deine Anmeldung war erfolgreich<br><a href="login.html">zum Login</a>";
      }
   }

else
  {
  echo "Die Passw&ouml;rter sind nicht identisch<br> <a href="eintragen.html">zur&uuml;ck</a> ";
  }

?>

</body>
</html>

Danke schonmal für eure Hilfe! Ist bestimmt nur eine Kleinigkeit oder?

  1. Ich fürchte, dass diese Informationen nicht ausreichen, um dir zu helfen. Allerdings vorweg ein paar kleine Anmerkungen:

    Du verschmischst $HTTP_POST_VARS und $_POST in deinem Skript, versichte auf ersteres und verwende $_POST. Das neuregistrieren von Variablen in denen du 1 zu 1 deine POST-Werte speicherst ist völlig überflüssig.

    Ansonsten würde ich dir vorschlagen mittels var_dump auszugeben, was tatsächlich in deinen Variablen steht und inwieweit diese nicht identisch sind.

    1. Würdest du bitte noch etwas Zeit investieren und es mir etwas umbauen und dann wieder zu posten??

      Würde mir einem kostenlosen Abbo auf unserer Seite dir gern entgegenkommen!

      Mfg.

  2. Hallo PHP Newbie,
    wie sieht denn die HTML Seite mit den Formularen aus? Stimmen die Namen der input-Felder?
    Noch zu dem, was Rafael sagt:

      
    $username = $HTTP_POST_VARS["username"];  
    
    

    ist (vielleicht) eine Erleichterung für dich beim späteren Lesen des Scriptes, aber notwendig ist es nicht. Mann könnte auch direkt mit den $_POST Variablen arbeiten. Ich perönlich betreibe allerdings sogar meistens etwas mehr Aufwand und schreibe so etwas:

      
    if(isset($_POST["username"]))  
    {  
       $username = $_POST["username"];  
    }  
    else  
    {  
       $username="";  
    }  
    
    

    oder etwas verkürzt:

      
    $username = isset($_POST["username"])?$_POST["username"]:"";  
    
    

    Die beiden Beispiele bewirken exakt dasselbe, allerdings könnte es sein, dass Variante 1 für einen Newbie leichter nachzuvollziehen ist.
    Zur Erklärung von Variante 2(Falls du den ? Operator noch nicht kennst und neugierig bist...)

    (Hoffe, dass mir die Experten das jetzt nicht um die Ohren hauen - klar ist das etwas mehr Aufwand und wenn es um performance ginge, würde ich es auch weglassen, aber ich denke, bei kleinen (halb)privaten Web-projekten kommt es nu darauf nicht wirklich an. Vor allem habe ich dadurch die Variablen, die ich benutze sauber initialisiert. Bei deiner variante gibt es nämlich beim Aufruf des Skriptes ohne Übergabe von $_POST Warnmeldungen (die du wahrscheinlich nicht siehst, weil dein error_reporting standardmäßig nur die Fehler anzeigt).

    Wenn du am Anfang deines Skriptes

      
    error_reporting(E_ALL);  
    
    

    schreibst siehst du, was ich meine

    Noch etwas Lektüre zum error_reporting

    (Habe gerade gesehen: Leider ist der deutsche Text auch teilweise auf Englisch und da außerdem die englische Variante bei PHP oft aktueller ist hier nochmal auf englisch:
    error_reporting(englisch))

    Liebe Grüße mbr

    1. Hallo! Danke erstmal für eure Antworten!

      Also die Formulare stimmen! Hier nochmal die Formulare;

      LOGIN.HTML

      <HTML>
         <HEAD>
         </HEAD>
         <BODY bgcolor="#FF0000">
            <form method="post" action="login.php">
            <table border="0">
               <tr>
                  <td>
                     <table border="0">
                        <tr>
                           <td><img src="images/key.ico"></img></td>
                           <td valign="middle"><font size="+1"><b>Authentifizierung</b></font></td>
                        </tr>
                     </table>
                  </td>
               </tr>
               <tr>
                  <td><font size="-1"><b>Benutzername</b></font><br><input type="text" name="username" maxlength="20"></td>
               </tr>
               <tr>
                  <td><font size="-1"><b>Password</b></font><br><input type="password" name="password" maxlength="20">&nbsp;&nbsp;&nbsp;<input type="submit" value="Login"></td>
               </tr>
               <tr>
                  <td><br></td>
               </tr>
            </table>
            </form>
         </BODY>
      </HTML>

      EDIT_USER.PHP

      <?
      if ($edit)
      {
      $handler = fopen("user.txt","w");
      if(fputs($handler, $textfile)) {
      $gespeichert = 1;}
      fclose($handler);
      }
      ?>

      <HTML>
         <HEAD>
         </HEAD>
         <BODY bgcolor="#E6E6FA">
         <table width="100%" border="0">
            <tr>
               <td>
                  <FORM ACTION="edit_user.php" METHOD="post">
                  <table border="0">
                     <tr>
                        <td colspan="2"><font size="+1"><b>Administratoren bearbeiten:</b></font></td>
                     <tr>
                        <td><input type="hidden" name="edit" value="1"><TEXTAREA NAME="textfile" COLS="40" ROWS="15"><?readfile("user.txt");?></TEXTAREA></td>
                     <tr>
                        <td><INPUT TYPE="Submit" VALUE="Speichern">&nbsp;&nbsp;&nbsp;<input type="button" onclick="javascript:location.reload()" value="Aktualisieren">&nbsp;&nbsp;&nbsp;<? if($gespeichert){echo "<font color=FF0000>Auml;nderungen erfolgreich gespeichert!</font>";}?></td>
                  </table>
                  </FORM>
               </td>
            </tr>
            <tr>
               <td>
                  <form method="post" action="eintragen.php">
                  <table border="0">
                     <tr>
                        <td colspan="2"><br><br><br><font size="+1"><b>Administrator hinzuf&uuml;gen:</b></font></td>
                     <tr>
                        <td><b>Benutzername:</b></td>
                        <td><input type="text" name="username"></td>
                     <tr>
                        <td><b>Password:</b></td>
                        <td><input type="password" name="password"></td>
                     <tr>
                        <td><b>Password wiederholen:</b></td>
                        <td><input type="password" name="password2"></td>
                     <tr>
                        <td></td>
                        <td><INPUT TYPE="submit" VALUE="Hinzuf&uuml;gen"></td>
                  </table>
                  </FORM>
               </td>
            </tr>
         </table>
         </BODY>
      </HTML>

      So mehr habe ich nicht! Das ist alles was mit dem Login zu tun hat!

      Könntet ihr mir zeigen, was ich falsch gemacht habe und es eventuell einbauen, damit ich es besser nachvollziehen kann!?

      1. n'Abend!

        EDIT_USER.PHP

        <?

        Autsch. Verwende bitte immer die Langform <?php anstatt der Kurzschreibweise. Die short_open_tags sind auf vielen Servern nicht zulässig, und im Zusammenhang mit XML machen sie gelegentlich sogar Probleme.

        if ($edit)

        Autsch. Noch lauter.
        Verwende IMMER die superglobalen Arrays $_GET[] oder $_POST[], um auf Formulardaten zuzugreifen, anstatt dich auf register_globals zu verlassen, das leider immer noch bei manchen Hostern aktiviert ist.
        Außerdem übernimmst du hier ungeprüft jeden Unsinn, der als Eingabe ankommt. Das ist sehr leichtsinnig!

        {
        $handler = fopen("user.txt","w");
        if(fputs($handler, $textfile)) {
        $gespeichert = 1;}
        fclose($handler);
        }

        Ob das Schreiben der Datei erfolgreich war, prüfst du hier auch nicht.

        <HEAD>
           </HEAD>

        Fehler: Das title-Element fehlt.
        Oder hast du das nur hier im Posting weggelassen?

        <TEXTAREA NAME="textfile" COLS="40" ROWS="15"><?readfile("user.txt");?></TEXTAREA>

        Hier gibst du auch wieder den Inhalt von user.txt ohne jegliche Prüfung als Text aus. Wenn innerhalb der user.txt ausgerechnet mal die Zeichenfolge </textarea> vorkommen sollte, ist dein gesamtes HTML-Dokument versaut.

        <input type="button" onclick="javascript:location.reload()" value="Aktualisieren">

        Wozu das? Jeder Browser verfügt über die Möglichkeit, die angezeigte Seite neu zu laden. Das brauchst du nicht noch einmal nachzubilden.

        Könntet ihr mir zeigen, was ich falsch gemacht habe und es eventuell einbauen, damit ich es besser nachvollziehen kann!?

        Stelle dein error_reporting auf E_ALL, falls das noch nicht geschehen ist. Kontrolliere doch mal, was vor und nach dem Aufruf von edit_user.php tatsächlich in der Datei user.txt steht. Werden die übergebenen Daten überhaupt eingetragen und gespeichert? Kontrolliere die Rückgabewerte der Funktionen, die du verwendest, um festzustellen, ob sie erfolgreich waren oder nicht.

        So long,
         Martin

        --
        Der Alptraum jedes Computers:
        "Mir war, als hätte ich gerade eine 2 gesehen."