Tach!
Aber so will man das eigentlich nicht haben. Man will eigentlich PHP-Programmlogik und HTML-Code getrennt verwalten. Also speichert man den HTML-Code in einer HTML-Datei, deren Inhalt man dann einliest:
Will man das? Ich nicht. Ich sortiere nicht nach Codearten sondern nach Verwendungszweck. Grob eingeteilt in Geschäftslogik und Ausgabelogik. Die Geschäftslogik ist das, was den eigentlichen Zweck des Programms ausmacht, das wofür die Daten verarbeitet und beschafft werden sollen. Die Darstellung hingegen ist wichtig für die Anwender, aber meist ist diese Nutzeroberfläche austauschbar. Statt HTML für Menschen könnte man genausogut JSON für den maschinenellen Zugriff entgegennehmen und produzieren. Die eigentliche Verarbeitung in der Geschäftslogik bleibt dabei gleich.
Wenn für die Ausgabe Programmcode notwendig ist (Daten aus einem Array in einer Schleife ausgeben, if-else-Entscheidungen, die Darstellung betreffend), dann kommt der mit in den Teil, in dem das HTML steht. HTML kennt nämlich keine Programmlogik. Wenn man solche Wiederholungen ohne PHP-Code ausführen möchte, muss man eine Template-Sprache hinzunehmen. Und dann mischt man ebenso, nur nicht HTML mit PHP sondern mit Template-Syntax. Das Ziel, Code nach Sprache trennen zu wollen, sehe ich nicht als ein grundlegend sinnvolles an. Natürlich kann es fallbezogen gewichtige Gründe geben, statt PHP als Sprache für die Ausgabelogik eine andere oder eine Template-Engine mit eigener Syntax zu nehmen.
Jetzt holen wir uns das in unsere PHP-Programmlogik:
$form_html = file_get_contents(__DIR__.'/templates/form.html');
echo $form_html;
Natürlich will man das gesamte HTML erst am Ende der PHP-Programmlogik ausgeben. Warum?
Umformuliert nach meinem Ansatz heißt das: Natürlich will man die Ausgabe erst nach der Geschäftslogik vornehmen. Das Folgende bleibt dann sinngemäß gleich.
Unterwegs könnte es sich ergeben, dass man anstelle von HTML lieber JavaScript, CSS oder gar die Daten einer Bild- oder PDF-Datei ausgeben möchte. Das wird bei komplexeren PHP-Programmen durchaus angeboten. Auch wenn man mit Sessions arbeitet, zerschießen voreilige Ausgaben an den Browser die Möglichkeit an den Cookie-Daten oder anderen HTTP-Headern noch etwas zu schrauben.
Auch das Umkopieren in eine Variable verdeckt, wo Daten her kommen. Das ist bei Nutzereingaben konkret ein Sicherheitsrisiko, da Du den Daten später nicht mehr ansiehst, dass sie aus einer unsicheren Quelle kommen.
Nein, das ist kein Risiko. Die Daten und ihre Herkunft sind nicht das Problem, sondern wenn sie unsachgemäß in den Code des Ausgabemediums eingebaut werden. Nicht der Anwender (mit bösen Absichten) ist das Problem, sondern der Programmierer, der die Daten nicht korrekt verarbeitet. Jegliche Daten müssen korrekt maskiert ausgegeben werden, nicht nur Nutzereingaben. Es spielt also keine Rolle, ob man ihnen die Herkunft ansieht. Das Umkopieren ist nur schlecht, weil es oftmals nur ein unnötiger Vorgang ist.
Auch wenn Deine Variable im Namen noch POST enthält, so ist es aber nicht mehr das $_POST
-Array. Arbeite lieber mit den originalen Daten bis kurz vor dem Speichern.
Auch das kann ich so pauschal nicht bekräftigen. Es gibt Frameworks die sind so nett und extrahieren die Daten aus dem $_GET/$_POST-Array und stellen sie gleich als ein schönes Objekt zur Verfügung, genauso wie es die Geschäftslogik am liebsten mag. Schichtweg nur Daten, ohne die Umstände der Herkunft beachten zu müssen. Üblicherweise kann man solchen Frameworks Hinweise geben, wo die Daten herzuholen sind, wenn das wichtig für die Sicherheit ist, aber das ist für die eigentliche Geschäftslogik nicht relevant. Inhaltliche Prüfungen, also dass zum Beispiel Wertebereiche eingehalten werden, ist hingegen Aufgabe der Geschäftslogik. Auch dafür ist die Herkunft egal, es zählt nur, was der Geschäftsvorgang benötigt.
Nee, wenn Du Debugging betreiben willst, dann schreibe das besser in eine Textdatei, anstatt es im Browser auszugeben. Dann siehst Du genauer, was da passiert.
Das empfinde ich als unnötig umständlich. Zudem muss man dafür dem PHP Schreibrechte im Dateisystem geben und auch noch selbst direkten Zugriff darauf haben. Für mich spricht nichts grundlegendes dagegen, Debugging-Daten auch über den Browser sichtbar zu machen. Genauer oder auch nur übersichtlicher wird das Ergebnis nicht durch die Art des Ausgabemediums, sondern durch die Art der Darstellung.
Hier ein Vorschlag, wie ich das mache:
Hier mein Vorschlag: var_dump()
erzeugt die genaueste Ausgabe. Auch Typinformationen kann man damit sehen. Ein echo
konvertiert bestimmte Datentypen in eine für den Endanwender schöne Form, die aber dem Entwickler zu viel verbirgt. Ein false
wird zum Beispiel als Leerstring ausgegeben und ein true
als 1, was nicht unterscheidbar zur Zahl 1 ist. var_dump()
zeigt beides schön als false
und true
an. - Da Browser Whitespace (wie Zeilenumbrüche) in der Ausgabe unbeachtet lassen, gebe ich bei Bedarf (sprich bei den komplexen Strukturen Array und Objekt) noch ein <pre>
vorher aus, und das war es. Solche vorübergehenden Ausgaben müssen nicht schön aussehen, sondern nur brauchbare Informationen für das Debugging liefern. Alternativ zu var_dump()
nehme ich mitunter auch print_r()
für Arrays und Objekte. Das schreibt zwar keine Typinformationen in der Darstellung, ist dafür aber besser lesbar.
Einen Haken hat die Sache noch, denn bei dieser einfachen Methode ist kein Maskieren für HTML dabei, woraufhin die Browser eventuell enthaltenes HTML oder was dem ähnlich sieht, zu interpretieren versuchen. Meistens stört das für das Debugging nicht, aber wenn doch, nimmt man halt noch ein htmlspecialchars()
dazu. Debugausgaben in Dateien kommen bei mir nur in schwerwiegenden Fällen zum Einsatz, wenn ich dadurch einen Vorteil sehe durch irgendeine Funktion des Anzeigeprogramms, z.B. Code-Folding bei längeren Daten.
dedlfix.