Dateien & Ordner

file_put_contents()

In Text Datei schreiben

Mit PHP kann man etwas in eine Datei schreiben und diese Datei erzeugen, falls sie noch nicht vorhanden ist. Der Befehl dazu lautet

file_put_contents()

Die Parameter sind

  1. Der Name der Datei
  2. Der String, welcher in die Datei geschrieben werden soll
  3. FILE_APPEND fügt den Inhalt ans Ende der Datei.

Die Datei wird ohne Warnung überschrieben, wenn Sie keinen dritten Parameter hat.

Die Datei wird erzeugt, wenn sie nicht vorhanden ist.

Die Funktion liefert true, wenn der Vorgang erfolgreich war.

In diesem Beispiel wird durch den Silence Opertor @ am Anfang des Funktionsaufruf eine Fehlermeldung unterdrückt.

\n erzeugt Zeilenumbrüche.

   $inhalt = "Logbuch Eintrag: " .  date("d.m.Y / H:i") . "\n3\n44\n";
   //   die Datei wird ohne Warnung überschrieben mit file_put_contents()

   $datei = "datei.txt";
   if (@file_put_contents($datei, $inhalt) === false)
      exit("Fehler beim Schreiben");
   else
      echo "Daten in Datei geschrieben
"; $inhalt = "Letzte Zeile\n"; if (@file_put_contents($datei, $inhalt, FILE_APPEND) === false) exit("Fehler beim Anhängen"); else echo "Daten an Datei angehängt";

file_get_contents()

Textdatei auslesen

Man kann eine Textdatei auslesen und den Inhalt auf der PHP Seite ausgeben. Es kann auch eine CSV Datei sein. Der Befehl lautet

file_get_contents()

Der Parameter ist die auszulesende Datei.

Der ausgelesene Inhalt wird in einer Zeichenekette gespeichert.

nl2br()

Mit nl2br() werden die Zeilenumbrüche \n im Text in <br> umgewandelt.

    $datei = "datei.txt";
    $inhalt = @file_get_contents($datei);
    if ($inhalt === false)
        exit("Fehler beim Lesen");

    echo nl2br($inhalt);

file()

Textdatei auslesen, Zeilen in einem Array speichern

Mittels file() wird eine Textdatei ausgelesen und dabei Zeile für Zeile in den Feldern eines Feldes abgespeichert.

file()

Die Parameter sind

  1. Die auszulesende Datei
  2. FILE_IGNORE_NEW_LINES eine Anweisung die \n Zeilenumbrüche nicht mit zu schreiben.

Die Funktion liefert bei Erfolg true.

   $datei = "datei.txt";

   $feld = @file($datei, FILE_IGNORE_NEW_LINES);
   if (!$feld)
      exit("Fehler beim Lesen");
      
   for ($i = 0; $i < count($feld); $i++)
      echo $feld[$i]. "<br>";

CSV Datei auslesen

Eine CSV Datei ist eine Textdatei, mit einer datenbankähnlichen Struktur. Man kann Sie mit Excell öffnen und exportieren.

Zu diesem Beispiel

Im folgendem Beispiel wird auch wieder mit file() der Inhalt einer CSV Datei ausgelesen.

Die einzelne Zeile, welche einem Element von $feld_datei entspricht, wird wiederum in ein Feld $feld_zeile umgewandelt mit mb_split()
So kann man die einzelnen Elemente der Zeile umformatieren und dann ausgeben.

Die Formatierungen der einzelnen Felder.

4tes Element $feld_zeile[3] ist das Gehalt Anstatt eines Kommas wird ein Punkt gesetzt mit mb_ereg_replace() Dann wird es später mit floatval($gehalt) in eine Fließkommazahl umgwandelt

Der Index $feld_zeile[2] wird in eine Ganzzahl umgewandelt intval($feld_zeile[2])

Das Geburtsdatum wird mit date() formatiert.

 

    $datei = "datei.csv";
    $feld_datei = @file($datei, FILE_IGNORE_NEW_LINES);
    if (!$feld_datei)
        exit("Fehler beim Lesen");

    for ($i = 0; $i < count($feld_datei); $i++) {
        $feld_zeile = mb_split(";", $feld_datei[$i]);
        $gehalt = mb_ereg_replace(",", ".", $feld_zeile[3]);
        $geb = date("d.m.Y", strtotime($feld_zeile[4]));

        echo intval($feld_zeile[2]) . " : " . $feld_zeile[0] . " " . $feld_zeile[1] . " Gehalt: "
            . floatval($gehalt) . " €  geb: " . $geb  . "
"; }

stat()

Dateiinformationen abrufen

stat() liefert Informationen über Dateien. Es wird ein assoziatives Feld zurückgegeben, welches die Infos enthält.

Der erste Parameter von stat() ist der Pfad zur Datei.

Über folgende Schlüssel kann man Inforamtionen abrufen.

$stat = stat($datei);

   $datei = "datei.txt";
   $info = stat($datei);

   echo "Name: $datei <br>";
   echo "Größe: " . $info["size"] . " Byte <br>";
   echo "Letzter Zugriff: " . date("d.m.Y H:i:s", $info["atime"]) . " <br>";
   echo "Letzte Änderung: " . date("d.m.Y H:i:s", $info["mtime"]) . " <br>";

Verzeichnisse einlesen

siehe auch diesen php-kurs Tipp

Mit PHP kann man Verzeichnisse auslesen und Informationen über die darin liegenden Dateien und Ordner abrufen.

Zuerst wird ein Pfad zum Verzeichnis erstellt, siehe dazu auch Verzeichnispfad.

opendir() öffnet das Verzeichnis über einen Zugriffshandle. Ein Pfad zum Verzeichnis wird erwartet

readdir()welches über den Zugriffshandle aufgerufen wird, übergibt den Namen der Datei und setzt den Zeiger auf die nächste Datei. In einer while Schleife wird dieser Vorgang wiederholt, bis keine Datei mehr vorhanden ist. Eine Sortierung findet nicht statt.

    $verzeichnis = '.';
    $handle = opendir($verzeichnis);
    while ($name = readdir($handle)) {
        if (is_file($name))
            echo $name . '<br>';
    }

Funktionen für Dateiinformationen

siehe auch stat()

Es gibt 5 Methoden, die Informationen über eine Datei oder ein Verzeichnis liefern. Alle geben einen Boolschen Wert zurück. Alle erwarten als erste Argument einen Handle der mit opendir() und readdir() erzeugt wird.

is_file()

wenn es eine Datei ist
is_dir()

true wenn es ein Ordner ist.
is_readable()

true wenn die Datei Leserechte besitzt
is_writable()

true wenn die Datei Schreibrechte besitzt

Das folgende Beispiel, ist extra einfach gehalten. Eine Tabelle wäre übersichtlicher.

    $verzeichnis = '.';
    $handle = opendir($verzeichnis);
    while ($name = readdir($handle)) {
        echo $name . " ";

        if (is_file($name))
            echo " / Datei ";
        if (is_dir($name))
            echo " / Verzeichnis ";
        if (is_readable($name))
            echo " / Schreibrechte /";
        if (is_writeable($name))
            echo " / Leserechte / ";

        $info = stat($name);

        echo  $info["size"] . " Byte / ";
        echo "letzte Änderung: " . date("d,m,Y h:i", $info["mtime"]);

        echo "<br>";
    }

Verzeichnispfad absolut

Pfade zu Dateien oder Verzeichnissen werden öfter gebraucht. (include require opendir readir) Man kann absolute Adresse definieren

Lokal

$verzeichnis = "C:/wamp64/www/phpKurs/12_dateien/aufgaben";

WWW

$verzeichnis = "https://www.on-design.de/tutor/php/datei.php";

Verzeichnispfad relativ

getcwd()

Mittels der Funktion getcwd(), was soviel bedeutet wie get current working directory wird ein Pfad auf das aktuelle Verzeichnis gesetzt.

Dann kann man von da aus auf das eigene Verzeichnis mit "." oder auf das übergeordnete Verzeichnis mit ".." verweisen. Das Beispiel muss an einigen Stellen auf die eigene Ordnerstruktur angepasst werden.

getcwd();
$verzeichnis = "."; //eigenes Verzeichnis
$verzeichnis = ".."; // übergeordnetes Verzeichnis  
  

Hier nun ein paar Beispiele:

    getcwd();
    // ein Verweis auf das eigene Verzeichnis
    $handle = opendir(".");
    while ($name = readdir($handle)) {
        echo $name . " ";
    }
    echo " <br>";
    // ein Verweis auf das übergeordnete Verzeichns
    $handle = opendir("..");
    while ($name = readdir($handle)) {
        echo $name . " ";
    }
    echo " <br>";
    //ein Verweis auf einen Ordner innerhalb des aktuellen Verzeichnis
    $handle = opendir("01_variablen");
    while ($name = readdir($handle)) {
        echo $name . " ";
    }
    echo " <br>";
	//ein Verweis auf einen Ordner kunden, der sich im übergeordneten Verzeichnis befindet
    $handle = opendir("../kunden");
    while ($name = readdir($handle)) {
        echo $name . " ";
    }
    echo " <br>";
   
	//ein Verweis zwei Stufen höher
    $handle = opendir("../..");
    while ($name = readdir($handle)) {
        echo $name . " ";
    }
    echo " <br>";    

Verzeichnis mit realpath

Ein relativer Pfad ist in PHP nicht so einfach zu realisieren wie in HTML.

Siehe dazu Ulrischa.de relative Pfade in PHP

realpath()

Relative Pfade werden mit realpath() in absolute Pfade umgewandelt

Das folgende Beispiel geht in den übergeordneten Ordner und von da aus in den Ordner datum

$verzeichnis = realpath(dirname(__FILE__)) . '/../datum/';

Unlogischerweise muss ein Backslash vor dem relativen Pfad stehen

Man kann als Argument von dirname __FILE__ oder __DIR__ zuweisen, je nachdem, ob man auf eine Datei oder ein Verzeichnis verweisen möchte.

XML

fahrzeug.xml

fahrzeug.php / download

XML ist ein weitverbreitetes unabhängiges Format zum universellen Austausch von Daten. Der Aufbau von XML Daten ähnelt der Syntax von HTML.

Die PHP Erweiterung SimpleXML bietet in PHP die Möglichkeit Daten einzulesen, darzustellen und zu bearbeiten.

Aufbau einer XML Datei

siehe fahrzeug.xml im Browser

Die erste Zeile ist im Browser nicht sichtbar, sie kennzeichnet den Inhalt als XML

<?xml version="1.0"?>

Ähnlich wie HTML gibt es hier Anfangstags und Endtags. In XML vergibt man die Namen der Tags selber. Hier dürfen keine Sonderzeichen, Umlaute und Leerzeichen notiert werden. Man kann wie in HTML in den Anfangstags Attribute vergeben. Die Tags können verschachtelt sein. Dadurch entsteht eine hierachische Struktur von Objekteigenschaften:
fahrzeug->motordaten->leistung
Auf der obersten Ebene darf es nur ein Element geben, hier <fahrzeug>

Das Objekt fahrzeug hat die Eigenschaften: marke, typ, motordaten, gewicht

Das Objekt motordaten hat die Eigenschaften: leistung, hubraum

Wenn man die XML Datei im Browser aufruft, wird die Baustruktur angezeigt.Man kann diese mit CSS gestalten.

Verarbeitung in PHP

Die Funktion simplexml_load_file() dient zum Einlesen der gesamten XML-Datei in ein Objekt der Klasse SimpleXMLElement, hier $fahrzeug
Wenn die Aktion nicht erfolgreich war, wird false zurück gegeben. Das sollte mit einem strengen Vergleichsoperator überprüft werden.

Mit der Objektnotation greift man auf die Eigenschaften zu:

fahrzeug->motordaten->leistung

Ein Attribut wird bei der Umwandlung in ein SimpleXMLObjekt als Element eines assosiativen Arrays angesehen. Folgendermaßen greift man darauf zu:

fahrzeug->marke["land"]

Speicherung von XML Daten

Um die Daten in einer XML-Datei zu speichern nutzt man die Funktion file_put_contents() und die Objektmethode asXML()

Die Funktion file_put_contents() erwartet als ersten Parameter den Pfad zur XML-Datei und als zweiten Parameter das SimpleXML-Objekt mit der Methode asXML()

file_put_contents("fahrzeug.xml", $fahrzeug->asXML())

Wenn man eine externe XML-Datei ändern will, sollte man diese in ein SimplXML Objekt laden. Dann kann man über die Objektnotation Änderungen vornehmen und anschließend speichern.

            $fahrzeug = simplexml_load_file("fahrzeug.xml");
            //Überprüfung ob Ladevorgang geklappt hat
            $fahrzeug->gewicht = "3400 kg";
            file_put_contents("fahrzeug.xml", $fahrzeug->asXML());
  

WYSIWYG Eingabe mit Summernote

Hier geht es darum formatiertes HTML und CSS in einer Textdatei zu speichern, der dann in einer PHP-Seite angezeigt wird mit allen Formatierungen wie Überschriften, Links, Listen etc.

Dazu gibt es fertige Lösungen wie Summernote oder TinyMCE.

Ich erkläre ein Beispiel mit Summernote. Man bindet ein paar Verweise ein, zu Bootstrap, JQuery und Summernote, erzeugt ein Formular mit Textarea und einer ID. Dann fügt man ein Javascript ein, welches einen Verweis auf die ID der Textarea bekommt. Außerdem braucht es noch das PHP Script zum Speichern in der Textdatei und zum Auslesen. Ich erkäre es hier Schritt für Schritt

PHP Script zum Speichern und Auslesen

vor dem Doctype

<?php
// Dateiname für die Speicherung
$dateiname = 'inhalt.txt';
$nachricht = '';

// POST-Daten verarbeiten und speichern (PHP-Teil bleibt unverändert)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['inhalt'])) {
    $inhalt_html = $_POST['inhalt'];
    if (file_put_contents($dateiname, $inhalt_html) !== false) {
        $nachricht = '<p style="color: green;">✅ Inhalt wurde erfolgreich gespeichert!</p>';
    } else {
        $nachricht = '<p style="color: red;">❌ Fehler beim Speichern der Datei!</p>';
    }
}

// Gespeicherten Inhalt auslesen (PHP-Teil bleibt unverändert)
$gespeicherter_inhalt = '';
if (file_exists($dateiname)) {
    $gespeicherter_inhalt = file_get_contents($dateiname);
}
?>

Verlinkung

im Head Bereich

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>

Formular

Ein Formular welches auf die eigene Seite verweist im action-Attribut. Darin ein textarea-Feld mit einer Id.Nennen wir die Id meinEditor

Javascript

Ein Script für die Programmierung mit Summernote. Das Textareafeld bekommt ein Array toolbar, in welchem spezifiziert wird, welche Funktionen zur Verfügung stehen sollen.

<script>
        $(document).ready(function() {
            $('#meinEditor').summernote({
                placeholder: 'Geben Sie Ihren formatierten Text hier ein...',
                height: 300,
                // Toolbar Konfiguration
                toolbar: [
                    ['style', ['style']], // Überschriften (h1-h6)
                    ['font', ['bold', 'underline', 'clear']], // Fett, Unterstrichen
                    ['para', ['ul', 'ol', 'paragraph']], // Listen, Absätze und Ausrichtung (Align)
                    ['insert', ['link']], // Links
                ]
            });
        });
</script>

Textdatei einlesen

Wie schon zu Anfang aufgeführt haben wir eine Variable mit Verweis auf die info.txt. Desweiteren ist dort auch eine Funktion zum Auslesen zu finden. Beides sollte in die Seite eingefügt werden, in welcher der Text angezeigt werden soll. Wenn die Seite in einem anderen Ordner liegt, muss der Verweis auf die Textdatei info.txt angepasst werden. Dann kann man an gewünschter Stelle mit echo den Inhalt anzeigen:

 <?php
// Dateiname für die Speicherung
$dateiname = 'inhalt.txt';
// Gespeicherten Inhalt auslesen (PHP-Teil bleibt unverändert)
$gespeicherter_inhalt = '';
if (file_exists($dateiname)) {
    $gespeicherter_inhalt = file_get_contents($dateiname);
}

echo $gespeicherter_inhalt;
?>

Webdesign / PHP / mySQL / Dreamweaver MX Tipps
Copyright © Michael Albers
www.pastorpixel.de