Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 4 - Dateien auslesen

1. Die Abschnitte

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.'/'.$file0666);
  // 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 (=== 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