Matzeee: PHP rootdir und Path handling...

Hey Leute,

ich schreibe nicht oft hier aber wenn komm ich mit google echt nicht weiter :)

Habe ein Struktur Problem.
Ich habe eine soweit fertige Homepage. Nun will ich da mal ein wenig Ordnung rein bringen.

Ich checke es aber leider nicht...

Ordner:

ROOT/Webseite1/

ROOT/Webseite2/includes/header.php
              /sites/seite1.php
              /styles/style.css
              /images/favicon.ico
              /index.php
              /config.php

Was müsste ich jetzt wo festlegen damit's läuft? Ich will ja nicht in jeder Datei 10 requires / includes rein hauen und wenn sich was ändert müsste ich überall nachbessern...

Rootdir Festlegen:
define('ROOTDIR', dirname(__FILE__));
sollte funktionieren, richtig? Das muss ich dann bei jeder Datei einmal einbinden und dann noch
require_once (RDIR . 'config.php')
in der ich dann
zB.

	  
require_once (RDIR . 'includes/functions.php')  
require_once (RDIR . 'includes/header.php')  
require_once (RDIR . 'includes/menu.php')  
require_once (RDIR . 'includes/right.php')  

festhalte oder hab ich da nen Denkfehler?

Und was mach ich mit der header.php die in /includes/ ist ?
<link href="../images/favicon.ico" type="image/x-icon" rel="shortcut icon">
Wenn das in /sites/Seite1.php über die config.php includiert wird sollte es passen aber in der index.php z.B. würde ich durch das ../ ja einen Order zu "niedrig" gehen...

Ich hoffe ich konnte mein Problem / meine Probleme gut schildern und bin auf die Antworten gespannt!

Gruß Matze

  1. Tach!

    ROOT/Webseite1/

    Um was für ein Root handelt es sich hier? Filesystem, DocumentRoot vom Webserver oder Kundenverzeichnis beim Hoster mit WebseiteX/ als DocumentRoot? Und Webseite ist eine einzelne, ein Projekt aus mehreren Webseiten zu einem Thema nennt sich Website.

    ROOT/Webseite2/includes/header.php
                  /sites/seite1.php

    Auch das ist verwirrend, selbst wenn man gedanklich Website2 statt Webseite2 liest. Site in Site geschachtelt geht nach meinen Dafürhalten nicht, Site in Seite geschachtelt gleich gar nicht. Abgegrenzte Einheiten einer Website sind vielleicht Bereiche, aber Site werden sie garantiert nicht genannt.

    /styles/style.css
                  /images/favicon.ico
                  /index.php
                  /config.php

    Was müsste ich jetzt wo festlegen damit's läuft?

    Was soll denn laufen? Was wird vom Browser aufgerufen? /index ja, /config sicher nicht (dann hat es innerhalb des DocumentRoot eigentlich nichts verloren), /sites/seite1.php vermutlich ja, /includes wieder nicht (ebenfalls kein Im-DocumentRoot-Kandidat). Der Rest ist Beiwerk, muss aber beim relativen Adressieren beachtet werden.

    Ich will ja nicht in jeder Datei 10 requires / includes rein hauen und wenn sich was ändert müsste ich überall nachbessern...

    Was ist denn in den Seiten drin, das es Requires/Includes braucht? Zudem bieten ordentliche Editoren Suchen und Ersetzen über mehrere Dateien an.

    Rootdir Festlegen:
    define('ROOTDIR', dirname(__FILE__));
    sollte funktionieren, richtig?

    Wofür funktionieren? Damit bekommst du den kompletten Pfad im Dateisystem bis hin zu der Datei, in der dieser Code steht.

    Das muss ich dann bei jeder Datei einmal einbinden und dann noch
    require_once (RDIR . 'config.php')

    Soll ROOTDIR gleich RDIR sein? Wenn du mal die config.php anderswohin schieben willst, hast du von der Maßnahme keinerlei Gewinn, weil die relative Lage zur aufgerufenen Datein nicht durch das define und include automatisch nachgezogen wird.

    in der ich dann
    zB.

    require_once (RDIR . 'includes/functions.php')
    require_once (RDIR . 'includes/header.php')
    require_once (RDIR . 'includes/menu.php')
    require_once (RDIR . 'includes/right.php')

    
    > festhalte oder hab ich da nen Denkfehler?  
      
    Für index.php und alle direkt im DocumentRoot (welches wohl ROOT/Webseite2 sein wird) stehenden Dateien mag das passen, aber alles was in Unterverzeichnissen steht, findet nichts. Es sein denn, du inkludierst relativ zur aufgerufenen Datei die config.php und in der ermittelst du den dateisystemabsoluten Pfad zu den Includes.  
      
    
    > Und was mach ich mit der header.php die in /includes/ ist ?  
      
    Ich weiß nicht, an welches Problem du da dachtest.  
      
    
    > `<link href="../images/favicon.ico" type="image/x-icon" rel="shortcut icon">`{:.language-html}  
    > Wenn das in /sites/Seite1.php über die config.php includiert wird sollte es passen aber in der index.php z.B. würde ich durch das ../ ja einen Order zu "niedrig" gehen...  
      
    Verweise relativ zur aufgerufenen Datei sind nochmal eine andere Baustelle. Absolut zum DocumentRoot wäre eine Alternative, die aber auch nicht immer von Vorteil ist, wenn irgendwann man etwas in ein oder aus einem Unterverzeichnis zieht.  
      
    \-----  
      
    Eleganter lässt sich das Inkludierproblem lösen, wenn du die [include_path-Direktive](http://www.php.net/manual/en/ini.core.php#ini.include-path) außerhalb von PHP setzen kannst (in der .htaccess für die Modul-Version oder eigenen php.ini oder .user.ini für CGI). Dann kannst du innerhalb deiner Dateien alles ohne Pfad oder zumindest relativ zu einem der include\_path-Verzeichnisse angeben.  
      
      
    dedlfix.