inhalt von datei
hc
- php
hallo,
mein Problem ist folgendes:
ich habe eine Funktion, der der Parameter $template übergeben wird.
Dieser enthält den Namen der Datei (template-file), welche durch die Subroutine include() eingelesen werden soll. Ich möchte aber gerne, dass der inhalt der einzulesenden Datei gleich der Rückgabewert meiner Funktion ist, und somit entweder
(1) der Inhalt der Datei in meiner Variable $page[content] gespeichert wird (diese ist wiederum in einer Templatefile platziert, wo sie schlussendlich den Inhalt der Variable ausgeben soll, und somit auch den Inhalt der zu inkludieren Datei (das funktioniert wunderbar))
(2) oder an der Stelle, an der schlussendlich $page[content] ausgegeben wird, die include()-Anweisung erfolgen.
Es wäre sinnlos, wenn ihr mich um den Quellcode bitten würdet, da ich wild herumexperimentiert habe, und ein "das kann nicht funktionieren, wie du das gemacht hast" nicht weiterhelfen würde, da ich eh selbst weiß, dass es nicht funktioniert *gg*.
Vielen Dank,
gez.
hc
Hallo hc!
ich habe eine Funktion, der der Parameter $template übergeben wird.
Dieser enthält den Namen der Datei (template-file), welche durch die Subroutine include() eingelesen werden soll. Ich möchte aber gerne, dass der inhalt der einzulesenden Datei gleich der Rückgabewert meiner Funktion ist, und somit entweder
Soweit so gut - bis dahin hab ich, glaube ich, noch verstanden, was Du willst.
Schau Dir mal PHP Manual: file_get_contents() an. Das gibt Dir einfach den Inhalt der Datei als String zurück, also z.B.:
$string = file_get_contents('/path/to/template.file');
Oder was meintest Du?
MfG
Götz
hallo
Oder was meintest Du?
öhm, also ich denk' es bedarf weiterer ausführungen:
ich habe in ner datenbank das hier stehen: tpl("filename")
(funktionsaufruf der funktion tpl($template) die mittles file() die datei $template ausliest und im rückgabewert von tpl() speichert)
mit hilfe von eval() wird das schön in der variable $page[content] gespeichert. am ende der seite wird wiederum ein template aufgerufen
tpl("main"); welches das standarddesign der seite enthält. in dieser datei ist die zeile
<td blabla>$page[content]</td>
enthalten, welche (durch file() und eval()) den wert von $page[content] ausgibt, und somit den wert der datei, welche durch den funktionsaufruf in der datenbank, ausgelesen und in $page[content] gespeichert wurde.
*mei kompliziert*
aber es geht noch extremer :o):
in dieser datei "filename" (dessen aufruf in der datenbank lag, wir erinnern uns) ist nochmals eine variable $page[tcontent] enthalten.
deren wert wird aus einem anderen datensatz ermittelt.
stünde der wert von $page[tcontent] an der stelle in der datei "filename", wo in jetzt $page[tcontent] steht, wäre ich glücklich, und ließe euch in frieden :o)
hc
hallo hc,
was ht Dich dazu bewogen, Code in eine DB zu meiseln? Aber davon mal ganz abgesehen; ich werde aus diesem Satz rein gar nicht schlau:
stünde der wert von $page[tcontent] an der stelle in der datei "filename", wo in jetzt $page[tcontent] steht, wäre ich glücklich, und ließe euch in frieden
Gruß aus Berlin!
eddi
hallo
das mit dem code hat seine gründe. es steht ja nicht "nur" der code darin, sondern noch vieles drum rum (lauter spezielle lustige sachen, die ich jetzt nicht weiter erklären möchte..)
ok, ich übersetze mein schlechtes deutsch:
der dateiaufruf tpl("filename") (über den ihr euch shcon beschwert habt *G) bezieht sich ja auf die datei "filename".
die datei "filename" wird wie beabsichtigt ausgegeben. in der datei steht $page[tcontent] (eben noch eine variable, die ich bereits erklärt habe).
bei der ausgabe von "filename" wird aber auch "$page[tcontent]" ausgegeben, statt dem inhalt von $page[tcontent].
das ist mein problem
so weit verstanden?
gez.
hc
Re:
das mit dem code hat seine gründe. es steht ja nicht "nur" der code darin, sondern noch vieles drum rum (lauter spezielle lustige sachen, die ich jetzt nicht weiter erklären möchte..)
Im Wechselspiel von Helfen und Hilfe bekommen wäre es nur ausgleichend, wenn Du Vorteile dieser Methode kurz darlegen würdest!
der dateiaufruf tpl("filename") (über den ihr euch shcon beschwert habt *G) bezieht sich ja auf die datei "filename".
die datei "filename" wird wie beabsichtigt ausgegeben. in der datei steht $page[tcontent] (eben noch eine variable, die ich bereits erklärt habe).
bei der ausgabe von "filename" wird aber auch "$page[tcontent]" ausgegeben, statt dem inhalt von $page[tcontent].
das ist mein problem
Zum einen kann dies, wie Götz anmerkte, Gründe in der Schreibweise haben, zum anderen kann man darüber ohne Quellcode nur rätzeln.
Gruß aus Berlin!
eddi
hallo,
Im Wechselspiel von Helfen und Hilfe bekommen wäre es nur ausgleichend, wenn Du Vorteile dieser Methode kurz darlegen würdest!
türlich, türlich
hab ne counter-spalte da drinen, und vorallem hab ich irgendwie auch den verzweifelten sinn, alles irgendwie übersichtlich zu gestalten.
das problem dabei ist auch das, dass in der text-spalte (wo eben dann der funktionsaufruf steht), normalerweise nur text-inhalt steht.
dieser soll mittels einer selbst-programmierten cms version auch änerbar sein.
in der letzten version der seite, hat es zwar funktioniert, den ganzen html-code einfach in die text-spalte zu speichern, doch war es umständlich und unübersichtlich, was mich störte.
Zum einen kann dies, wie Götz anmerkte, Gründe in der Schreibweise haben, zum anderen kann man darüber ohne Quellcode nur rätzeln.
$string="select de\_text
from ".$dh\_inhalte."
where pid
='-2' and id
='".$_GET['info']."'";
$array=$db->q_f_arr($string);
$page[tcontent]=$array['de_text'];
eval("$code=".$result['de_text'].";");
echo $code;
eval("$page[content]="$code";");
$result['de_text'] wäre in diesem falle 'tpl("filename")'
gez,
hc
Hallo hc!
[...] den verzweifelten sinn, alles irgendwie übersichtlich zu gestalten.
das problem dabei ist auch das, dass in der text-spalte (wo eben dann der funktionsaufruf steht), normalerweise nur text-inhalt steht.
Also, Übersichtlichkeit erreichst Du mit Deinen wirren evil-Konstruktionen auf keinen Fall - das kann man imho drehen und wenden wie man will, übersichtlich würde ich das nicht nennen.
$string="select
de\_text
from".$dh\_inhalte."
wherepid
='-2' andid
='".$_GET['info']."'";
Hilfe. Siehe dclp FAQ: 16.18. Wie kann ich bösartigen Code in SQL-Abfragen unterbinden? bzw. dclp FAQ: 12.11. Prüfe importierte Parameter. Traue niemandem.
eval("$code=".$result['de_text'].";");
echo $code;
eval("$page[content]="$code";");
Aha, das ist also übersichtlich ...
Mal ehrlich: Überleg Dir doch erstmal ne sinnvoll Datenstruktur, solche Befehle in ner _Daten_bank abzulegen macht die Sache nur unnötig kompliziert und vermischt zudem noch "Daten" mit "Programmcode" - also etwas, was Du mit "Templates" ja gerade vernmeiden willst (naja, wenn man Design auch als Daten ansieht zumindest).
MfG
Götz
hallo,
man glaubt es kaum, aber es ist wahr: ich hab' ne möglichkeit gefunden, dass es funktioniert. hab die datenbank-tabelle editiert und jedem datensatz die info 1 oder 0 angehängt (für: template ja/nein), und dann noch die dazugehöre adresse des templates.
der textinhalt ($page[tcontent]) steht im gleichen datensatz unter de\_text
scheiß einfach, und ich komm erst jetzt drauf *kopfschüttel* mei...
naja, danke für eure bemühungen
gruß,
hc
Hello,
Im Wechselspiel von Helfen und Hilfe bekommen wäre es nur ausgleichend, wenn Du Vorteile dieser Methode kurz darlegen würdest!
Das Speichern von Code in einer DB macht ein ganzes System objektorientiert, nicht nur den Code.
PHP ist da zwar noch nicht unbedingt der kooperativste Partner, da sich Funktionen (Stored Procedures) nicht wieder entladen lassen, aber man kann das mit zwei Krücken umschiffen:
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo hc!
öhm, also ich denk' es bedarf weiterer ausführungen:
ich habe in ner datenbank das hier stehen: tpl("filename")
Aha.
(funktionsaufruf der funktion tpl($template) die mittles file() die datei $template ausliest und im rückgabewert von tpl() speichert)
mit hilfe von eval() wird das schön in der variable $page[content] gespeichert. am ende der seite wird wiederum ein template aufgerufen
Irgendwie beschleicht mich das Gefühl, daß Dein System ein wenig krank ist ...
[...] (dessen aufruf in der datenbank lag, wir erinnern uns)
Warum in aller Welt speichert man einen Aufruf in einer Datenbank?
Ich seh in Deinen komischen Konstrukten leider nicht soviel Sinn irgendwie.
MfG
Götz
Hallo,
function hole_inhalt($parameter)
{
$text=file_get_contents($parameter);
# andere Anweisungen
return($text);
}
$page[content]=hole_inhalt('004.tpl');
Gruß aus Berlin!
eddi
Hallo XaraX!
$page[content]=hole_inhalt('004.tpl');
Naja, da page_get_contents() an sich ja schon den Zweck erfüllt halte ich es eigentlich für überflüssig, da noch ne andere Funktion drumrum zu bauen.
Was mir grad noch auffällt: Man sollte besser $page['content'] schreiben (siehe auch PHP Manual: array()).
MfG
Götz
hi,
$page[content]=hole_inhalt('004.tpl');
Naja, da page_get_contents() an sich ja schon den Zweck erfüllt halte ich es eigentlich für überflüssig, da noch ne andere Funktion drumrum zu bauen.
und file_get_contents() (nicht page_) macht dann auch das, was XaraX kurz mit
andere Anweisungen
andeutete, also beispielsweise das template parsen/mit werten füllen o.ä. ...?
scnr,
wahsaga
Hallo wahsaga!
und file_get_contents() (nicht page_)
Danke, da hab ich mich vertippt.
Und da mit den weiteren Anweisungen hab ich sowieso überlesen ;)
MfG
Götz
Hello,
function hole_inhalt($parameter)
{
$text=file_get_contents($parameter);
# andere Anweisungen
return($text);
}
Für ein Content Management System dürfte ein file_get_contents nicht unbedingt geeignet sein, da es nicht den konkurrierenden Betrieb berücksichtigt. Bei einfachen Anwendungen kann man dann einem Wrapper die Sperrfunktionalität anerziehen, das ist aber bei höherer Last häufig das Kick Off.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin Tom,
Dieser enthält den Namen der Datei (template-file), welche durch die Subroutine include() eingelesen werden soll.
function hole_inhalt($parameter){$text=file_get_contents($parameter);/* */return($text);}
Für ein Content Management System dürfte ein file_get_contents nicht unbedingt geeignet sein, da es nicht den konkurrierenden Betrieb berücksichtigt.
Es ist im Prinzip genauso (un)geeignet, wie include().
Gruß aus Berlin!
eddi
Hello,
function hole_inhalt($parameter){$text=file_get_contents($parameter);/* */return($text);}
Für ein Content Management System dürfte ein file_get_contents nicht unbedingt geeignet sein, da es nicht den konkurrierenden Betrieb berücksichtigt.
Es ist im Prinzip genauso (un)geeignet, wie include().
So betrachtet gebe ich Dir Recht. Bei einem heißen System, bei dem also auch Änderungen am Datenstamm und/oder dem Funktionsumfang während des Betriebs astattfinden können, müssten die Includes() auch durch Locks abgesichert werden.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Nabend Tom,
So betrachtet gebe ich Dir Recht. Bei einem heißen System, bei dem also auch Änderungen am Datenstamm und/oder dem Funktionsumfang während des Betriebs astattfinden können, müssten die Includes() auch durch Locks abgesichert werden.
In dem Zusammenhang war ich gestern auch mal wieder bei Deinem Flatfile-Projekt vorbeischnuppern. Hast Du das mal über eine Semaphor versucht zu lösen oder ist Deine Methode hinreichend gut, um bei Hochbelastung eingesetzt zu werden?
Gruß aus Berlin!
eddi
Hello,
So betrachtet gebe ich Dir Recht. Bei einem heißen System, bei dem also auch Änderungen am Datenstamm und/oder dem Funktionsumfang während des Betriebs astattfinden können, müssten die Includes() auch durch Locks abgesichert werden.
In dem Zusammenhang war ich gestern auch mal wieder bei Deinem Flatfile-Projekt vorbeischnuppern. Hast Du das mal über eine Semaphor versucht zu lösen oder ist Deine Methode hinreichend gut, um bei Hochbelastung eingesetzt zu werden?
Ich habe zwar nicht genau verstanden, wie Du die Frage nun meinst...
Pauschal möchte ich mal antworten: Es kommt immer darauf an, was in den angeforderten Ressourcen drinsteht und wie oft und von wem es wann geändert wird.
Ein einfaches fread() oder include() ist jedenfalls nicht atomar, da zu vermuten ist, dass die Daten aus der Ressource in Blöcken abgeholt werden. Es lässt sich dann durchaus von einem fwrite() ziwschen den einzelnen Blockread-Befehlen auch auf die Ressource schreiben.
PHP könnte das intern durch einen entsprechenden eigenen Mechanismus zwar regeln. Es müssten dann nur eigene Tabellen des Daemon geführt werden ähnlich der vorgeschlagenen Semaphore und atomaren Funktionen für Sperre und Freigabe.
Das würde aber im hetrogenen Programmumfeld auf einem Server nichts nützen. Da bräucht doch nur ein andere Prozess über PERL oder ein Executable direkt zugreifen. Einzig verantwortlich für die "Bentuztungskontrolle" von Ressourcen kann also das Betriebssystem sein.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom