inhalt dynamisch einfügen... (anfängerfrage)
mandy.
- php
hallo ihr,
ich fange gerade erst an mich mit PHP zu beschäftigen. ich möchte auf meiner webseite den inhalt per PHP (id o.ä.) einbinden. also das menü, layout etc. ist statisch, nur der inhalt soll dynamisch gezogen werden.
wie ist die beste herangehensweise? benötige ich dafür eine datenbank oder geht es auch ohne?
bin für jeden hinweis dankbar!
viele grüße,
mandy.
am besten machst du's wie die profis, schreib dir den code in eine mysql db und fürst ihn dann mit eval() aus xD
Hallo mandy..
wie ist die beste herangehensweise? benötige ich dafür eine datenbank oder geht es auch ohne?
Am besten geht es so, dass du das Prinzip verstehst. Eine Datenbank ist dafür nicht einmal notwendig, kann dir aber später Arbeit und Verwaltungsaufwand ersparen.
Inwieweit hast du dich denn schon mit der Materie PHP befasst?
Solltest du schon bis zu include
vorgedrungen sein, kannst du -- unter Einbeziehung einiger Sicherheitsaspekte[1] -- deine Unterseiten über eigenständige Dateien einbinden.#
[1] Sicherheitsaspekte, hier: Eine Absicherung gegen Aussenstehende, sodass keine fremden Skripte auf deinem Server / Webspace ausgeführt werden können, die Inhalte somit nur von deinem Server / Webspace kommen.
Gruß, Ashura
Hello,
Du benötigst Dafür kein fertiges DBMS.
Du kannst Deine daten auch in einzelnen Dateien halten.
Das System aus einzelnen Dateien wird dann nach und nach zu einem "DBMS" (Datenbank Mangement System) heranwachsen.
Wenn es sich nicht num eine "professionelle Anwendung" handeln sollte, sondern um Dein Lernprojekt, empfiehlt es sich, mit "losen Dateien", sogenannten Flatfiles, anzufangen.
Bau Dir ein "Template".
Das ist ein valides HTML-File mit dem Design, dass an den Stellen, an denen später der Inhalt erscheinen soll, speziell erkennbare "Variablen" enthält.
In deiner PHP-Datei kannst Du dann das Template z.B. mit file_get_contents() laden und die Platzhalter mittels str_replace() gegen die vorher berechneten Inhalte austauschen.
Man benötigt also hierfür überhaupt kein "include()" oder "eval()" oder sonstige hässliche (gefährliche) Funktionen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom.
Man benötigt also hierfür überhaupt kein "include()" oder "eval()" oder sonstige hässliche (gefährliche) Funktionen.
Was ist an include() hässlich? (eval()--Ja.)
Gruß, Ashura
Hello,
Was ist an include() hässlich? (eval()--Ja.)
Das hast Du doch eben gerade selber gesagt, dass man diverse Dinge berücksichtigen muss, um es zu verwenden. Include() ist übrignes genauso hässlich wie eval().
Die beiden Funktionen unterscheiden sich nur in Format, in dem die Daten übernommen werden. Ob ich nun include() mit Benutzerdaten füttere oder steuere oder dies mit eval() tue, macht keinerlei Unterschied. Ich halte include() allerdings für hässlicher als wval(), weil es vermeintlich einfacher zu handhaben ist und daher an jeder Ecke (ungerechtfertigt) eingesetzt wird, währen mit eval() sowieso kaum einer umgehen kann und es daher i.d.R. hauptsächlich von Leuten eingesetzt wird, die sich damit auskennen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom.
Das hast Du doch eben gerade selber gesagt, dass man diverse Dinge berücksichtigen muss, um es zu verwenden.
Was man zwangsläufig nahezu überall muss. Sicherheitsmaßnahmen sollten überall ergriffen werden, wo es möglich ist.
Include() ist übrignes genauso hässlich wie eval().
Das ist Ansichtssache.
Die beiden Funktionen unterscheiden sich nur in Format, in dem die Daten übernommen werden. Ob ich nun include() mit Benutzerdaten füttere oder steuere oder dies mit eval() tue, macht keinerlei Unterschied.
Den macht es schon--include() arbeitet direkter und bindet den vermeintlichen PHP-Code umgehend ein. eval() erfordert noch Umwege über echo.
Ich halte include() allerdings für hässlicher als wval(), weil es vermeintlich einfacher zu handhaben ist und daher an jeder Ecke (ungerechtfertigt) eingesetzt wird, währen mit eval() sowieso kaum einer umgehen kann und es daher i.d.R. hauptsächlich von Leuten eingesetzt wird, die sich damit auskennen.
Das kann ich persönlich nicht nachvollziehen, da ich eval() bisher immer gemieden habe, eine Nachwirkung meiner JavaScript Phase.
Dennoch danke für den Tipp, vielleicht kann ich eval() noch einmal gebrauchen.
P.S.: Hast du auch etwas gegen require() vorzubringen? ;)
Gruß, Ashura
Hello,
Den macht es schon--include() arbeitet direkter und bindet den vermeintlichen PHP-Code umgehend ein. eval() erfordert noch Umwege über echo.
Was ist denn daran ein Umweg?
Include sachließt den PHP-Parser, bindet die Datei an der entsprechenden Stelle ein
und öffnet den Parser wieder. Das führt dann zu einer direkten Ausgabe an die Standard-Ausgabe.
Eval übernimmt eine Variable und bindet sie an der entsprechenden Stelle ein, ohne den Parser
vorher zu schließen. Wenn die Variable als erstes das Schließen des PHP-Parsers enthält,
und ihn am Ende wieder "einschaltet", dann verhält sich eval($variable) genauso, wie include.
versuch mal:
<?php ### eval.php ###
$str = '?><p>Hallo <?php echo $string ?></p><?php echo sqrt(33);';
$string = "hallo Ashura!";
eval ($str);
?>
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom.
versuch mal:
<?php ### eval.php ###
$str = '?><p>Hallo <?php echo $string ?></p><?php echo sqrt(33);';
$string = "hallo Ashura!";
eval ($str);
?>
Es sieht zwar merkwürdig aus, ändert aber nichts daran, dass ich dies noch nicht kannte.
Danke für die Erläuterung.
Gruß, Ashura
--
Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
Try it: [Become an Opera Lover in 30 days](http://tntluoma.com/opera/lover/7/)
Meine Browser: Opera 8.0 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
IE Layout-Workaround №1: <!--[if IE]><style type="text/css">\*{display:none;}</style><![endif]-->
Hello,
Es sieht zwar merkwürdig aus, ändert aber nichts daran, dass ich dies noch nicht kannte.
Danke für die Erläuterung.
Du wirst vielleicht lachen, aber dieses Beispiel schaue ich mir immer dann an, wenn ich selber gerade mal wieder "vergessen" habe, wie ein String für eval() aufgebaut werden muss.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
include ist doch ganz ok, solange man keine variablen includet
Hello,
include ist doch ganz ok, solange man keine variablen includet
Ich finde es auch nicht schlecht.
Nur finde ich, dass es im Web allzu leichtfertig benutzt wird, ohne sich über die möglichen Konsequenzen klar zu werden oder diese zu erläutern.
Mein Rat lautete daher, erstmal mit einem (passiven) Template anzufangen.
Das gibt einem Anfänger-Anwender genügend Übungsmöglichkeiten und macht die Zusammenhänge besser klar, als gleich mit (aktivem) include zu arbeiten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Tag Tom.
Ich halte include() allerdings für hässlicher als wval(), weil es vermeintlich einfacher zu handhaben ist und daher an jeder Ecke (ungerechtfertigt) eingesetzt wird, währen mit eval() sowieso kaum einer umgehen kann und es daher i.d.R. hauptsächlich von Leuten eingesetzt wird, die sich damit auskennen.
Mal eine Frage am Rande (ich habe dazu in der PHP-Dokumentation nichts gefunden): hat include einen Rückgabewert (z.B. true im Erfolgsfall, sonst false), mit dessen Hilfe man Warnungen abfangen könnte?
Siechfred
Hello,
Mal eine Frage am Rande (ich habe dazu in der PHP-Dokumentation nichts gefunden): hat include einen Rückgabewert (z.B. true im Erfolgsfall, sonst false), mit dessen Hilfe man Warnungen abfangen könnte?
include hat in neueren php-Versionen einen erfolgsabhängigen Rückgabewert. Ab welcher Version müsste ich aber jetzt selber suchen.
In älteen Versionen habe ich die Erfolgskontrolle folgendermaßen durchgeführt:
ini_set('track_errors','1');
@include($dateiname);
if(!empty($php_errormsg))
{
## include-Fehler.
}
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
echo $begrüßung;
include hat in neueren php-Versionen einen erfolgsabhängigen Rückgabewert.
Ja, hab's grad mal getestet mit 4.3.11 und 5.0.3
include liefert eine integer-1 oder ein boolean-false bei Erfolg bzw. Misserfolg zurück.
Abgesehen davon besteht noch die Möglichkeit, in der includierten Datei ein return mit beliebigem Parameter anzugeben, der dann als Rückgabewert von include verwendet werden kann.
echo "$verabschiedung $name";
Hello,
Abgesehen davon besteht noch die Möglichkeit, in der includierten Datei ein return mit beliebigem Parameter anzugeben, der dann als Rückgabewert von include verwendet werden kann.
Gut, dass Du das noch erwähnst. Denn wenn in der includierten Datei innerhalb des PHP-Bereiches als letztes
return false;
drinsteht, dann wird das Include
Die Überprüfung, ob überhaupt ein include stattgefunden hat, ist also mit der "$php_errormsg-Methode" auf jeden Fall aussagefähiger.
Übrigens ist der Rückgabewert von eval() von der Syntax-Überprüfung des evaluierten Strings abhängig. Hingegen ist der Rückgagebwert bei include nur abhänging davon, ob die Datei gelesene werden konnte und ob ggf. ein Return im Scope lag.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
re
Die Überprüfung, ob überhaupt ein include stattgefunden hat, ist also mit der "$php_errormsg-Methode" auf jeden Fall aussagefähiger.
Meiner Meinung nach, ist eine Überprüfung auf ein erfolgreiches Include nicht für alle Fälle die beste Lösung, denn es kann nur eine Aussage getroffen werden, dass das include funktioniert hat. Ob allerdings der gewünschte Inhalt eingeladen wurde, lässt sich besser mit
isset($var)
function_exists('functionName')
class_exists('className')
is_a($object, 'className') / $object instanceof className
und Konsorten ermitteln.
dedlfix
Hello,
Meiner Meinung nach, ist eine Überprüfung auf ein erfolgreiches Include nicht für alle Fälle die beste Lösung, denn es kann nur eine Aussage getroffen werden, dass das include funktioniert hat. Ob allerdings der gewünschte Inhalt eingeladen wurde, lässt sich besser mit
isset($var)
function_exists('functionName')
class_exists('className')
is_a($object, 'className') / $object instanceof classNameund Konsorten ermitteln.
Dann müsste man aber im "Masterfile" schon sehr genau wissen, was einem das Objekt mitzubringen gedenkt. Da erscheint mir ein CRC-Wert die praktikablere Methode zu sein. Der funktioniert aber mit include() nicht, sondern erfordert eval().
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
re
Dann müsste man aber im "Masterfile" schon sehr genau wissen, was einem das Objekt mitzubringen gedenkt.
Ja, das stimmt. Die von uns erwähnten (pauschalen) Möglichkeiten sind natürlich für jeden konkreten Fall auf ihre Einsetzbarkeit hin zu prüfen.
Ein Beispiel, bei dem erfolgreiches Includen allein noch nicht viel hermacht, ist beim factory-Pattern-Beispiel zu sehen. Hier böte sich an, zu testen, ob $classname den Namen einer existierende Klasse darstellt (class_exists), und das erzeugt Objekt von einem bestimmten Typ abgeleitet ist (is_a/instanceof), bevor man weiter darauf zugreift.
dedlfix
Hi,
Man benötigt also hierfür überhaupt kein "include()" oder "eval()" oder sonstige hässliche (gefährliche) Funktionen.
Das hab ich jetzt schon des öfteren gelesen, aber ich hab noch keine einleuchtende Erklärung dafür gefunden.
Für gefährlich halte ich diese Funktionen nur, wenn der Programmierer keine Ahnung hat (Ungeprüftes Einbinden von Dateien, die direkt in der URL übergeben wurden etc.)
Aber gibt es denn Alternativen?
Wenn ich eval() nutze, dann hab ich m.E. keine andere Möglichkeit.
Hello,
Für gefährlich halte ich diese Funktionen nur, wenn der Programmierer keine Ahnung hat (Ungeprüftes Einbinden von Dateien, die direkt in der URL übergeben wurden etc.)
Aber gibt es denn Alternativen?
mit include() oder eval() müssen doch nur aktive Teile, die ihrerseits also zu interpretierenden PHP-Code enthalten, eingebunden werden.
Alle anderen Einbindungen kann man doch durch einfache _passive_ Ersetzungen durchführen. Die erhalten dann auch niemals die Kontrolle.
Wenn ich eval() nutze, dann hab ich m.E. keine andere Möglichkeit.
...als was zu tun?
Mit eval() bindet man genauso nur aktive Codeteile ein, deren Herkunft sicher ist.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom