Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 4 - Dateien anlegen

1. Die Abschnitte

2. Das Ergebnis

... der letzten Aktion wollen wir nun in eine neue Datei schreiben. Wir haben also ein Array mit drei Einträgen. Dazu muss die bestehende Funktion uploadFile ein wenig modifiziert werden.


if (move_uploaded_file($file_tmp$folder.'/'.$file))
{
  chmod ($folder.'/'.$file0666);
  $read getData($folder.'/'.$file);
  if (count($read) > 0)
  {
    $set writeFile($read);
    return 'Supi, hat geklappt';
  }
  else
  {
    return ('Nix zum Schreiben da');
  }            
}

Erläuterung

Dass die Sache mit den Meldungen als Rückgabewert sch***e ist, habe ich schon gesagt. Und dass die Behandlung möglicher Fehler nicht hundertprozentig sicher auch. Darum überprüfen wir hier zumindest, ob uns die Funktion getData mindestens einen Eintrag übergibt, denn sonst haben wir ja nichts zum Schreiben.

3. In eine neue Datei schreiben

Auch hier gibt es wieder zwei Möglichkeiten. Zunächst mal nehmen wir die "konservative" Variante über fwrite.


function writeFile($data)
{
  if ($open fopen('bla/test.txt''w'))
  {
    for ($i 0$i count($data); $i++)
    {
      fwrite ($open$data[$i]."\n");
    }
    fclose($open);
    return true;
  }
  else
  {
    die ('Kann Datei nicht anlegen');
  }
}

Erläuterung

Mit $open = fopen('bla/test.txt', 'w') öffnen wir die Datei test.txt im Ordner bla. Wenn sie nicht vorhanden ist, so versucht PHP sie anzulegen und gibt im Erfolgsfall ein true zurück. Darum habe ich das auch direkt in die if-Bedingung integriert. Und nicht intrigiert, wie manche gerne schreiben. Mit dem Parameter w setzen wir den Status auf schreibbar (writeable).

Dann wird das Array $data durchlaufen und die Werte in die test.txt eingetragen. Zu der Sache mit dem \n komme ich gleich. Wer sich jetzt noch fragt, warum wir vorher nicht das Attribut a (append) genommen haben, dem sage ich, herzlichen Glückwunsch. Da hat sich einer schlau gemacht! Also, w habe ich gewählt, weil wir eine neue Datei anlegen. Wenn aber bereits eine mit Inhalt existiert und wir den nicht verlieren möchten, so muss natürlich mit a gearbeitet werden.

Danach wird die Datei geschlossen und wir geben mit return true zum zweiten Mal in diesem Tutorial einen vernünftigen Wert zurück. Das erste Mal war das return ($found). Allerdings haben wir hier immer noch die Krücke mit dem die-Befehl. Darum zeige ich euch mal eine vernünftige Variante.

4. Eine Alternative

Anstelle einer Schleife bietet sich file_put_contents an. Denn damit schreiben wir die Daten in einem Rutsch in die Datei.


function writeFile($data)
{
  $put file_put_contents('bla/test.txt'implode("\n"$data));
  if ($put)
  {
    return true;
  }
  else
  {
    return false;
  }
}

Erläuterung

Damit das funktioniert, müssen wir noch unser Array umwandeln, denn sonst stände selbiges als String in der Datei. Das geschieht mit implode. Da werden nämlich die einzelnen Elemente zu einer(!) Zeichenkette zusammengefügt. Der erste Parameter ist hierbei das Füllzeichen, mit dem die jeweiligen Werte getrennt werden. Wir nehmen dafür einen Unix-Zeilenumbruch, also das "\n". Kennt ihr schon vom vorherigen Beispiel.

file_put_contents ist eine Kombination aus fopen, fwrite und fclose. Wenn die Datei nicht existiert, so wird versucht, sie anzulegen. Ansonsten wird sie überschrieben. Das kann man umgehen, wenn man als zusätzlichen Parameter FILE_APPEND angibt. Dann wird der neue Inhalt angehängt.

Wichtig

Ihr dürft das niemals in Hochkommata setzen, also '\n'. Denn dann wird es nicht als Zeilenumbruch erkannt, sondern nur als schnödes \n. Probiert es ruhig mal aus. Dann seht ihr es.

5. Die Sache mit dem Umbrüchen

Wie ich vorher schon kurz erwähnte, gibt es hier einen Unterschied zwischen Windows und Unix-Systemen. Denn bei Ersterem sieht ein Zeilenumbruch in einer nackten Textdatei so aus: \r\n. Darum wundert euch nicht, wenn ihr die test.txt im stinknormalen Notepad öffnet. Denn da gibt es keine Zeilenumbrüche sondern nur einen komische Kasten. Wenn ihr euch dagegen besagte Datei in einem vernünftigen(!) Editor anseht, so ist alles feini feini. Denn die können auch mit Unix-Umbrüchen umgehen.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt