PHP stellt viele Funktionen zur Verfügung, um mit Dateien effektiv zu arbeiten. Die grundsätzliche Vorgehensweise beim Auslesen einer Datei sieht wie folgt aus: 1. Öffnen der Datei fopen() 2. schrittweises Auslesen der Datei mit einer Schleife, gesteuert durch feof() entweder: zeilenweise fgets() oder: zeichenweise fgetc() 3. Schließen der Datei fclose() Die Funktionsweise einiger wichtiger Funktionen: fopen(): öffnet eine Datei 1. die zu öffnende Datei 2. der Modus: r = Nur-Lese; r+ = Lese- und Schreib; w = Nur-Schreib; a = anhängend Position des Datenzeigers in der Datei. Er befindet sich links vom ersten Zeichen. Außer beim Modus a hinter dem letzten Zeichen. feof(): file end of file ist das Dateiende erreicht? 1.die aktuelle Position des Datenzeigers Ist das Ende der Datei erreicht, wird true zurück gegeben die Schleife, mit der die Daten ausgelesen werden, wird abgebrochen. fgets(): zeilenweise Auslesen danach Datenzeiger eine Zeile nach unten 1.die aktuelle Position des Datenzeigers die aktuell ausgelesene Zeile fgetc(): zeichenweise Auslesen danach Datenzeiger ein Zeichen nach rechts 1.die aktuelle Position des Datenzeigers das aktuell ausgelesene Zeichen fwrite(): schreiben in eine zuvor geöffnete Datei 1. die aktuelle Position des Datenzeigers (ab da wird geschrieben) 2. was in die Datei geschrieben werden soll - Roscher W.-v.-Siemens-Schule Mannheim Seite 1 von 6
1. Beispiel: Die Startseite einer Webseite wird zeilenweise ausgelesen. Ob das Ende der Datei erreicht wird, erkennt die Funktion feof(), die den Wert true am Ende der Datei zurück gibt, und die Schleife, in der die Daten ausgelesen werden, abbricht. Quellcode: <?php $datei = fopen('http://www.roschee.de/','r'); $quellcode=' '; while(!feof($datei)) { $quellcode.=fgets($datei); } fclose($datei); Struktogramm: $fp=fopen('seite.txt','w'); fwrite($fp,$quellcode);?> Die Datei 'seite.txt' wird beim Öffnen durch die Funktion fopen() schreibend angelegt. Dies geht nur im 'write-modus', nicht im 'read/write-modus. 2. Beispiel: Ein sehr einfacher Besucherzähler besteht aus einer Textdatei und dieser PHP-Datei: Datenzeiger Quellcode Struktogramm count.txt: 23 <html><body> <h2>ein Textcounter</h2> <p>die Seite wurde <b><?php 23 23 24 $fp = fopen("count.txt", "r+"); $counter = fgets($fp); echo $counter; $counter++; rewind($fp); fputs($fp, $counter); fclose($fp);?></b>-mal aufgerufen.</p> </body> </html> Die Funktion rewind() setzt den Datenzeiger an den Anfang der Datei. Die Funktion fputs() schreibt ab dem Datenzeiger zeilenweise Daten in eine Datei. Hier wird der neue Wert von $counter in die Datei geschrieben, der alte wird überschrieben, da sich der Datenzeiger wieder am Anfang der Datei befand. Roscher W.-v.-Siemens-Schule Mannheim Seite 2 von 6
Aufgabe 1: Erstellen Sie eine Textdateien mit den folgenden 3 Namen (untereinander): Jörg Möller, Fred Schröder, Beate Lindström Ersetzen Sie durch ein PHP-Skript die Buchstaben ö in dieser Textdatei durch ein o. Erstellen Sie ein Struktogramm Schreiben Sie den Quellcode Um den Datenzeiger zu manipulieren wird hier eine weitere Funktion benötigt: fseek($fp,-1,seek_cur) der Datenzeiger wird um eine Position nach vorne ab der aktuellen Position versetzt. Ersetzen Sie nun die Buchstaben ö in dieser Textdatei durch ein oe. 1. Möglichkeit (Umlaute umwandeln): Jedes Zeichen auslesen kein Umlaut das Zeichen in ein Array speichern textdatei php neues Array Sören {S}ören S S{ö}ren S o e bei Umlaut zwei Zeichen (z.b. oe) in das Array speichern am Schluss Array in die Textdatei speichern S o e r e n Soeren 2. Möglichkeit: Die 1. Möglichkeit ist etwas umständlich. Mit einer passenden Funktion lässt sich der Programmieraufwand reduzieren. Zeichen können mit der Funktion str_replace() ersetzt werden: Bsp: $str2=str_replace($search, $replace, $str); Der Funktion str_replace() sucht in dem String '$str' nach der Zeichenkette (Zeichen) aus '$search' und ersetzt sie durch das Zeichen / die Zeichenkette aus '$replace' und speichert den ganzen, neuen String in die Variable '$str2'. Aufgabe 2: Erstellen Sie den Quellcode zum neben stehenden Struktogramm. Roscher W.-v.-Siemens-Schule Mannheim Seite 3 von 6
3. Möglichkeit: mit der Funktion str_replace(), einem Array und einer foreach-schleife: Exkurs: Mit foreach wird jeder Wert des Arrays vorübergehend einer Variable zugeordnet und dann z. B. gelistet. Der Name der Variable wird durch den Befehl as angegeben, Bsp: $blumen = array("rose", "Tulpe", "Nelke"); foreach($blumen as $meine_blume) echo "$meine_blume,<br />"; Anlegen eines (indizierten) Arrays Die Ausgabe würde dann so aussehen: Rose Tulpe Nelke <?php $umlaute = array( Anlegen eines assoziativen Arrays 'ä' => 'ae', 'Ä' => 'Ae', 'ö' => 'oe', 'Ö' => 'Oe', 'ü' => 'ue',' Ü' => 'Ue', 'ß' => 'ss' ); Feldname ä Wert ae; Feldname Ä Wert in diesem Feld Ae usw. Array $umlaute: $content = file_get_contents("namen.txt"); foreach ($umlaute as $k => $v) { $content = str_replace($k, $v, $content); echo $k; //Anzeige Name des Arrayfeldes echo "<br>$v<br>"; //Anzeige Wert des Arrayfeldes } $f = fopen("namen.txt", "w"); fwrite($f, $content); fclose($f);?> die foreach-schleife arbeitet automatisch jedes Arrayfeld ab; str_replace() sucht im String $content nach den Arrayfeldnamen (ä) und ersetzt ihn durch das Arrayfeld (ae) Die Funktion file_get_contents() liest eine Datei in einen String Speichere vom Array $umlaute den ersten Feldnamen in $k und den Wert in $v 1. Schleifendurchlauf: $k = ä $v = ae Beispiel einer Log- Datei: Analysieren von Log Dateien Dec 12 13:29:04 vserver pop3d: LOGIN FAILED, user=root, ip=[::ffff:159.120.142.174] Dec 12 13:29:04 vserver pop3d: LOGIN FAILED, user=root, ip=[::ffff:87.139.68.91] Dec 12 13:29:04 vserver pop3d: LOGIN FAILED, user=root, ip=[::ffff:192.168.5.251]... Aufgabe 3: Es soll untersucht werden, wie oft versucht wurde, sich in einem bestimmten Monat auf dem Server einzuloggen die ersten 3 Zeichen jeder Zeile müssen separiert und abgefragt werden. Roscher W.-v.-Siemens-Schule Mannheim Seite 4 von 6
Hilfe: Auf einzelne Zeichen in einem String kann über einen Index in { } zugegriffen werden. Bsp.: $a='hallo'; erstes Zeichen: $b = $a{0}; letztes Zeichen: $b = $a{4}; Aufgabe 4: Lösen Sie Aufgabe 3 mit der Funktion substr() (s. unten). Einen Teilstring aus einem String zurückgeben lassen: $a = substr ( '1234567', 2 ) Es wird alles ab der 2. Position nach rechts bis zum Ende zurückgegeben $a: 34567. $a = substr ( '1234567', -2 ) Es wird alles vom "Ende-2" bis zum Ende des Strings zurückgegeben $a: 67. Es kann auch ein dritter Parameter angegeben werden, der die Länge des zurück gegebenen Strings angibt: $a = substr ( '1234567', 2, 3 ) $a: 345 Aufgabe 5: Es soll untersucht werden, wie oft sich eine bestimmte IP-Adresse auf den Server eingeloggt hat die IP-Adresse in jeder Zeile muss dazu separiert und dann abgefragt werden. Wenn man sich die Log-Datei genauer anschaut, erkennt man, dass direkt vor der IP-Adresse ein ':' und direkt dahinter ein ']' steht. Ersetzt man ']' durch ':' wird die IP von Doppelpunkten umgeben. Teilt man nun jede eingelesene Zeile in Teilstrings und nimmt den ':' als Teilungszeichen, ist die IP- Adresse isoliert. Dazu wird die Funktion explode() benötigt: explode() zerteilt einen String (2. Parameter) anhand eines Trennzeichens (1. Parameter). Der String wird dabei in ein Array umgewandelt und jedes Zeichen (oder Teilstring) in einem Feld gespeichert. str_replace( ) explode( ) Schreiben Sie den Quellcode zum Stuktrogramm Beispiel: $a = 'Dec 12 13:29:04 vserver pop3d: LOGIN'; $ip = explode(":", $a); das Array $ip sieht dann so aus: Dec 12 13 29 04 vserver pop3d LOGIN Index: 0 1 2 3 Roscher W.-v.-Siemens-Schule Mannheim Seite 5 von 6
Aufgabe 6: Lösen Sie Aufgabe 5 mit der Funktion strpos() (s. unten). Die Position eines Zeichens in einem String ermitteln: $anzahl=strpos($eingabe,"@") In der Variable $anzahl wird die Position von @ in dem String aus $eingabe gespeichert. Mit strrpos() kann man innerhalb einer Zeichenkette das letzte Vorkommen eines Zeichens finden. Als Rückgabewert erhält man einen numerischen Wert, der der Position des Suchtreffers entspricht, sonst wird false zurückgegeben: $ergebnis = strrpos($text,'@'); Weitere Möglichkeit mit regulären Ausdrücken: mit der Funktion preg_match_all(); es werden hier die Vorkommen eines Suchausdrucks in einem String gezählt. Als Rückgabewert erhält man die Anzahl der gefundenen Treffer (s. Kommentare im Skript). Aufgabe 7: Aus einer Datenbanktabelle soll eine Textdatei mit Nachnamen und Vornamen erstellt werden. Aus dieser Textdatei ('namen.txt'; Aufbau: Nachname, Vorname) sollen Benutzer-Accounts eingerichtet und in eine zweite Textdatei (login.txt) gespeichert werden. Vorgaben: Der Login-Name besteht immer aus acht Zeichen. Die ersten sechs Zeichen des Login-Namens sind identisch mit den ersten sechs Zeichen des Nachnamens in Großschreibung. Falls der Nachname kürzer als sechs Zeichen ist, werden die fehlenden Zeichen mit dem Zeichen 'x' aufgefüllt. Das 7. und 8. Zeichen des Login-Namens ist der 1. und 2. Buchstabe des Vornamens. Annahme: Vornamen haben immer mindestens drei Zeichen. Die Login-Namen werden nach der Erstellung in einer Datei login.txt abgespeichert. Die Länge eines Strings ermitteln: $anzahl=strlen($eingabe) In der Variable $anzahl wird die Anzahl der Zeichen aus $eingabe gespeichert. Roscher W.-v.-Siemens-Schule Mannheim Seite 6 von 6