PHP/MySQL - Praxistutorial 4 - Dateien anlegen
1. Die Abschnitte
- Überblick
- Das Formular
- Zugriffsrechte
- Grundsätzliches
- Der Upload
- Rechte setzen
- Dateien auslesen
- Dateien anlegen
- Dateien löschen
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.'/'.$file, 0666);
$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