Tom: file_exists - Groß-/Kleinschreibung ignorieren

Beitrag lesen

Hello,

Wie kann ich den Benutzernamen überprüfen, ohne dass nach GKS unterschieden wird?

indem Du eine Transformationstabelle zwischenschaltest.

Im Filesystem wird grundsätzlich nur eine Schreibweise (GROSS|klein) benutzt und außerdem in konsolidierter ("normalisierter") Form, also ausschkliesslich mit einer Untermenge von ASCII-Zeichen.

In einer anderen Datei (odr einer Datenbank) hältst Du eine Tabelle, in der die echten Namen stehen.

Beim Anlegen einer neuen Userdatei benutzt Du bitte _nicht_ file_exists(), denn das ist für diesen Zweck MIST! Du schaffst Dir damit ein "TOCTTOU"-Problem
https://de.wikipedia.org/wiki/Time-of-Check-to-Time-of-Use-Problem

Der richtige Weg wäre es, die Kontrolle dem Betriebssystem/Filesystem selber zu überlassen und dann die Fehlermeldung auszuwerten.

Schau dir dazu die Filefunktionen von PHP genauer an:
http://de2.php.net/manual/en/function.fopen.php

Für deinen Fall kommt der Open-Mode 'xb+' in Frage.

Bei der Fehlerauswertung ist PHP leider fast kurz vor Schrott, da es keine eindeutigen Fehlernummern für derartig wichtige Operationen liefert, aber es gibt eine Möglichkeit durch die Hintertür:

  
  
    ini_set('track_errors', 1)  
    $php_errormsg = '';  
    $fh = @fopen($normalized_username . '.txt', 'xb+');  
    if (!$fh)  
    {  
        # error_handling($php_errormsg);  
        # oder zum Testen:  
        echo htmlscpecialchars($php_errormsg);  
    }  
  

Probier das Scriptlein mal aus und schreib Dir dann eine Funktion error_handling()...
Einfach ein paarmal hintereinander aufrufen.

http://www.php.net/manual/de/reserved.variables.phperrormsg.php

Wenn die Operation erfolgreich war, kannst Du anschließend in ein Array eintragen

  
  
# normalisieren  
# nachschlagen  
# es ist nicht notwendig, eine Case-Insensitive Arrayabfrage durchzuführen, da der  
# Filename ohnehin nur in einer Schreibweise angenommen werden soll  
# Es kann ja auch nicht sichergestellt werden, ob der Host ein Filesystem führt,  
# das Groß-/Kleinschreibung unterscheidet... WinDOOF machts möglich :-O  
  
if (!isset($_filenames[$normalized_username]))  
{  
    $_filenames[$normalized_username] = $real_username;  
}  
  
$userfilenames = serialize($_filenames);  
  
# und wegschreiben in Datei.  
  

Lies Dir bitte auch den Artikel von Christian Seiler durch zum Thema File-Locking. Das solltest Du nämlich strikt beachten!

http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/

Viel Erfolg.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bikers-lodge.com