PHP/MySQL - Praxistutorial 4 - Dateien auslesen
1. Die Abschnitte
- Überblick
- Das Formular
- Zugriffsrechte
- Grundsätzliches
- Der Upload
- Rechte setzen
- Dateien auslesen
- Dateien anlegen
- Dateien löschen
2. Die Datei prüfen
Ich habe euch im Ordner files
ja schon die entsprechende Textdatei zur Verfügung gestellt. Allerdings weiß man ja nie,
was die Leute so hochladen. Dazu sollte man immer(!) zuerst den Dateityp prüfen. In diesem Fall akzeptieren wir also nur reine
Textdateien.
if ($_FILES['datei']['error'] == 0)
{
// Ergänzung zum bestehenden Code
if ($_FILES['datei']['type'] == 'text/plain')
{
// alter Code bleibt wie er ist
...
}
else
{
return 'Zu blöde, um eine Textdatei zu erkennen?';
}
}
3. Die Datei auslesen
Dazu nehmen wir diesmal eine neue Funktion. Ihr Aufruf erfolgt aber in der schon existierenden. Als Parameter übergeben wir den relativen
Pfad. Denn wenn wir nur die Datei übergeben, weiß die Funktion getData
nicht, wo sie suchen muss. Das ist übrigens ein
klassischer Anfängerfehler.
if (move_uploaded_file($file_tmp, $folder.'/'.$file))
{
chmod ($folder.'/'.$file, 0666);
// Funktion getData aufrufen
$read = getData($folder.'/'.$file);
...
}
4. Die Funktion getData
Jetzt wollen wir alle Zeilen auslesen und nur die in einem Array zurückgeben, die mit einen b anfangen. Klingt ziemlich seltsam, aber was
soll's. Dabei gibt es zwei Möglichkeiten. Man kann zum Beispiel mit file_get_contents
arbeiten. Dabei wird der Inhalt der
Datei in einem Rutsch eingelesen. Allerdings muss man anschließend mit explode
arbeiten und da kann es ein paar Probleme
bezüglich des Zeilenumbruchs geben, also die Sache mit dem \n
unter Linux und dem \r\n
unter Windows. Wen es
trotzdem interessiert, in der Lösung gibt es eine auskommentierte Variante dazu. Kommen wir nun zur anderen Möglichkeit.
function getData($file)
{
if (is_readable($file))
{
$found = array();
$open = fopen($file, 'r');
while ($line = fgets($open))
{
if (0 === strpos($line, 'b'))
{
$found[] = trim($line);
}
}
fclose($open);
return ($found);
}
else
{
die ('Darf ich nicht lesen');
}
}
Erläuterung
Zunächst mal sollte man prüfen, on man überhaupt die notwendigen Leserechte für die Datei hat. Das geschieht mit if
(is_readable($file))
. Ansonsten wird die Abarbeitung des Scriptes mittels einer die
-Meldung beendet.
Wichtig!
So langsam solltet ihr gemerkt haben, dass die Vorgehensweise mit den Meldungen ziemlich sch***e ist. Ich mache das hier auch nur
aus Anschauungsgründen, da es mit dem eigentlichen Thema nichts zu tun hat. Außerdem will ich euch zeigen, dass man bei Rückgabewerten
niemals(!) mit solchen Zeichenketten arbeiten darf. Stattdessen sollte man mit true
, false
oder
Variablen beziehungsweise Arrays arbeiten. Darauf gehe ich aber ein anderes Mal ein.
Der weitere Code
Mit $open = fopen($file, 'r');
öffnen wir die Datei. Mit dem zweiten Parameter sagen wir, dass sie nur ausgelesen werden
soll. $open
dient dabei als eine Art von Zeiger auf die Datei. Dann wird der Inhalt zeilenweise(!) ausgelesen. Die Schleife
läuft dabei so lange, bis das Ende der Datei erreicht ist (while ($line = fgets($open))
).
Mit if (0 === strpos($line, 'b'))
prüfen wir, ob die jeweilige Zeile mit einem b beginnt. Wenn dem so ist, schreiben wir
den Inhalt in das Array $found
. Danach schließen wir die Datei mit fclose
und geben das Array zurück an die
Funktion uploadFile
. Ach ja, mit trim
entfernt man alle so genannten Whitespace-Zeichen am Anfang und Ende
der jeweiligen Zeile. Und dazu gehören auch Zeilenumbrüche. Weswegen wir das machen, verrate ich später.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt