Mailinglisten-Archive |
Kirsten Bohlig wrote: > Hallo, > > vorab: das ist meine erste Mail in diese Liste, > ich heiße Kirsten, komme aus Karlsruhe, habe bislang nur eher statische > Websites erstellt und versuche mich ohne großartige > Programmiervorkenntnisse in php einzuarbeiten. Jeder von uns hat mal angefangen :-). > > Ich stoße dabei öfter an meine Grenzen, da ich die Sprache nicht > beherrsche, das Vokabular nicht vorrätig habe. Das bedeutet: ich > versuche eher nur, vorhandene Skripte an meine Wünsche anzupassen, ohne > - ehrlich gesagt - bei jedem Schritt wirklich zu verstehen, was da alles > vor sich geht... (was ich aber zu gerne möchte und versuche ;-) kann man natürlich machen. Aber sei vorsichtig: Es gibt wirklich sooo viele "schlechte" Scripte (lies schlecht wie in unsicher, langsam, unleserlich) da draussen, dass du als Anfängerin dir unnötig viel arbeit machst und dir den Risiken nicht bewusst bist. > > Also: > Mit folgendem Code lese ich die Dateien aus einem Verzeichnis aus, > filtere die php-Dateien aus und verlinke sie mit ihren jeweiligen > h1-Überschriften als Linktext. > > $dir = "OrdnerXY"; // Verzeichnisname > $verzeichnis = openDir($dir); > while ($file = readDir($verzeichnis)) > { > if($file != substr_count($file,".php")) > { > $datei = fOpen($dir . "/" . $file, "r"); > $inhalt = fRead($datei, 1000); > fClose($datei); > ereg("<h1>(.*)<\/h1>" , $inhalt , $extract); > $content .= "<a href=\"".$dir."/" .$file . "\">$extract[1]</a>"; > } > } > closeDir($verzeichnis); Was mir auffällt: Wie ich selbst demletzt gelernt habe ist php "case-insensitiv". Also d.h. php ignoriert Groß- und Kleinschreibung. Zumindest bei den meisten Sachen. Bei manchen anderen Dingen (zum Beispiel Variabelnamen) zählt die Groß- und Kleinschreibung. Ich rate dir jedenfalls dazu dich nicht darauf zu verlassen, dass php eine Groß-/ Kleinschreibweise ignoeriert, bzw. dass dies in der Zukunft so bleiben wird. Die von dir verwendeten Funktionen opendir, fopen, fread,... werden "eigentlich" alle kleingeschrieben. Dann mal das spezifische: if($file != substr_count($file,".php")) Du zählst, wie oft der String ".php" im aktuellen Datainame vorkommt. Ist diese Zahl nicht gleichzeitig der Dateiname, dann ist die if-Bedingung true und du gehst in der folgendem Block rein. Ausser wenn dein aktueller Dateiname mit einer 0 anfängt und der Dateiname .php nicht enthält, ist diese Bedingung immer wahr. Php-Dateien filterst du damit nicht raus. Besser wäre wohl if (substr_compare($file, ".php", -4, 4, true) ==0) { ... } So prüfst du, ob der Dateiname ohne Beachtung von Groß- und Kleinschreibung auf .php endet. $inhalt = fRead($datei, 1000); Du liest dir also einfach die ersten 1000 Bytes der Datei ein. Reicht dir das? Du kannst mit file_get_contents() auch die ganze Datei einlesen. Das wäre zwar auch noch optimierungsfähig, aber ich will dir ja nicht gleich zu viel an den Kopf werfen, wenn ich schon an jeder Zeile was auszusetzen habe ^^. ereg("<h1>(.*)<\/h1>" , $inhalt , $extract); Beachte den Hinweis in der Referenz: Note: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg(). Hinzu kommt noch mein Hinweis, dass man regexe vermeiden sollte, wenn es auch (einfach) ohne geht. Beispiel einer anderen Lösung: $titelpos =strpos($inhalt,'<h1>'); //erstmal schauen wir, wo das erste <h1> vorkommt $titel =substr($inhalt, $titelpos+4, strpos($inhalt,'</h1>',$titelpos)-4-$titelpos); //und dann holen wir uns den Substring raus $content .= "<a href=\"".$dir."/" .$file . "\">$extract[1]</a>"; Vorsicht! Stell dir vor $dir = 'bla"blubb'; Also hat ein " mittendrin. Das würde dir alles kaputt machen. Oder $extract[1] hat ein "</a>" drin. Ist zwar unwahrscheinlich, aber du musst diese Zeichen ersetzen: $content .= "<a href=\"".urlrawencode($dir."/" .$file)."\">htmlspecialchars($extract[1])</a>"; Das habe ich jetzt zwar so aus dem Kopf geschrieben, aber sollte klappen. > > Ich bekomme es auch hin, mir nur die "neueste Datei" verlinkt anzeigen > zu lassen, das Verzeichnis rauf und runter zu sortieren usw. > > Mein Problem: > Ruft man eine dieser Dateien aus der Liste auf, kommt man auf eine > "Folgeseite". > Jetzt hätte ich gerne, dass auf dieser "zweiten" Seite nur *ein* Link > angezeigt wird, nämlich der auf die Datei, die als nächstes im > Verzeichnis aufgelistet ist, ein eigentlich doch schlichter > "Weiter"-Link also. Übergib doch im Link einfach die aktuelle Datei... Zum beispiel <a href="getnext.php?aktuell=aktuelleDatei.php">Nächste Datei</a> Dann kannst du vor deiner while Schleife noch folgendes Ergänzen: while ($file = readDir($verzeichnis) && $file !=$_REQUEST['aktuell']) ; //überspringt einfach alle Dateien, bis zu der Datei, die in aktuell=xxx übergeben wurde. if($file = readDir($verzeichnis)) //das ist dann die folgende Datei. { //hier die entsprechende Datei behandeln } Ich hoffe dir ist so grundsätzlich klar, was ich da machen würde. Ich habe sonst keine Bedenken wieder von dir zu höhren :-D. > Vielen Dank für Tipps! > > Grüße > Kirsten Yannik
php::bar PHP Wiki - Listenarchive