Dateien mit include einbinden

Hallo Gruppe,

ich möchte gern mit include Dateien einbinden. Es existieren:

/test/skript.php
/template/foo.html
/template/bar.html

Jetzt möchte ich in skript.php die Dateien foo.html und bar.html
einbinden. Warum funktioniert das nicht:

<?php
include_path = ".:/";
include '/templates/foo.html';
include '/templates/bar.html';
?>

Mit include_path gebe ich das aktuelle Verzeichnis "."und das
docroot "/" als Pfad an, und von dort sollten doch foo.html und
bar.html zu finden sein. Was habe ich falsch verstanden?

--
Andre Tann
Andre Tann [ Di, 04 September 2007 14:03 ] [ ID #1812307 ]

Re: Dateien mit include einbinden

Andre Tann wrote:


> /test/skript.php
> /template/foo.html
> /template/bar.html
>
> <?php
> include_path = ".:/";
> include '/templates/foo.html';
> include '/templates/bar.html';
> ?>

....mal abgesehen von Schreibfehlern... es muß natürlich heißen:

<?php
include_path = ".:/";
include '/template/foo.html';
include '/template/bar.html';
?>


--
Andre Tann
Andre Tann [ Di, 04 September 2007 14:06 ] [ ID #1812308 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:

> ich möchte gern mit include Dateien einbinden. Es existieren:
>
> /test/skript.php
> /template/foo.html
> /template/bar.html

Im Hauptverzeichnis Deiner Festplatte? Da gehören sie doch bestimmt
nicht hin.

> Jetzt möchte ich in skript.php die Dateien foo.html und bar.html
> einbinden. Warum funktioniert das nicht:
>
> <?php
> include_path = ".:/";

include_path ist kein PHP-Befehl, sondern eine Konfigurationsoption.
Wenn Du diese zur Laufzeit verändern willst, musst Du schon
set_include_path() bemühen.

> include '/templates/foo.html';
> include '/templates/bar.html';

include_path greift nur bei relativen Pfaden. Du benutzt jedoch absolute
Pfade.

> Mit include_path gebe ich das aktuelle Verzeichnis "."und das
> docroot "/" als Pfad an

Du hast das Hauptverzeichnis Deiner Festplatte als docroot gesetzt? Das
ist _sehr_ schlecht!

> und von dort sollten doch foo.html und
> bar.html zu finden sein.

Wenn Deine Angaben tatsächlich zutreffen, sollten sie zu finden sein.

Welche Fehlermeldungen hast Du denn bekommen? Keine? Dann setze mal Dein
Error Reporting auf E_ALL. Möglicherweise bringt Dich das schon auf die
richtige Spur.

Gruß. Claus
Claus Reibenstein [ Di, 04 September 2007 14:32 ] [ ID #1812314 ]

Re: Dateien mit include einbinden

Claus Reibenstein schrieb:
> Welche Fehlermeldungen hast Du denn bekommen? Keine? Dann setze mal Dein
> Error Reporting auf E_ALL. Möglicherweise bringt Dich das schon auf die
> richtige Spur.

Spätestens ...

> Andre Tann schrieb:
>> include_path = ".:/";

.... hätte zu einer Fehlermeldung führen müssen. Von daher ist ganz stark
davon auszugehen, das error_reporting() und display_errors() hier die
ersten Maßnahmen sein sollten!


Gruß,
Habbo
bruening [ Di, 04 September 2007 14:47 ] [ ID #1812318 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:

>docroot "/"

Docroot ist eine Erfindung des Webservers. Für PHP hat '/' grundsätzlich eine
andere Bedeutung und meint das Root-Verzeichnis des gesamten Servers, also je
nach Konfiguration viele Verzeichnissebenen weiter oben.
Dort wirst du in den seltensten Fällen deine Dateien abgelegt haben.

--
Wolfgang Fellger
Wolfgang Fellger [ Di, 04 September 2007 14:52 ] [ ID #1812319 ]

Re: Dateien mit include einbinden

Wolfgang Fellger wrote:

> Docroot ist eine Erfindung des Webservers. Für PHP hat '/'
> grundsätzlich eine andere Bedeutung und meint das Root-Verzeichnis des
> gesamten Servers, also je nach Konfiguration viele Verzeichnissebenen
> weiter oben. Dort wirst du in den seltensten Fällen deine Dateien
> abgelegt haben.

OK. Wie gebe ich es also am besten an? Die Struktur ist so:

/srv/www/example.com/

ist das Verzeichnis, aus dem heraus der Webserver arbeitet, also
sozusagen dessen docroot. In

/srv/www/example.com/templates

liegen die einzuschließenden Dateien, und das Skript liegt hier:

/srv/www/example.com/test/skript.php

Wie sähen jetzt die richtigen Pfade aus? So?

<?php
include '/srv/www/example.com/templates/foo.html';
include '/srv/www/example.com/templates/bar.html';
?>

Ich würde mich bei der Pfadangabe lieber auf das docroot des Webservers
beziehen, denn dann könnte ich dieses uU auch mal verschieben, ohne daß
ich gleich die ganzen Pfade umschreiben muß. OK, das mag mit einem
netten Perl-Skript automatisch gehen, aber trotzdem.

--
Andre Tann
Andre Tann [ Di, 04 September 2007 15:25 ] [ ID #1812325 ]

Re: Dateien mit include einbinden

Claus Reibenstein wrote:


>> /test/skript.php
>> /template/foo.html
>> /template/bar.html
>
> Im Hauptverzeichnis Deiner Festplatte? Da gehören sie doch bestimmt
> nicht hin.

Nein, das ist relativ zum docroot gemeint, also /srv/www/example.com/...


> include_path greift nur bei relativen Pfaden. Du benutzt jedoch
> absolute Pfade.

Am liebsten würde ich absolute Pfade verwenden, die sich auf das docroot
beziehen, und nicht auf das gesamte Dateisystem. Geht das? Denn dann
könnte ich das Skript in allen möglichen Dateien verwenden, und es
würde trotzdem immer seine Templates finden. Oder würde ich so
notieren?

include 'http://www.example.com/templates/foo.html';
include 'http://www.example.com/templates/bar.html';


> Du hast das Hauptverzeichnis Deiner Festplatte als docroot gesetzt?
> Das ist _sehr_ schlecht!

Hmpf... Mit shtml siehts halt so aus:

<!--#include virtual="/templates/blabla.html" -->


--
Andre Tann
Andre Tann [ Di, 04 September 2007 15:33 ] [ ID #1812326 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> Am liebsten würde ich absolute Pfade verwenden, die sich auf das docroot
> beziehen, und nicht auf das gesamte Dateisystem. Geht das? Denn dann
> könnte ich das Skript in allen möglichen Dateien verwenden, und es
> würde trotzdem immer seine Templates finden. Oder würde ich so
> notieren?
>
> include 'http://www.example.com/templates/foo.html';

Die Grundidee ist gut. Allerdings kannst du natürlich nicht über den
HTTP-Wrapper includen, du willst ja höchstwahrscheinlich später
vielleicht auch ausführbaren Code ins Script einbinden. Das geht nur
über das Dateisystem selbst.

Ein Ansatz hierzu wäre

include dirname(__FILE__) . '/templates/foo.html;

Wenn das Script selbst nicht im Docroot deines Webservers liegt, oder
diese Prozedur öfter aufgerufen wird, kannst du dir deinen absoluten
Pfad zum Script auch in eine Konstante packen.

In der index.php schreibst du dann

define('DOCROOT', dirname(__FILE__) . '/');

und in späteren Scripten

include DOCROOT . 'templates/foo.html';



Schöne Grüße,
Habbo
bruening [ Di, 04 September 2007 15:52 ] [ ID #1812333 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> Wolfgang Fellger wrote:
>
>> Docroot ist eine Erfindung des Webservers. F=C3=BCr PHP hat '/'
>> grunds=C3=A4tzlich eine andere Bedeutung und meint das Root-Verzeichni=
s des
>> gesamten Servers, also je nach Konfiguration viele Verzeichnissebenen
>> weiter oben. Dort wirst du in den seltensten F=C3=A4llen deine Dateien=

>> abgelegt haben.
>
> OK. Wie gebe ich es also am besten an? Die Struktur ist so:
>
> /srv/www/example.com/
>
> ist das Verzeichnis, aus dem heraus der Webserver arbeitet, also
> sozusagen dessen docroot. In
>
> /srv/www/example.com/templates
>
> liegen die einzuschlie=C3=9Fenden Dateien, und das Skript liegt hier:
>
> /srv/www/example.com/test/skript.php

> Wie s=C3=A4hen jetzt die richtigen Pfade aus? So?
>
> <?php
> include '/srv/www/example.com/templates/foo.html';
> include '/srv/www/example.com/templates/bar.html';
> ?>

Sofern deine Templates PHP Code enthalten dann verwende:
<?php
include $_SERVER['DOCUMENT_ROOT'].'/templates/foo.html';
?>

Sofern da kein PHP Code drin ist dann ist readfile() oder
file_get_contents() dein Freund, je nachdem ob du die Inhalte nur
durchreichen moechtest oder in einer Variable haben moechtest.

Gruss
Joerg

--
TakeNet GmbH, Geschaeftsfuehrer Wolfgang Meier
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Stra=C3=9Fe 20 Fax: +49 931 903-3025
HRB Wuerzburg 6940 http://www.takenet.de
Joerg Behrens [ Di, 04 September 2007 16:02 ] [ ID #1812334 ]

Re: Dateien mit include einbinden

Jan Habbo Brüning wrote:

>> include 'http://www.example.com/templates/foo.html';
>
> Die Grundidee ist gut.

....funktioniert aber nicht. Die Seite sieht jetzt so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="de-de">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Titel</title>
<link rel="stylesheet" type="text/css"
href="http://www.example.com/style.css">
</head>

<?php
include 'http://www.example.com/templates/foo.html';
include 'http://www.example.com/templates/bar.html';
?>
[es folgt tonnenweise html-Code]

Wenn ich die Seite aufrufe, dann ist </head> das letzte, was
ausgeliefert wird. Vom Rest ist nichts zu sehen. Ich hab auch extra per
copy&paste überprüft, daß die Links stimmen, die da inkludiert werden
sollen. Daran kann es also nicht liegen.

Was gäbs noch für Gründe, wieso das nicht klappt?



> Allerdings kannst du natürlich nicht über den
> HTTP-Wrapper includen, du willst ja höchstwahrscheinlich später
> vielleicht auch ausführbaren Code ins Script einbinden. Das geht nur
> über das Dateisystem selbst.

In diesem Fall will ich tatsächlich nur die Dateien einbinden. Der
andere Code kommt dann weiter unten.


--
Andre Tann
Andre Tann [ Di, 04 September 2007 16:38 ] [ ID #1812336 ]

Re: Dateien mit include einbinden

Hallo,

Andre Tann schrieb:
> Jan Habbo Brüning wrote:
>
>>> include 'http://www.example.com/templates/foo.html';
>> Die Grundidee ist gut.
>
> ....funktioniert aber nicht.

Hättest du den Satz danach auch noch gelesen, hättest du dir den Test
gespart, da Jan das schon geschrieben hatte ;)
Nimm doch stattdessen seinen Vorschlag
>> include dirname(__FILE__) . '/templates/foo.html;

an, dann funktioniert dein Skript auch noch, wenn du die Daten verschiebst.

Gruß, Stefan
Stefan Jonas [ Di, 04 September 2007 16:43 ] [ ID #1812337 ]

Re: Dateien mit include einbinden

Stefan Jonas wrote:

> Hättest du den Satz danach auch noch gelesen, hättest du dir den Test
> gespart, da Jan das schon geschrieben hatte ;)

Ich dachte, daß sich das Nicht-funktionieren nur auf den Fall bezieht,
daß ich ausführbaren Code in der einbezogenen Datei drin hab, was aber
nicht der Fall ist.


> Nimm doch stattdessen seinen Vorschlag
> >> include dirname(__FILE__) . '/templates/foo.html;
>
> an, dann funktioniert dein Skript auch noch, wenn du die Daten
> verschiebst.

Mist, das funktioniert auch nicht, denn es handelt sich bei foo.html
tatsächlich (aus historischen Gründen) um foo.shtml, d.h. daß foo.shtml
seinerseits irgendwelche Dateien inkludiert durch Code in der Art:

<!--#include virtual="/templates/blabla..." -->


Gibt es keine Möglichkeit, einfach dasjenige einzubinden, was der
Webserver auswirft, wenn man example.com/templates/foo.shtml aufruft?
Denn bei diesem Aufruf kriege ich genau den Code, denn ich gern
eingebunden haben will.

Anders gefragt: kann man nicht etwas wie

include 'irgendeine-url.de/irgend/ein/pfad';

notieren?

--
Andre Tann
Andre Tann [ Di, 04 September 2007 17:27 ] [ ID #1812339 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> Mist, das funktioniert auch nicht, denn es handelt sich bei foo.html
> tatsächlich (aus historischen Gründen) um foo.shtml, d.h. daß foo.shtml
> seinerseits irgendwelche Dateien inkludiert durch Code in der Art:
>
> <!--#include virtual="/templates/blabla..." -->

Vielleicht wird es hier mal Zeit für einen Rundumschlag?

> Gibt es keine Möglichkeit, einfach dasjenige einzubinden, was der
> Webserver auswirft, wenn man example.com/templates/foo.shtml aufruft?
> Denn bei diesem Aufruf kriege ich genau den Code, denn ich gern
> eingebunden haben will.
>
> Anders gefragt: kann man nicht etwas wie
>
> include 'irgendeine-url.de/irgend/ein/pfad';
>
> notieren?

Du kannst das über den HTTP Wrapper von fopen() machen, halte ich aber
für abenteuerlich. Denk lieber über dein Gesamtkonzept nach ...


Gruß,
Habbo
bruening [ Di, 04 September 2007 17:43 ] [ ID #1812341 ]

Re: Dateien mit include einbinden

Jan Habbo Brüning wrote:


>> <!--#include virtual="/templates/blabla..." -->
>
> Vielleicht wird es hier mal Zeit für einen Rundumschlag?

Weiß nicht... wozu? Es funktioniert ja jetzt gut. Der einzige Grund,
warum ich mit dem php-Krams angefangen habe ist, daß ich auf genau
einer Seite tagsüber ein Bild darstellen will, welches nachts nicht
sichtbar sein soll.

<?
$zeit = date('H');
if ( ($zeit > 8) and ($zeit < 20) ) {
echo "<img src=...>";
}
?>

Also ist aus meiner bild.shtml eine bild.php geworden, und jetzt
funktionieren halt die "include virtual=" nicht mehr. Und die ganze
Site umkrempeln, nur damit das wieder geht? Da steht Nutzen in keinem
Verhältnis zum Aufwand.


> Du kannst das über den HTTP Wrapper von fopen() machen, halte ich aber
> für abenteuerlich. Denk lieber über dein Gesamtkonzept nach ...

Ich finde mein Konzept gar nicht so schlecht. Es funktioniert gut, und
ist pflegeleicht. Und ob ich jetzt per shtml inkludiere oder per php,
das ist doch gesprungen wie gehopst.

Also wenn Du mir einen fopen()-Schnipsel geben könntest, dann wäre ich
dankbar.
Oder was könnte ich noch für einen Grund haben, alles zu phpisieren?
Meiner Meinung nach würde das erst dann sinnvoll sein, wenn ich die
ganze Webseite aus einer Datenbank heraus generiere. Aber solange nur
links das Inhaltsverzeichnis reinsoll, ist das völlig overkill.

--
Andre Tann
Andre Tann [ Di, 04 September 2007 18:32 ] [ ID #1812342 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> <?
> $zeit = date('H');
> if ( ($zeit > 8) and ($zeit < 20) ) {
> echo "<img src=...>";
> }
> ?>

Du solltest "<?php" als Öffnungstag benutzen, "<?" ist nicht mehr
zeitgemäß. Aber in der Anbetracht der Tatsache, dass du ja auch noch mit
SSI arbeitest ... vergiss es einfach wieder :)


> Also wenn Du mir einen fopen()-Schnipsel geben könntest, dann wäre ich
> dankbar.

Findest du sicherlich zuhauf unter www.php.net/fopen

> Oder was könnte ich noch für einen Grund haben, alles zu phpisieren?
> Meiner Meinung nach würde das erst dann sinnvoll sein, wenn ich die
> ganze Webseite aus einer Datenbank heraus generiere. Aber solange nur
> links das Inhaltsverzeichnis reinsoll, ist das völlig overkill.

Anscheinend hast du ja selbst jetzt schon einen Grund dich mit PHP zu
befassen, obwohl du keine DB benutzt.


Schönen Gruß,
Habbo
bruening [ Di, 04 September 2007 18:43 ] [ ID #1812343 ]

Re: Dateien mit include einbinden

Jan Habbo Brüning wrote:

> Du solltest "<?php" als Öffnungstag benutzen, "<?" ist nicht mehr
> zeitgemäß. Aber in der Anbetracht der Tatsache, dass du ja auch noch
> mit SSI arbeitest ... vergiss es einfach wieder :)

Hmja, nun weiß ich das auch. Ich denke, ich nehm tatsächlich lieber php.
Ist viel cooler, und man ist auch gleich viel zeitgemäßer.


>> Also wenn Du mir einen fopen()-Schnipsel geben könntest, dann wäre
>> ich dankbar.
>
> Findest du sicherlich zuhauf unter www.php.net/fopen

Dort lese ich seit einer gute Weile, denn diesen Link hat mir Google
schon verraten. Aber dort findet sich nicht ein einziger Schnipsel, mit
dem ich was anfangen könnte. Ist auch klar, denn wenn ich das richtig
verstehe, dann brauche ich irgendeine Kombination aus fopen, fread,
fclose, usw. Aber da ich leider kein php kann, kann ich auch mit den
Beschreibungen nicht viel anfangen.


> Anscheinend hast du ja selbst jetzt schon einen Grund dich mit PHP zu
> befassen, obwohl du keine DB benutzt.

Ja, ich will genau ein Bild mal drinhaben, mal nicht. Und deswegen
schreibe ich nicht die ganze Seite um, auch wenn ich danach viel cooler
wäre.

Ich hatte gehofft, daß ich vielleicht einen Einzeiler kriegen könnte,
mit dem ich weiterkomme. Aber da ich noch so voll altmodisch mit SSI
arbeite, geht das wohl nicht.

--
Andre Tann
Andre Tann [ Di, 04 September 2007 19:03 ] [ ID #1812344 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> Jan Habbo Br=C3=BCning wrote:
>
>> Du solltest "<?php" als =C3=96ffnungstag benutzen, "<?" ist nicht mehr=

>> zeitgem=C3=A4=C3=9F. Aber in der Anbetracht der Tatsache, dass du ja a=
uch noch
>> mit SSI arbeitest ... vergiss es einfach wieder :)
>
> Hmja, nun wei=C3=9F ich das auch. Ich denke, ich nehm tats=C3=A4chlich =
lieber php.
> Ist viel cooler, und man ist auch gleich viel zeitgem=C3=A4=C3=9Fer.
>
Nun mal die Kirche im Dorf lassen.

Sofern du PHP als Modul im Apache benutzt hift dir bei deinem Problem
evt. http://www.php.net/virtual weiter.

Gruss
Joerg

--
TakeNet GmbH, Geschaeftsfuehrer Wolfgang Meier
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Stra=C3=9Fe 20 Fax: +49 931 903-3025
HRB Wuerzburg 6940 http://www.takenet.de
Joerg Behrens [ Di, 04 September 2007 21:54 ] [ ID #1812347 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
> Jan Habbo Brüning wrote:

>> Denk lieber über dein Gesamtkonzept nach ...
>
> Ich finde mein Konzept gar nicht so schlecht. Es funktioniert gut, und
> ist pflegeleicht. Und ob ich jetzt per shtml inkludiere oder per php,
> das ist doch gesprungen wie gehopst.

Dein Konzept zur (Nicht-)Einbindung des Bildes ist falsch[tm].

In deinen HTML-Code baust du einfach ein <img src=3D"bild.php" ... />
(ohne Größenangaben) ein.
Das Skript bild.php sendet dann abhängig von der Uhrzeit das Bild oder
ein Nullbild. Damit ist das PHP-Skript völlig unabhängig von deiner
bisherigen Umgebung, die also nicht weiter angepasst werden muss.
Sieh dir also im Manual header() an, das wirst du brauchen.Von da aus
kommst du dann sicher weiter.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Di, 04 September 2007 23:44 ] [ ID #1812348 ]

Re: Dateien mit include einbinden

Andre Tann schrieb:
[...]
> Anders gefragt: kann man nicht etwas wie
>
> include 'irgendeine-url.de/irgend/ein/pfad';
>
> notieren?

Im Grunde ja. Nur steht z.B. bei meinem Provider (und bei anderen sicher
auch) in der php.ini "allow_url_include=Off". Da führt obiges zur
Fehlermeldung, falls Du mit irgendeine-url.de eigentlich
http://irgendeine-url.de meinst.

Ralph
Ralph Stahl [ Mi, 05 September 2007 09:09 ] [ ID #1813166 ]
PHP » de.comp.lang.php.misc » Dateien mit include einbinden

Vorheriges Thema: PHP und ORM
Nächstes Thema: refresh von includefiles