HTML-Code einbinden.
kungschu
- php
Hallo.
Ich möchte in einer php-file (zB index.php) HTML-Code aus einer anderen .html-file ausgeben.
Was nehme ich dafür vorzugsweise?
include(), readfile() oder file_get_contents() ?
MfG, Kungschu.
Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();
Hallo.
Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();
Nein, ich möchte ihn lediglich ausgeben. Ist include() hierfür also am besten geeignet?
MfG, Kungschu.
Hello,
Kommt darauf an, ob du den Kode noch bearbeiten möchtest. Im regelfall aber sucht jemand wie du nach include();
Nein, ich möchte ihn lediglich ausgeben. Ist include() hierfür also am besten geeignet?
Nein, include() ist dann evtuell sogar gefährlich.
Wenn Dein File aus einer externen Datenquelle stammt, also nicht aus Deinem abgesicherten Serverbereich, dann könnte Dir jemand PHP-Code unterschieben und damit sehr schnell die Kontrolle über Deinen Teil des Servers übernehmen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Ich möchte in einem php-file (zB index.php) HTML-Code aus einem anderen .html-file ausgeben.
Was nehme ich dafür vorzugsweise?
Aus der Formulierung "aus einem anderen" entnehme ich, dass auch das PHP-Script HTML-Code ausgibt.
Wenn dies der Fall ist, musst Du die beiden Ausgabeströme erst so miteinander vereinen, dass nur _ein_ <html>, <head>, <body> vorkommt.
Anderenfalls müsstest Du auf Frames oder I-Frames ausweichen.
Dann genügt auch readfile() für die Ausgabe des Dateiinhalts.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Danke dir für deine ausführliche Antwort.
Ich präzisiere:
Beispiel für die ausgebende Seite (ja, auch hier nur Ausgabe von HTML-Code):
[...]
<body>
<?php
????????????????? ( Hier zB include('content.html') )
?>
</body>
</html>
Bseipiel für die zu inkludierende (?) Seite (ohne head,body,etc.):
<!-- file Anfang -->
<h1>Willkommen auf example.org</h1>
<p>bla bla bla</p>
<!-- file-Ende -->
MfG, Kungschu.
Hello,
Beispiel für die ausgebende Seite (ja, auch hier nur Ausgabe von HTML-Code):
[...]
<body><?php
readfile('content.html'); ## setzt voraus, dass die Datei vorhanden und lesbar ist.
?>
</body>
</html>Bseipiel für die zu inkludierende (?) Seite (ohne head,body,etc.):
<!-- file Anfang -->
<h1>Willkommen auf example.org</h1>
<p>bla bla bla</p>
<!-- file-Ende -->
Ein readfile() reicht aus.
Du kannst es ggf. noch verpacken in
if(is_readable('content.html'))
{
readfile('content.html');
}
http://www.php.net/manual/en/function.is-readable.php
Wenn an der Datei gleichzeitig von einem Anderen auch gearbeitet werden soll, während der Normaluser sie ich anzeigen lässt, müsstest Du aber eher
$content_file = "textbausteine/content.htnl";
$fh = fopen($content,'rb'); ## Datei zum Lesen öffnen
if ($fh) ## wenn es geklappt hat
{
flock($fh, LOCK_SH); ## Fragen, ob Datei frei ist und gegen
## Veränderung sperren
$content = fread($fh, filesize($content_file)); ## Datei auslesen
fclose($fh); ## Datei schließen und Sperre aufheben
echo $content; ## Dateiinhalt ausgeben
}
else
{
echo "$content steht zur Zeit nicht bereit";
}
Dieses Verfahren hat den Vorteil, dass man Inhalte in der Datei (also im Lesepuffer) noch verändern kann, z.B. indem man mittels Regular Expression oder Str_Replace() <'-- DETAIL02 --> austauscht gegen einen anderen String, den man sich aus einer weiteren Datei oder Abfrage besorgt hat oder aus der Session. Das könnte z.B. der username sein.
Außerdem muss man $content nicht sofort nach dem Auslesen ausgeben, sondern kann das ganz am Ende des PHP-Scriptes tun. So bekommt man Ordnung in seien Seiten.
Die Technik mit dem Austauschen von Platzhaltern in den HTML-Bausteinen nennt man Template-Technik.
Sie hat gegenüber dem Include den Vorteil, dass man die Templates auch von den Usern erstellen lassen kann. Das führt dann zwar eventuell zu einem HTML-Fehler, aber es kann Dir kein PHP-Code eingeschleust werden.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Danke dir für deine Bemühungen. Ich werde sehen, inwieweit ich die Informationen verarbeiten kann ;-).
Ja, die Datei soll auch während einer Nutzung durch einen User bearbeitet werden können.
flock($fh, LOCK_SH); ## Fragen, ob Datei frei ist und gegen
## Veränderung sperren
In welchem "Zustand" ist eine Datei denn nicht "frei"?
flock() ist mir nicht ganz klar, sprich die Formulierung lesende uns schreibende Verriegelung.
MfG, Kungschu.
Hello,
Ja, die Datei soll auch während einer Nutzung durch einen User bearbeitet werden können.
flock($fh, LOCK_SH); ## Fragen, ob Datei frei ist und gegen
## Veränderung sperrenIn welchem "Zustand" ist eine Datei denn nicht "frei"?
Wenn ein anderer User sie gerade verändert.
Stelle Dir vor, Dein Prozess liest aus der Datei, während ein anderer Prozess gerade Daten darin ändert. Je nach Zugriffsmethode und Inhalt kann das verheerende Folgen für die Datenintegrität haben. Bei HTML-Files kommt dann eben einfach nur Blödsinn heraus, aber wenn es ich um Datenfiles mit verknüpften Daten oder um empfindliche Werte (z.B. Atomkraftwerk) handelt, dürfte sowas keinesfalls passieren.
Bei Webseiten sehe ich nur ernsthafte Probleme, wenn es sich um Shops oder Fernsteuerungen, Zugangsberechtigungen usw. handelt.
flock() ist mir nicht ganz klar,
sprich die Formulierung lesende uns schreibende Verriegelung.
Die Bezeichnung ist auch irreführend, aber schon ewig so gewachsen.
Eigentlich besteht das Locking aus drei Stufen
1. Ungesperrt
2. Gesperrt gegen Erteilung der totalen Sperre (3) an andere Benutzer,
also nur frei zum Lesen und zum Beantragen weiterer Sperren der Stufe 2
durch andere User. Wenn kein _anderer_ Prozess eine Sperre (2) mehr innehat,
darf der eigene auf (3) erhöhen
3. Gesperrt gegen weitere Sperren durch andere Benutzer.
Niemand bekommt eine (2) und schon gar keine (3), solange ein Prozess eine
Sperre der Stufe (3) innehat.
Sperren sollte man immer nur so kurz wie möglich.
Sperren der Stufe (3) sollte man _sofort_ nach erfolgreichem Veränderungsvorgang wieder aufheben.
Beim Schließen einer Datei mit fclose() werden die Sperren. die der Prozesse innehat, automatisch alle wieder aufgehoben
Das Sperren mit flock() ist sogenanntes advisory Locking, wird also parallel zu den Zugriffsmethoden geführt. Wenn ein Prozess sich nicht an den Mechanismus hält, kann er auf die Datei zugreifen, obwohl sie "gesperrt" ist. Beim mandatory Locking ist dieser Mechanismus in die Zugriffsmethoden direkt eingebaut. Wenn man also als ordentlicher Mensch über das Betriebssystem auf die Dateien zugeift, dann kann man auf eine gesperrte Datei _nicht_ zugreifen, egal, ob man sich selber um Sperren kümmert, oder nicht.
Du solltest bei der Erstellung Deines Managementsystems von vorneherein sauber arbeiten, und die Sperrmechanismen verwenden.
Mehr dazu bei Interesse.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Mein (funktionierender) Ansatz:
$datei ="../contentindex.html";
$file=fopen($datei,"r+");
if($file) {
rewind($file);
flock($file, LOCK_SH);
fputs($file,"$ueberschrift \n $text");
fclose($file);
etc....
Ist daran etwas auszusetzen?
Noch eine Frage zu .htaccess:
Ich möchte ein Verzeichnis schützen. Nun habe ich in meiner Datei stehen:
# htaccess
AuthType Digest
AuthName "bereich"
AuthUserFile users/.htusers
Require user USERNAME
Die File .htusers existiert natürlich im entsprechenden Verzeichnis. Es funktioniert aber nicht? (Hoster (all-inkl) unterstützt .htaccess)
MfG, Kungschu.
Hello,
Mein (funktionierender) Ansatz: #### Wirklich?
$datei ="../contentindex.html";
$file=fopen($datei,"r+");
if($file)
{
rewind($file); ## wozu das? Direkt nach dem Öffnen steht man immer am Anfang
## Außerdem wäre das nutzlos _vor_ dem flock()
flock($file, LOCK_SH); ## zu schwach zum Schreiben!
fputs($file,"$ueberschrift \n $text"); ## falsch, wenn man in ein vorhandesnes
## File hineinschreibt!
fclose($file);
Ist daran etwas auszusetzen?
Oh ja!
Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.
Also
File öffnen
File exclusiv sperren
File auslesen
File im Buffer verändern
File aus dem Buffer zurückschreiben
File in der Länge anpassen
File schließen und entsprerren
Es ist immer derselbe Ablauf. da beißt keine Maus 'nen faden ab, auch nicht meine von bitworks :-)
Zu .htaccess
Auth Type "Digest" funktioniert meistens nicht
Probier erstmal mit Auth Type "basic", was dann passiert.
mehr nach Deiner Rückmeldung mit den Fehlermeldungen
[1] bei bestehenden Files meistens ungeeignet
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.
Also
File öffnen
fopen()
File exclusiv sperren
flock($file, LOCK_SH) tut also nicht genau das?
File auslesen
also fread()?
File im Buffer verändern
wie?
File aus dem Buffer zurückschreiben
wie?
File in der Länge anpassen
wie?
File schließen und entsprerren
fclose(), nehme ich also an.
Zu .htaccess
Dafür habe ich heute keine Nerven mehr. Trotzdem Danke nochmals für deine ausführliche Hilfestellung den Tag über!
MfG, Kungschu.
Hello,
Wenn man vor hat, ein bestehendes File mittels eines Write-Prozesses (also fwrite, fputs[1], etc) zu verändern, dann muss man es _vor_ dem Auslesen sperren, und zwar Exclusiv.
Also
File öffnen
fopen()
File exclusiv sperren
# flock($file, LOCK_SH) ##tut also nicht genau das? [1]
flock($file, LOCK_EX) ## DAS tut es jetzt?
File auslesen
also fread()? ja
File im Buffer verändern
# wie? Indem man an bestimmten Postionen etwas austauscht, überschreibt, einfügt, usw
File aus dem Buffer zurückschreiben
# wie? Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen
File in der Länge anpassen
# wie? mit ftrauncate()
File schließen und entsprerren
fclose(), nehme ich also an. ## Korrekt
[1] flock() ohne den Parameter LOCK_NB wartet solange, bis die Lockanforderung erfolgreich war. das kann auch solange sein, bis die maximale Scriptlaufzeit erreicht wurde. Dann wird das Script insgesamt rausgeschmissen und alle aktiven Opens und Locks werden automatsich besitigt.
Nur bei Argument LOCK_NB versucht das System nur einige Male gnaz kurz hintereinander, den Locking-Status zu erlangen. Wenn das in (typisch) 5 Versuchen im Millisekundenabstand nicht klappt, wird false zurückgegeben und mit dem nächsten Statement im Script weitergemacht...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Also schreibe ich z.B.:
$file = fopen(datei.html);
if ($file) {
flock(§file, LOCK_EX);
fread($file);
# Ich möchte am Anfang Daten einfügen, also (?):
rewind($file);
fwrite($file, "$neuerEintrag");
File aus dem Buffer zurückschreiben
# wie? Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen
File in der Länge anpassen
# wie? mit ftrauncate()
Hier weiß ich nun nicht, welche Befehle ich verwenden könnte. Etwa so?:
rewind($file);
#ganzen Buffer schreiben ??????
#woher weiß ich, wie lange die File ist?
ftrauncate($file, x);
fclose($file);
}else{
etc.
Wie du siehst, ist mir also vorallem der Schritt schreiben im Buffer und der Sinn hinter dem auslesen / festlegen der Größe der Datei unklar.?
MfG, Kungschu.
ello,
Also schreibe ich z.B.:
$file = fopen(datei.html);
if ($file) {
flock(§file, LOCK_EX);
fread($file); ## wohin liest Du denn die Daten? In den Mülleimer?
Ich möchte am Anfang Daten einfügen, also (?):
rewind($file); ## das ist hier zwar noch zu früh, aber nicht ganz falsch
## Rewind gehört klassisch betrachtet zu Textdateien
## fopen() öffnete aber eine Random Access Datei
## PHP nimmt das aber nicht so genau :-((
fwrite($file, "$neuerEintrag"); ## Willst Du einfügen oder überschreiben?
!> > > > File aus dem Buffer zurückschreiben !
# wie? Satzzeiger zurück auf Anfang, ganzen Buffer schreiben, Länge des Files anpassen
File in der Länge anpassen
# wie? mit ftrauncate()
Wenn also am Anfang ein Satz eingefügt werden soll:
$buffer = $satz . CRLF . $buffer;
In "$satz" sind die neuen Daten
"CRLF" ist das für das OS gültige Satzendezeichen
"$buffer" enthält die Daten vom fread(), also aus der Datei.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
Nun kann ich dir langsam nicht mehr folgen, meine minimalen php-Kenntnisse erschöpfen sich. Was ich bisher gelernt habe:
Was mir nicht klar ist:
Wieso spielt die Größe der Datei eine so große Rolle?Weshalb kann ich sie nicht einfach öffen, am Anfang content einfügen und sie wieder schließen?
Wie ich die Funktion ftrauncate() korrekt anwende?
Ich habe auch versucht, dieses aktuelle Posting zu verstehen, aber auch jetzt ist mir der ganze Vorgang noch nicht vollständig klar.
Nehme ich dein anderes Posting zur Hilfe, würde ich es jetzt so versuchen (bzw. interpretieren):
#Datei zum schreiben öffnen
$fh = fopen(content.html, 'r+');
# wenn das geklappt hat
if ($fh) {
#Datei sperren
$lock_ok = flock($fh, LOCK_EX);
#Datei lesen
$file = fread($fh, filesize(content.html));
#Text einfügen
rewind($file);
fwrite($file,"$neuerInhalt");
#Dateizeiger zurück
fseek($fh, 0, SEEK_SET);
#Buffer zurückschreiben, sprich schreibt in $fh den neuen content
fwrite($fh, $file);
#Das verstehe ich jetzt nicht. Wird meine alter content jetzt nicht gelöscht?
ftruncate($fh, strlen($file));
#schliessen
fclose($fh);
Wie sieht es damit jetzt aus? Wird es ;-) ?
MfG, Kungschu.
Hello,
- Wie ich die Funktion ftruncate() korrekt anwende? ## File abaschneiden
#vorhandene Datei zum schreiben öffnen
$fh = fopen('content.html', 'r+');
wenn das geklappt hat
if ($fh) {
#Datei sperren
$lock_ok = flock($fh, LOCK_EX);#Datei lesen
$file = fread($fh, filesize(content.html));#Text einfügen
# rewind($file);
# fwrite($file,"$neuerInhalt"); ## woher kommt denn der neue Inhalt?
#Dateizeiger zurück
fseek($fh, 0, SEEK_SET); ## ist besser als rewind() und bewirkt hier das Gleiche
#Buffer zurückschreiben, sprich schreibt in $fh den neuen content
fwrite($fh, $file);#Das verstehe ich jetzt nicht. Wird meine alter content jetzt nicht gelöscht?
# Ja, durch Überscxhreiben mit neuem Content werden genau soviele Bytes gelöscht
# vom alten Content, wie der neue lang ist.
ftruncate($fh, strlen($file));
# Das macht man, um die Datei auf die Länge des neuen Contents zu kürzen, falls
der alte länger war. Anderenfalls kann man sich das schenken.
#schliessen
fclose($fh);
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo.
- Wie ich die Funktion ftruncate() korrekt anwende? ## File abaschneiden
abaschneide? Ok, dann benötige ich das nicht. Ich möcht die alten Daten ja behalten.
#vorhandene Datei zum schreiben öffnen
$fh = fopen('content.html', 'r+');
# wenn das geklappt hat
if ($fh) {
#Datei sperren
$lock_ok = flock($fh, LOCK_EX);
#Datei lesen
$file = fread($fh, filesize(content.html));
#Text einfügen
#sollte ich hier auch fseek verwenden (anstatt rewind) bzw. überhaupt notwendig?
rewind($file);
fwrite($file,"$neuerInhalt"); ## woher kommt denn der neue Inhalt? zB aus $_POST["text"], davor halt noch filtern etc.
#Dateizeiger zurück
fseek($fh, 0, SEEK_SET);
#Buffer zurückschreiben, sprich schreibt in $fh den neuen content
fwrite($fh, $file);
fclose($fh);
}else{
etc.
Passt es so nun? Ist filesize in fread() überhaupt noch notwendig?
MfG, Kungschu.
Hello,
Passt es so nun? Ist filesize in fread() überhaupt noch notwendig?
Nein. Du hättest doch nur lesen müssen.
#vorhandene Datei zum Lesen und Schreiben öffnen
$fh = fopen('content.html', 'rb+'); ## rb+ ist noch besser!
# wenn das geklappt hat
if ($fh)
{
#Datei sperren
$lock_ok = flock($fh, LOCK_EX);
#Datei lesen
$file = fread($fh, filesize('content.html'));
#Text einfügen
$file = "neuer Text vorne dran \n" . $file . "neuer Text hinten dran\n";
#Dateizeiger zurück
fseek($fh, 0, SEEK_SET); ## ist besser als rewind() und bewirkt hier das Gleiche
#Buffer zurückschreiben, sprich schreibt in Handle $fh den neuen content $file
fwrite($fh, $file);
ftruncate($fh, strlen($file));
# Das macht man, um die Datei auf die Länge des neuen Contents zu kürzen, falls
der alte länger war. Anderenfalls kann man sich das schenken.
#schliessen
fclose($fh);
Schau es Dir nochmal in Ruhe an.
Wenn man nicht mit Kopie und Backup arbeiten will, sollte man es so machen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom.
Vielen herzlichen Dank für deine Mühe. Das ist nicht selbstverständlich und in diesem Umfang auch eher die Ausnahme.
Ich weiß es umso mehr zu schätzen.
Es funktioniert nun einwandfrei.
(Der Link zur Lösung für die Nachleser:
https://forum.selfhtml.org/?t=150032&m=975139)
Wie lässt es sich eigentlich realisieren, dass Backslashes genau so Ausgegeben werden, wie ich sie, beispielsweise, in die <textarea>
eingebe? Wie zB bei einem Forumsbeitrag hier.
Ein schönes Wochenende noch! Danke!
MfG, Kungschu.