nokill: Fehler beim auslesen von $usertype aus Datei

Hi,

ich schreibe gerade an einem Login und ich möchte jetzt zwischen 2 Arten von Usern unterscheiden:
-user
-admin

dafür habe ich diese Auslese- und Abfrageroutine:
----------
     $datei = "userdatabase.txt";
     $zeile=file($datei,1024);
     for ($i=0, $richtig_var=0; $i<=count($zeile); $i++)
          {
               $gelesener_name=explode("||",$zeile[$i]);
               $usertype = $gelesener_name[2];
               if ($gelesener_name[0]==$name)
                    {
                         if (trim($gelesener_name[1])==$pw && ($usertype==user))
                              {
                                   $userlog = "true";
                              }
                         else if ((trim($gelesener_name[1])==$pw) && ($usertype==admin))
                              {
                                   adminlog = "true";
                              }
                         else
                              {
                                   $userlog = "false";
                                   $adminlog  = "false";
                              }
                     }
          }
----------

Meine userdatabase.txt ist so aufgebaut:
username||userpasswort||usertype

wobei usertype "admin" oder "user" ist

Wenn ich jetzt das 3array aus $gelesener_name, also $gelesener_name[2], ausgeben will, dann ist die Varible leer
Es wird also der usertype nicht in $gelesener_name[2] eingelesen!
wie bekomme ich das hin, dass in $gelesener_name[2] der usertype eingelesen wird?

wie immer schon mal thx im Vorraus

mfg nokill

  1. Hi nokill,


    $datei = "userdatabase.txt";
         $zeile=file($datei,1024);

    Den zweiten Parameter verstehe ich nicht, zumindest darf, wenn ich http://www.php.net/file richtig verstanden habe, da nur nichts oder 1 stehen.

    for ($i=0, $richtig_var=0; $i<=count($zeile); $i++)

    Du musst < und nicht <= schreiben, da count die Größe des Arrays zurückgibt, aber die Werte im Array bekanntlich bei 0 anfangen.

    {
                   $gelesener_name=explode("||",$zeile[$i]);
                   $usertype = $gelesener_name[2];
                   if ($gelesener_name[0]==$name)
                        {
                             if (trim($gelesener_name[1])==$pw && ($usertype==user))

    Das user würde ich mit Gänsefüßchen umgeben, ist schöner.

    {
                                       $userlog = "true";
                                  }
                             else if ((trim($gelesener_name[1])==$pw) && ($usertype==admin))
                                  {
                                       adminlog = "true";

    Da fehlt ein $

    }
                             else
                                  {
                                       $userlog = "false";
                                       $adminlog  = "false";
                                  }
                         }
              }

    Du machst folgenden großen Fehler:
    Dadurch das du die Datei in einer Schleife durchgehst, überschreibst du die alten Variablen bei jedem Durchgang. Und nachdem du zusätzlich < und nicht <= geschrieben hast, steht logischerweise in der letzen Zeile garnichts drinnen, und somit kommst du zu deinem falschem Ergebnis. Wenn du <= durch < ersetzt, bekommst du die Werte aus der letzen Zeile zurück, was du aber vermutlich nicht erreichen wolltest. Du solltest $userlog und $adminlog bevor die Schleife beginnt auf "false" setzen, und den else-Teil dann weglassen, somit wird nix da shconmal nixmehr überschrieben. Und dann erstelltst du eine weitere Variable, in die du das Array $gelsener_name überträgst, wenn Username und Passwort stimmen. Ich hoffe, das war jetzt ienigermaßen verständlich, bei meinem wirrem Geschreibe, wenn nicht, frag nochmal, dann tipp ich dir schnell ein Beispiel...

    Schöne Grüße
    Julian

    1. Hi Julian,

      meinst du so?
      ----------
           $datei = "userdatabase.txt";
           $zeile=file($datei,"r");
           $userlog = "false";
           $adminlog  = "false";
           for ($i=0, $richtig_var=0; $i<count($zeile); $i++)
                {
                     $gelesener_name=explode("||",$zeile[$i]);
                     $usertype = $gelesener_name[2];
                     if ($gelesener_name[0]==$name)
                          {
                               if (trim($gelesener_name[1])==$pw && ($usertype==user))
                                    {
                                         $userlog = "true";
                                    }
                               else if ((trim($gelesener_name[1])==$pw) && ($usertype==admin))
                                    {
                                         adminlog = "true";
                                    }
                           }
                }
      ----------

      mfg nokill

      1. Hi,

        Ich würde das Ende wie folgt schreiben:
        ------------------------------------------------------
        if (trim($gelesener_name[1])==$pw)
        {
           $ergebnis = $gelesener_name;

        if ($usertype == "admin")
              $adminlog = "true";
           else if ($usertype == "user")
              $userlog = "true";
        }
        -------------------------------------------------------
        Und dann hast du am Ende in $ergebnis[0] den richtigen Namen, in $ergebnis[1] das Passwort und in $ergebnis[3] den Usertype (welcher Zusätzlich noch über die Variablen $adminlog und $userlog herauszubekommen ist). (nicht getestet)

        Schöne Grüße
        Julian

  2. Hello,

    wieviele User willst Du mit der Textdatei-Variante verwalten? Werden es mehr als 1000? Sonst mach Dir das Leben nicht so schwer und lege alle Daten als großes Array in der Datei ab.

    $_userdata = array();

    $name = "PETER";
    $table = "guestbook";
    $_userdata[$name]['password']='hallo27d';
    $_userdata[$name]['rights'][$table]='SRWXCDA';
    $_userdata[$name]['longname']='Peter der Große';

    $name = "PAUL";
    $table = "guestbook";
    $_userdata[$name]['password']='08doof15';
    $_userdata[$name]['rights'][$table]='RW';
    $_userdata[$name]['longname']='Peter der Große';

    usw...

    Das hat den Vorteil, dass die Datenstruktur auch wachsen kann.
    Um das Array zu speichern, musst Du es serialisieren.

    Die Datei im a+ Modus öffnen und sperren, den Dateizeiger auf den Anfang zurückstellen, das Array auslesen (Datei vollständig einlesen) und deserialisieren, die Daten im Array updaten, Das Array wieder serialisieren, den Zeiger wieder auf 0 stellen, das Array wieder wegschreiben, die Datei nach der neuen Arraylange abschneiden (truncate()) und die Datei wieder schließen und damit entsperren.

    Jeder Zugriff auf die Datei muss mit der Sperrlogik erfolgen, damit Du nicht aus Versehen in einem Script gerade liest, wenn ein anderes mittem im Schreiben ist und umgekehrt.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen