13.03.2006
Kleines PHP für den Hausgebrauch
Die CSS-Reboot 2006 ist nun schon längst nicht mehr so kritisch. Einen Großteil der Seite habe ich nun schon fertig, auch wenn noch nicht eine Zeile der Templaterie selbst übernommen wurde und eigentlich sollte es bei mir PHP-Reboot heißen und nicht CSS-Reboot. Zwar jubel ich noch regelmäßig zu früh, aber grundsätzlich klappt das mit dem Auslesen und verwursten von Texten und Listen schon ganz gut.
Das schliemmste bei der Pflege von mehreren Editland-Installationen ist nicht das sich mehrfach einloggen müssen. Das schlimmste ist das verwalten müssen von mehreren Plugin und Template-Ordnern. Ich habe also erst einmal an zwei Stellen in Editland selbst den Pfad angepasst. Ein kurzes schmerzloses ‘../’ um bei Unterordnern ebenfalls auf das Stylesheet des Root-Ordners zuzugreifen. Ich beschränke das auf das Stylesheet, denn Plugins und Grundgerüste können sich dann doch wieder den Anforderugen gemäß unterscheiden und die Plugins von creisi.ch sind nicht auf einen zentralen Template-Ordner zugeschnitten. Die Gefahr hier mehr Arbeit als Nutzen zu haben ist zu groß.
So manche Dinge auf einer Site sind immer gleich, oder sollen von allen Seiten aus im Viewport oder im Fuß den User anlächeln. Die große und wichtigste Hilfe hat mir DonKult mit seinem Skript geliefert, auch wenn darin ein Punkt zuviel war und damit pro Schleife ein Rücksprung geschrieben wurde. Aber kommen wir zu meinen wichtigsten PHP-Errungenschaften.
PHP für den kleinen Hausgebrauch
Als Allererstes sind da die vielen verwirrenden (Syntax-)Zeichen mit seinen unterschiedlichen Bedeutungen und dann kommt schon das Schleifchen um den Array. Es ist eines der wichtigsten Erkenntnisse die ein Anfänger braucht, einmal von der Zeichensetzung abgesehen.
Wichtig zu wissen, PHP schaut in einigen Fällen von dem Ort aus, wo er erscheint und nicht von dort, wo es geschrieben steht. Die Standortbestimmung ist also extrem wichtig.
$dir_file = $_SERVER['PHP_SELF'];$dir_now = dirname($dir_file);$dir_base = (stristr($_SERVER['PHP_SELF'],'Ordner_lokal')==true) ? 'Ordner_lokal' : 'Ordner_online'; //lokal eingerichtet
Weil ich viel zu beqem bin jedes Mal das Script während der Entwicklung auf dem lokalen Rechner und zum Test auf dem Server anzupassen, überprüfe ich eben mal kurz, ob mein lokaler Ordner im String vorkommt. Damit habe ich einen festen Bezugspunkt von dem aus ich nun prüfen kann, wo ich mich befinde und wieviele $jumper = '../'; brauche um von einem Ordner zum nächsten zu kommen. Der Rest ist Zählen und x-Mal ergänzen oder wegnehmen. Eben wieder je nach dem von wo man die Chause betrachtet … so PHP-Mäßig.
$dirs = explode('/',$dir_now);$c_dirs = count($dirs)-1;$dir_now = $dirs[$c_dirs];
Also erst einmal den Array (siehe oben) bestimmt und dann rückwärts durch die Liste marschiert und angehängt und angehängt und angehängt bis man angekommen ist:
$jumper = '';for($i=$c_dirs;$i!=0;$i--) {if($dir_now==$dir_base) {break;}$jumper .= '../';}
Wenn man sich dann einen Textbaustein aus einem anderen Ordner holt und die Bezüge der Ordner untereinander ändern muss, dann tauscht man über all dort wo dieser Bezug vorkommt entsprechend die Textteile aus. $show = str_replace('href="','href="'.$jumper.'ordner/', str_replace("bildordner",$jumper."ordner/bildordner", $textbaustein));
Mit ein wenig Vergleichen == und einem Array hat man dann auch ruckzuck Listen je nach Seite ausgespuckt, das spart einem so manches HTML-Tag-Schreiben.
Das Geh doch mal die Liste durch und sie, ob etwas passendes dabei ist, ist die nächste essentielle Funktion, die man als Anfänger zu lieben lernt. Erst einmal den Array erstellen:
$kapiteltext = array(array('ordner1','Blahblah <strong>Kapitelname 1</strong>'),array('ordner2','Blahblah <strong>Kapitelname 2</strong>'),array('ordner3','Blahblah <strong>Kapitelname 3</strong>'),array('ordner4','Blahblah <strong>Kapitelname 4</strong>'),array($dir_base,'Herzlich willkommen in der offiziellen <strong>Startsequenz</strong>'),);
Das könnte man nun auch in einem separaten File (Datei) tun und diesen File dann über file(pfad/dateiname) gleich als Array in das Skript holen, was sich bei längeren Listen, die öfter einmal aktualisiert werden lohnt. Erst einmal zählen wir unsere Einträge, wobei es auch ein foreach sein dürfte und dann das Zählen entfiele. Hat man es gezählt, dann geht das Ganze durch. Arrays fangen bei null an, also auch wir in der for-Schleife mit $i=0; (und vergessen das vermalledeite Semilkolon nicht bei der Deklaration von $i) und erklären nun noch wann es denn aufhören soll, nämlich wenn alle durch sind, sprich $i = $c_kapiteltext; (natürlich könnte man das auch so schreiben $i = count($kapiteltext); und spart sich die separate Variable $c_kapiteltext.) und mit $i++ addiert man $i beim nächsten Durchlauf eine Eins:
$c_kapiteltext = count($kapiteltext);for($i=0; $i< $c_kapiteltext; $i++){if ($dir_now==$kapiteltext [$i][0]){echo $kapiteltext[$i][1];}}
So und dann übergibt man die Variable $i das erste Mal und $kapiteltext[$i][1]==$kapiteltext[0][1] und das zweite Mal und $kapiteltext[$i][1]==$kapiteltext[1][1] und das dritte Mal $kapiteltext[$i][1]==$kapiteltext[2][1] und so weiter und erhält so jeweils den Wert aus dem Array, denn $kapiteltext[1][1]= 'ordner1', wenn also der aktuelle Ordner ($dir_now) ‘ordner’ ist, dann wird laut if-Abfrage der zweite Teil im Array angezeigt: echo $kapiteltext[$i][1];, also ‘Blahblah <strong>Kapitelname 1</strong>’.
So, das ist nun schon ein schöner Schritt in die richtige Richtung, denn damit habe ich die Funktionen an einem Ort und kann die Daten an einem anderen Ort jeweils zentral verwalten. Anlegen und Editieren der Daten kann ich aktuell auch noch bequem mit dem Text-Editor und FTP. Aber bei einer der nächsten Gelegenheiten, mache ich mich dann an die Formular-Auswertung und das Schreiben, Ergänzen, Andern und Löschen von Daten auf den Server in den Files.
Filed under: Programmierung
3 Comments
March 13th, 2006 at 19:16
Wenn ich das so sagen darf: Du hast dir für die Zukunft ordentlich was vorgennomen. Auswertungen von Benutzereingaben sind wohl die komplexeste Angelegenheit beim programmieren; frei nach dem Motto: “Vertraue keinen Daten die du nicht selbst gefälscht hast.” Das berüchtige XSS und die lieben SQL-Injections sind ja in aller Munde, auch wenn nur ein Bruchteil der User die laut schreiend darüber philosopieren wirklich verstehen was das Problem in Wahrheit ist. Da wünsch ich dir jetzt schon viel Spaß mit den auf dich zukommenden Problemen & Lösungen.
Noch ein kleines Detail am Rande zu for und foreach, da wenn ich Array höre ich immer an sortieren und Reihenfolge denke, an folgendem Beispiel:
$satz = array(1 => ‘foreach’,2 => ‘ ist nicht immer gleich ‘,3 =>’for’,0 => ‘ !! Achtung !! ‘);
$lang = count($satz);
for($i=0;$i’;
foreach($satz as $s) {
echo $s;
}
Ausgabe:
!! Achtung !! foreach ist nicht for
foreach ist nicht for !! Achtung !!
Sieht auf den ersten Blick nutzlos aus, hat aber durchaus seinen Sinn: zum Beispiel bei einer Auswahlliste für Tags, bei der ich die Tags nicht nach der ID (da die willkürlich ist, jenachdem wann der Tag das erstemal verwendet wurde), sondern alphabetisch sortiert werden sollen: asort() ist dein Freund
Mit foreach kann also deutlich mehr machen als sich einfach nur das zählen zu ersparen… Aber das sind dann wirklich Details und eigentlich unter “Kleines PHP für den Hausgebrauch” fehl am Platze. Aber gut, jetzt hab ich es getippt, jetzt schick ich es auch ab. Beschweren kann man sich nachher immernoch
March 13th, 2006 at 19:47
Das ist jetzt so ein typisches Beispiel, warum ich jahrelang einen riesen Bogen um Programmieren gemacht habe. Ich lese, aber ich weiß nicht was mir das sagen soll.
Von for(0-count(var)) tut doch das selbe wie foreach. Auch foreach fängt bei 0 an. Wobei ich bei for die Reihenfolge umgehren kann und bei rückwärts zählen kann. in wie weit ich bei foreach die Reihenfolge umkehren kann … keine Ahnung? Vermutlich nicht … und mit dem Rauspicken per Zahl … wieder keine Ahnung. Wenn ich das ganze Mal verstehe, schreibe ich vielleicht das Handbuch um, so dass auch NIcht-Programmmierer es verstehen und ohne Probieren und Raten einsetzen können.
Das es beim Formular2File das eine oder andere zu beachten gilt, mag ja sein, aber solange es hinter htaccess-Gittern mit der ein Personen-Admin geschieht, darf man vermutlich die eine oder andere Prüfung der Daten erst mal vergessen und kann sich ganz darauf konzentrieren, nicht beim ersten Update über Formular alles was war zu löschen.
March 13th, 2006 at 22:17
Klar, im begrenzten Benutzerraum muss man nicht ganz so akribisch prüfen ob die Daten gütlig sind, aber zur Sicherheit sollte man es auch da tun. Man weiss ja nie ob nicht ihrgendwann jemand mal (versehentlich oder absichtlich) Zugriff erhält, der nicht ganz so “geschickt” im Umgang mit den Scripts ist…
Ach und falls es ermutig: Ein Super-Daten-GAU ist recht unrealistisch, da viel zu offensichtlich. Kleinere Fehler, die zufällig aufzutretten erscheinen und die nur kleine Teile des Systemes angreifen sind theoretisch sehr viel realistischer. In der Praxis wird es aber auf einfache Syntax- und Logikfehler hinauslaufen, die zwar unmengen an Zeit, dafür aber keine Daten fressen.
Zu for und foreach: Eigentlich ganz simpel: for geht den Array anhand des key/index durch: heisst von 0 ausgehend aufsteigend. foreach hingegen kümmert der key/index nicht, es geht den Array anhand der Erstellungszeit durch: heisst vom Altesten zum Neusten. (genauso wie ihn auch print_r ausgibt)
Am Beispiel: dem key ‘0′ wird ‘Achtung’ zugeordnet und steht an letzter Stelle im Array (ist also das jüngste Element). for gibt ‘Achtung’ also als erstes aus, da es ja bei key 0 beginnt und dann aufsteigend den Array durcharbeitet, während foreach ‘Achtung’ als letztes ausgeben wird, da die Elemente mit den keys 1,2 und 3 älter (weiter vorne im Array) sind.
Bei foreach lässt sich die Reihenfolge auch umdrehen, wenn auch nicht so einfach wie bei for: Man erstellt einfach einen Array der den ursprünglichen Array umgedreht enthält: array_reverse()
Wie gesagt, wirklich interessant wird das ganze eben erst beim sortieren von Arrays. Wollte es nur mal anmerken, in der Hoffnung, dass es ihrgendwann ihrgendwem mal hilft. Als ich vor dem “Problem” stand hab ich (auch) nix kapiert und natürlich (auch) nix gefunden. Array vor lauter Elementen nicht gesehen könnte man sagen. Jetzt ist das vollkommen logisch, aber hinterher kann man das immer sagen…