• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

PHP - include() und kleine Tücken

  • Ersteller TheRealDarklord
  • Erstellt am

TheRealDarklord

Gast
Hallo Leute,

ich komm mal gleich zur Sache :)
Ich arbeite derzeit an einem Browsergame und ich habe dafür ein Verzeichnis auf meinem Apache angelegt. Nun habe ich alle verschiedenen Dateien in dieses Verzeichnis erstellt und alle includes in einen Unterordner "include". Dazu gehören auch Templates, die von den Spieldateien includiert werden. Innerhalb der Template-Dateien gibt es weitere includes zu einer language.php und einer session.php (Dateibaum am Ende)

Zu meinem Spiel möchte ich jedoch auch ein unabhängiges Admin-Tool basteln, welches im Unterordner "admin" Platz finden soll. Dieses Tool soll aber auch auf die Templates und die language und die Session zugreifen.
Wenn ich dann das Template includieren will, so findet er den Link zu der language.php und der session.php nicht mehr.

Der Verzeichnisbaum ist in etwa so.

Spielverzeichnis
Code:
+admin
  -index.php
+include
  +template
    -header.php
    -footer.php
  -language.php
  -session.php
-index.php
etc.

Ist es möglich, dass ich von den beiden existierenden index.php aus ohne große Umstände das Template includieren kann? Wenn ja, wie?
Und wie ist es sonst möglich (mit großen Umständen)?

Gruß, TRD
 

mullzk

Linsenhofener Sämling
Registriert
04.01.04
Beiträge
2.529
hmm, wie machste du es denn jetzt? sollte eigentlich mit einem include("../include/language.php") problemlos gehen...
 

TheRealDarklord

Gast
Oh :)

derzeit habe ich einene include auf die header.php
von der admin/index.php aus:
include("../include/template/header.php");

von der index.php aus
include("include/template/header.php");

in der header.php steht
include("./include/language.php");


sofern die header.php von der index.pgp includiert wird, gibt es keinen Fehler
wird sie aber von der admin/index.php aus includiert regnet es nen Fehler dass die language.php net gefunden wird
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
02.04.04
Beiträge
411
TheRealDarklord schrieb:
Oh :)

derzeit habe ich einene include auf die header.php
von der admin/index.php aus:
include("../include/template/header.php");

von der index.php aus
include("include/template/header.php");

in der header.php steht
include("./include/language.php");


sofern die header.php von der index.pgp includiert wird, gibt es keinen Fehler
wird sie aber von der admin/index.php aus includiert regnet es nen Fehler dass die language.php net gefunden wird

mag sein, dass ich etwas verwirrt bin ob der fruehen Zeit am Sonntag aber sollte das nicht
Code:
include("../include/language.php");

in der header.php heissen? Sollte ich irgendwas grad falsch gepeilt hab - einfach den post ignorieren ;).
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
02.04.04
Beiträge
411
Achja, ich hab noch was vergessen. Diese Seite ist immer ganz hilfreich, wenns grad mit Fehlermeldungen im Kopf stockt. ;)

Und vielliecht mal den genauen Wortlaut der Fehlermeldung posten?
 

Sandal Tolk

Gast
in der header.php steht
include("./include/language.php");


Na dann ist doch alles klar. ./ sagt eigentlich das Dir in dem man sich grade befindet und das sollte dann /templates sein, da dort die heade php ist... also einfach dort entweder mit /include/language.php includen oder ../language.php. eins von beiden sollte gehen schätz ich.
 

slartibartfast

Schöner von Nordhausen
Registriert
10.05.05
Beiträge
323
ich glaub, ich weiß, wo das Problem liegt...

es ist so: der per "include" eingebundene Code wird immer im Kontext der aufrufenden Datei ausgeführt, es ist nix anderes, als ob der Code der include-Datei direkt im Code stehen würde.

Übertragen auf dein Problem sieht das so aus:

index.php:
include(include/templates/header.php)
-> include(include/language.php)

aber in der admin/index.php
steht dann
include(../include/templates/header.php)
als Folge haben wir dann im auszuführenden Code
-> include(include/language.php)
stehen. das würde aber auf die Datei "admin/include/language.php" verweisen, nicht auf "include/language.php", da der Code ja, wie gesagt, aus der Sicht der ersten aufrufenden Datei gesehen werden muss.


so, wie lösen wir das jetzt?

Ich mache das immer so:
in jeder Seite, die man per Browser aufruft (z.B. index.php - nicht die Templates etc.), definierst du am Anfang eine Variable, die den relativen Pfad zum Wurzelpunkt des Web-Projects angibt.
in index.php ist dann so:
Code:
$rootdir="./";
ind admin/index.php
Code:
$rootdir="../";
usw.

in deiner header.php schreibst du dann statt
Code:
include($rootdir."includes/language.php");

...voilà...


hilft dir das weiter?
wenn du was nicht so verstanden hast, einfach nochmal posten ;) liegt dann an mir, nicht an dir

Ach so, das mit dem $rootdir ist auch ein guter Trick, um z.B. aus der header.php Bilder einzufügen:
Code:
<img src="<?php echo $rootdir ?>img/logo.png" width="100" height="44" alt="Logo"/>
(oder so... ;))


Grüße
slartibartfast

PS: kann sein, dass ich da was mit den PHP-Statements nicht exakt gemacht hab'... ist schon länger her, seit ich das letzte mal zum PHP-Coden gekommen bin. aber vom Prinzip her müsste es stimmen ;)
 

TheRealDarklord

Gast
Danke slartibartfast.
So werde ich das dann machen.

Und dem Rest danke ich auch für die schnelle Hilfe :)

Man sieht sich bei weiteren Problemen ;)
 

mullzk

Linsenhofener Sämling
Registriert
04.01.04
Beiträge
2.529
oder indem du die datei auf die root der site zurückführst. zB
<img src="<?php echo $_SERVER['DOCUMENT_ROOT']?>/img/logo.png" >

Dann brauchst du diese hässlichen $rootdir nicht in jedem file anzulegen...
 

TheRealDarklord

Gast
Ok, das scheint interessant zu klingen.
Kannst du mir das mal bitte anhand meines Problems erläutern?
 

mullzk

Linsenhofener Sämling
Registriert
04.01.04
Beiträge
2.529
das problem ist, dass variablen, die in allen files deklariert werden müssen, sehr sehr hässlich sind und vor allem garantiert bei der nächsten grösseren änderung für probleme sorgen werden, weil man dann irgendwo ein file vergisst.
deshalb legt man ja solche sachen in include-files, nur geht das hier ja eben nicht, weil das $docroot benötigt wird, um auf die include-files zuzugreifen.

die alternative ist daher, dass man auf die php-variablen zurückgreift. php stellt im http-kontext mehrere pfad-variablen zur verfügung, das sinnvollste in diesem fall dürfte die $_SERVER['DOCUMENT_ROOT'] sein, welche auf das Verzeichnis verweist, welches der Webserver als Root anschaut.

in deinem fall wäre es ganz einfach einzusetzen:
wenn du auf die header-datei verweisen willst:
Code:
include($_SERVER['DOCUMENT_ROOT']."/include/template/header.php");
für einen verweis auf die language.php:
Code:
include($_SERVER['DOCUMENT_ROOT']."/include/header.php");

und das ist nun immer dasselbe, egal von welchem file aus du es aufrufen willst.

aber natürlich hat auch dieses vorgehen einen hacken: sobald sich die position deines projektes auf dem webserver ändert, stimmen diese pfade nicht mehr. wenn du zB merkst, dass das, was du bis jetzt (zB unter www.TheRealDarklord.de) hattest, nur ein teil deiner page sein soll, und du ein neues portal machen willst und alle bisherigen dateien um eine stufe runter in das directory projekt1 verschieben willst (also, dass es unter www.TheRealDarklord.de/projekt1 erreichbar ist), musst du nun auch all diese includes verändern:
Code:
include($_SERVER['DOCUMENT_ROOT']."/projekt1/include/template/header.php"); 
include($_SERVER['DOCUMENT_ROOT']."/projekt1/include/header.php");
da die befehle nun aber in jeder datei genau gleich sind, kannst du dies einfacher als sonst mit einem datei-übergreifenden search-replace machen. das gilt natürlich nur dann, wenn sich das ganze projekt inkl. den inlcude-files verändert - wenn du einfach die aktuelle index.php verschiebst, die neue datei aber auf dieselben include-files (oder ganz andere mit ganz anderem namen) verweist, ist alles ok. und natürlich gibt es auch keine komplikationen, wenn sich die server-adresse, es geht nur um den weg zum root-directory des servers zu den include-files...

kurz:
- die $docroot sache ist hässlich
- sie ist praktisch, wenn sich der pfad der ganze applikation ändert
- die $_SERVER sache ist mühsam zu tippen
- sie hat nachteile, wenn sich der standort der include-dateien verändert
- sie ist sehr praktisch, wenn du jene dateien, die auf die include-dateien zugreifen wollen, verschiebst
 

TheRealDarklord

Gast
Hm, dann ist es leider unbrauchbar für mich.
Das Browsergame ist derzeit nur temporär in einem Unterordner auf meinem lokalen Server.
Später auf dem Web-Server soll es im Hauptverzeichnis laufen und dann müsste ich das wieder alles anpassen.

Dennoch danke.