XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   HTML mit PHP Code aus Datenbank auslesen + ausführen (http://xhtmlforum.de/showthread.php?t=64480)

Garlandt 29.04.2011 11:21

HTML mit PHP Code aus Datenbank auslesen + ausführen
 
Huhu Leute,

Ich weiß, dass das Thema schon häufiger angesprochen wurde und sicher seid ihr es auch leid.

Also folgender Sachverhalt:

Für meine Website habe ich ein "Grundgerüst". Kopfbereich, Navigation und so weiter werden durch php includet was alles auch super funktioniert.
Der eigentliche, seitenspezifische Inhalt (also HTML- und ggf. PHP-Code [der wiederum php-Dateien Includen soll]) soll aus einer Datenbank geladen werden.

Solange es sich nur um HTML-Code handelt ist alles recht einfach.

Der HTML Code der Seite wird mit htmlentitys() Datenbankkonform umgewandelt und dort gespeichert. Mit html_entity_decode() wird der Code aus der Datenbank wieder in gültigen HTML Code umgewandelt.

Wenn sich im HTML Code nun php Code befindet. Zum Beispiel <?php echo "test" ?> Wird dieser nicht ausgeführt sondern erscheint nur im Quellcode da der Browser damit nix anfangen kann.

Ich habe schon nach Lösungen für das Problem gesucht und diese beiden hilfreichen Forendiskussionen gefunden:

SELFHTML Forumsarchiv / 2009 / Februar / PHP aus Datenbank nur in Quelltext sichtbar
http://xhtmlforum.de/41680-php-code-...-beziehen.html

Aber leider konnten mir diese auch nicht wirklich weiterhelfen.

Sehr oft wird die Funktion eval() erwähnt die aber ein hohes Sicherheitsrisiko darstellen soll. Mittlerweile vermute ich, das ich vielleicht ein konzeptionelles Problem bei meiner Website habe.

Könnt ihr mir bei diesem Problem vielleicht Weiterhelfen?

Gruß

Garlandt

Borsti 29.04.2011 14:05

Zitat:

Zitat von Garlandt (Beitrag 492750)
Für meine Website habe ich ein "Grundgerüst". Kopfbereich, Navigation und so weiter werden durch php includet was alles auch super funktioniert.
Der eigentliche, seitenspezifische Inhalt (also HTML- und ggf. PHP-Code [der wiederum php-Dateien Includen soll]) soll aus einer Datenbank geladen werden.

Erst mal: gute Sache, weil du damit dynamisch bist & bleibst.

Das Problem das du allerdings in deinem Design hast, ist, dass es sich ja auf MySQL stützt.
deswegen erhälst du von MySQL für dein HTML-Content einen String als Rückgabetyp.
In dem String kann aber normalerweise kein PHP ausgeführt werden (was auch gut so ist), weil alles was zwischen den "" steht PHP so ziemlich egal ist ;)

Die Funktion eval() ist dazu da um Variablen in Strings zu ersetzen.

Sicherheitstechnisch halte ich sie aber auch für bedenklich, weil du damit ziemlich anfällig für MySQL-injection wirst...
Zitat:

Mittlerweile vermute ich, das ich vielleicht ein konzeptionelles Problem bei meiner Website habe.
Richtig vermutet, normalerweise geht das so:
HTML Content ist bei einer Webseite ja Statisch, deswegen wird er in .tpl-Dateien gespeichert, dazu baut man sich mit PHP dann ein Template-System (oder wenn man keine Lust hat nimmt man einfach Smarty).

Die Idee dahinter ist einfach gesagt, Content vom Design komplett zu trennen, so dass das Template System hinterher nur noch dafür zuständig ist, was vorne angezeigt wird.

Sich mir Smarty zu beschäftigen lohnt sich auf jeden Fall (ist einfach und schnell zu installieren) und ist sicher genau das, was du brauchst.

Und noch ein Merksatz: Verwende die Datenbank nur für Daten :)

inta 29.04.2011 14:36

Ich würde dir empfehlen nicht die Templates, sondern nur die Inhalte in der Datenbank zu speichern. Dein Problem tritt denn auch gar nicht erst auf, da PHP-Code nicht zum Inhalt zählt.

Zitat:

Zitat von Garlandt (Beitrag 492750)
Der HTML Code der Seite wird mit htmlentitys() Datenbankkonform umgewandelt und dort gespeichert.

htmlentities ist nicht dafür gedacht, verwende an dieser Stelle mysql_real_escape_string.

Im Template solltest du dann bei der Ausgabe von Variablen htmlspecialchars verwenden.


(Zur sauberen Trennung braucht man übrigens kein Smarty und auch keine andere Template-Engine.)

mantiz 29.04.2011 16:57

Zitat:

Zitat von Borsti (Beitrag 492760)
Die Funktion eval() ist dazu da um Variablen in Strings zu ersetzen.

[klugscheiß-modus]
Das ist so nicht ganz richtig, ich hoffe/denke Du weißt das, aber es sollte hier nicht falsch stehen bleiben. ;)

eval() führt eine Zeichenkette als PHP-Code aus (wie es auch im Link steht), man kann mit dessen Hilfe Variablen ersetzen, aber der Punkt ist, dass beliebiger PHP-Code ausgeführt werden kann.
Schleifen, Bedingungen, andere Funktionen, include, require, ... gehört alles dazu.
[/klugscheiß-modus]

Garlandt 29.04.2011 19:31

Zitat:

Zitat:

Zitat:
Zitat von Garlandt Beitrag anzeigen
Für meine Website habe ich ein "Grundgerüst". Kopfbereich, Navigation und so weiter werden durch php includet was alles auch super funktioniert.
Der eigentliche, seitenspezifische Inhalt (also HTML- und ggf. PHP-Code [der wiederum php-Dateien Includen soll]) soll aus einer Datenbank geladen werden.
Erst mal: gute Sache, weil du damit dynamisch bist & bleibst.
Danke, ich versuche mir gleich alles richtig beizubringen und Standard konform zu arbeiten. Auch wenns oft nicht so leicht auf alle Browser Rücksicht zu nehmen.

Zum Thema:

Hmm verdammt. Scheint als wäre die Lösung für mein Problem nicht ganz so einfach wie ich gehofft habe.

Von Templates habe ich leider (noch) keine Ahnung.

Zitat:

Zitat:

Zitat:
Zitat von Garlandt Beitrag anzeigen
Der HTML Code der Seite wird mit htmlentitys() Datenbankkonform umgewandelt und dort gespeichert.
htmlentities ist nicht dafür gedacht, verwende an dieser Stelle mysql_real_escape_string.
Wenn wir gerade dabei sind: Wie speichere ich HTML Code "richtig" in einer Datenbank und lese ihn sicher wieder aus?

Etwa so:

Code:

mysql_real_escape_string("HTML Code mit spezifischen sonderzeichen etc...")

Das Ergebnis wird in die Datenbank geschrieben.

Und auslesen wäre dann:

Code:

htmlspecialchars("umgewandelter HTML-Code-String aus der Datenbank")
Ist das so richtig oder muss noch mehr beachtet werden um sicher zu Programmieren?

Bezüglich meiner Eingangsfrage: Wenn ich euch richtig verstehe, ratet ihr mir meine Website mit einem Templatesystem aufbauen und in der Datenbank nur Daten zu speichern.

Gruß

Garlandt

Dani@okraina 29.04.2011 19:48

Zitat:

Zitat von Borsti (Beitrag 492760)
[...] dazu baut man sich mit PHP dann ein Template-System (oder wenn man keine Lust hat nimmt man einfach Smarty). [...]

Bin der gleichen Meinung wie Inta. Hab da noch einen Link ausgegraben... PHP Blogger: PHP ist eine Template Engine! - Ein PHP Blog auf deutsch

Garlandt 29.04.2011 20:41

OK jetzt bin ich verwirrt. Dem letzten Post entnehme ich das Template-Systeme, CMS und so weiter aus diversen Gründen schlecht sind.

Ich nehme an das es sich hierbei eine Frage handelt für die es keine klare Antwort gibt:

Sollten Websites mit Templates entwickelt werden oder nicht? Ich bin noch Einsteiger was Website Konzeption angeht.

Gruß

Garlandt

Edit: Hab mir jetzt dieses "Tutorial" über Templates durchgelesen und verstehe nur Bahnhof xD. Naja zumindest verstehe ich was passiert.

Borsti 30.04.2011 15:06

Zitat:

Zitat von Dani@okraina (Beitrag 492796)
Bin der gleichen Meinung wie Inta. Hab da noch einen Link ausgegraben... PHP Blogger: PHP ist eine Template Engine! - Ein PHP Blog auf deutsch

Kommt immer drauf an, bis zu welcher Größe.
Ich benutzte momentan Smarty, weil es sehr einfach zu schreiben ist (einfacher als mit der eigenen von PHP) und denke, das auch Anfänger damit eventuell weniger Probleme haben... 8)

@mantiz ich hab noch nie mit der Funktion gearbeitet, deswegen hab ich nur das erste Beispiel auf der Seite überflogen. :?
Für solche Sachen finde ich sprintf() besser...
Und PHP-Code schreibt kein Vernünftiger in einen String :D

Back to Garlandt:
Also: Es ist völliger Unsinn HTML-Daten in der Datenbank abzuspeichern.

Wie gesagt: MySQL nur für Daten nehmen.

Du solltest dir folgende Struktur aufbauen (im FTP):
Code:

./
/template/
header.php
content1.php
content2.php
footer.php
index.php

deine index.php sieht dann so aus:
PHP-Code:

<?PHP
include("template/header.php");

if(
IRGENDWAS) {
    include(
"template/content1.php");
} else {
    include(
"template/content2.php");
}

include(
"template/footer.php");
?>

in die header.php kommt alles, was du als Kopfteil haben willst, in die footer.php, Alles, was du auf jeder Seite unten haben willst.

content1.php und content2.php sind dann deine Variablen PHP-Sachen.
Vorteil dabei ist, das du in den einzelnen includeten Dateien dann wieder irgendwelchen PHP-Code schreiben kannst, der dann hinterher in der index.php angezeigt wird.

Garlandt 30.04.2011 20:48

Hmm ok. Ich verstehe das Prinzip. Im Grunde habe ich so eine ähnliche Konstruktion Bereits.

Kopf, Fuß und Navigation werden aus ausgelagerten php Dateien includet. Nur der Inhalt, der eben Seitenindividuell ist, soll dynamisch erstellt werden. Wenn also kein HTML-Code in der Datenbank gespeichert werden soll, dann vielleicht der Inhalt das HTML-Codes?

Ein Beispiel wäre vielleicht ein Newssystem. Und weils so lustig ist das ganze auch noch Mehrsprachig.

Auf der news-Seite würde wie auf jeder Seite des Projektes head, foot und navigation includet. Im Inhaltsbereich wird eine php-datei includet die quasi das "Gerüst" für den Newsbeitrag/-artikel darstellt. Der Newstext, also reiner Text ohne Code, könnte aus einer Datenbank geladen werden. Die Sprache kann über eine $_GET variable geregelt werden.

Nur sehe ich dabei ein kleines Problem. Wenn der Newstext mehrere Absätze hat sollte jeder Absatz auch in in einem p-Tag stehen. Wenn im Text auch noch Bilder oder Videos enthalten sind wirds noch komplizierter. Ich kann ja schlecht jeden Absatz als eigenen Datensatz speichern. Außerdem bräuchte dann jeder Artikel eine eigene Tabelle (wenn ich mich nicht irre) und das ist nun wirklich nicht zweckmäßig.

Ich hoffe das Problem, welches ich hier sehe, konnte ich verständlich machen.

Was würdet ihr empfehlen?

Gruß

Garlandt

Borsti 30.04.2011 22:15

Zitat:

Zitat von Garlandt (Beitrag 492916)
Kopf, Fuß und Navigation werden aus ausgelagerten php Dateien includet. Nur der Inhalt, der eben Seitenindividuell ist, soll dynamisch erstellt werden. Wenn also kein HTML-Code in der Datenbank gespeichert werden soll, dann vielleicht der Inhalt das HTML-Codes?

Ja, jetzt bist du auf dem richtigen Pfad ;)

Zitat:

Ein Beispiel wäre vielleicht ein Newssystem. Und weils so lustig ist das ganze auch noch Mehrsprachig.
Wenn du ein Newssystem haben willst, würde ich dir ein CMS ans Herz legen, damit wirst du mehr Erfolg haben, als alles selbst zu programmieren.

Zum Beispiel Wordpress.

Dazu müsstest du aber vielleicht noch sagen, was das genau für eine Webseite ist, an der du arbeitest.


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:53 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023