1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

PHP - include() und kleine Tücken

Dieses Thema im Forum "OS X-Developer" wurde erstellt von TheRealDarklord, 06.11.05.

  1. 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
     
  2. mullzk

    mullzk Linsenhofener Sämling

    Dabei seit:
    04.01.04
    Beiträge:
    2.529
    hmm, wie machste du es denn jetzt? sollte eigentlich mit einem include("../include/language.php") problemlos gehen...
     
  3. 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
     
  4. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    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 ;).
     
  5. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    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?
     
  6. 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.
     
  7. slartibartfast

    slartibartfast Schöner von Nordhausen

    Dabei seit:
    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 ;)
     
  8. 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 ;)
     
  9. mullzk

    mullzk Linsenhofener Sämling

    Dabei seit:
    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...
     
  10. Ok, das scheint interessant zu klingen.
    Kannst du mir das mal bitte anhand meines Problems erläutern?
     
  11. mullzk

    mullzk Linsenhofener Sämling

    Dabei seit:
    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
     
  12. 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.
     

Diese Seite empfehlen