hannes: include-Problem resp. absoluter Pfad

Hallo,
ich möchte ein Navigationsscript in files, die in unterschiedl. Verzeichnisebenen liegen, einbinden, und zwar so, dass die Links trotzdem funktionieren.

Meine Verzeichnisstruktur:
/root/mypath.php
...etc.

/root/pages/navigation.php
/root/pages/a.php
...etc.

und weiter:
/root/pages/subdir/script_das_die_navigation_einbinden_moechte.php
/root/pages/subdir/subsubdir/weiteres_script_das_die_navigation_einbinden_moechte.php
...etc.

Also brauche ich im Navigationsscript absolute Pfade für die darin gesetzten Links. Ich beginne also mit dem root-Verzeichnis (weil das lokal und öffentlich nicht gleich ist, muss ich es ermitteln).

Deshalb habe ich mit

  
$script_path = realpath(basename(getenv("SCRIPT_NAME")));  
$slash = explode('/', getenv("SCRIPT_NAME"));  
$current_filename = $slash[count($slash) - 1];  
$host_url = str_replace($current_filename, "", getenv("SCRIPT_NAME"));  
define ("MYPATH",$host_url);  

den Namen des root-Verzeichnisses ermittelt. Das ist da, wo das file 'mypath.php' liegt.
echo MYPATH;
zeigt den korrekten Namen des root-Verzeichnisses.

Um MYPATH in 'navigation.php' nutzbar zu machen, habe ich mittels
include('../mypath.php');
die root-Konstante MYPATH in 'navigation.php' eingebunden. Nur kann ich mit dem Ergebnis nichts anfangen.

Ein Link in 'navigation.php' heisst z.B. 'a.php' ('a.php' liegt am gleichen Ort wie 'navigation.php').
Mit MYPATH/pages/a.php sollte meiner Ansicht der Link zu /root/pages/a.php werden (wo die Datei ja auch liegt). Tut er aber nicht - sondern: /root/pages/pages/a.php.

MYPATH hat offenbar wegen des include den neuen 'Aufenthaltsort' übergenommen. Ich dachte aber, eine Konstante sei eine Konstante.

Kann mir jemand erklären, was da los ist?
Oder, wie ich das eingangs erwähnte Problem auf andere Art lösen könnte?

Vielen Dank zum voraus

  1. Tach!

    $script_path = realpath(basename(getenv("SCRIPT_NAME")));

    Der PHP-Weg wäre, das Array $_SERVER statt getenv() zu verwenden. Was machst du eigentlich mit dieser Zeile? Die Variable wird anschließend gar nicht verwendet.

    Ein Link in 'navigation.php' heisst z.B. 'a.php' ('a.php' liegt am gleichen Ort wie 'navigation.php').
    Mit MYPATH/pages/a.php sollte meiner Ansicht der Link zu /root/pages/a.php werden (wo die Datei ja auch liegt). Tut er aber nicht - sondern: /root/pages/pages/a.php.

    Richtig, denn MYPATH wird anhand des SCRIPT_NAME vom vom Request aufgerufenen Script ermittelt und nicht anhand des Dateinamens von mypath.php.

    dedlfix.

    1. Hallo dedlfix

      Richtig, denn MYPATH wird anhand des SCRIPT_NAME vom vom Request aufgerufenen Script ermittelt und nicht anhand des Dateinamens von mypath.php.

      Ich versteh das nicht. SCRIPT_NAME wird ja in 'mypath.php' ermittelt und die Konstante MYPATH wird  ebenfalls da definiert - und 'mypath.php' liegt direkt im root-Verzeichnis (also eine Ebene höher als 'navigation.php').

      Gruss
      hannes

      1. Tach!

        Richtig, denn MYPATH wird anhand des SCRIPT_NAME vom vom Request aufgerufenen Script ermittelt und nicht anhand des Dateinamens von mypath.php.
        Ich versteh das nicht. SCRIPT_NAME wird ja in 'mypath.php' ermittelt [...]

        mypath.php wird nicht per (HTTP-)Request aufgerufen sondern von PHP inkludiert. Dabei erzeugt PHP keine neuen Umgebungsvariablen oder Einträge in $_SERVER. Der Dateiname der aktuellen Datei steht in __FILE__, das Verzeichnis in __DIR__.

        dedlfix.

        1. Hallo dedlfix,

          mypath.php wird nicht per (HTTP-)Request aufgerufen sondern von PHP inkludiert. Dabei erzeugt PHP keine neuen Umgebungsvariablen oder Einträge in $_SERVER. Der Dateiname der aktuellen Datei steht in __FILE__, das Verzeichnis in __DIR__.

          Sorry, ich versteh es wirklich nicht.
          Ich habe jetzt durch die index.php (diese wird ja durch HTTP-Request aufgerufen) den "Aufenthaltsort" ermitteln lassen und in MYPATH gespeichert. Ohne Erfolg.

          __FILE__ und __DIR__ kann ich nicht gebrauchen. Die liefern ja Dateiname und Ort im Dateiverzeichnis meines Rechners, nicht den Ort im lokalen Webserver.

          Gruss
          hannes

          1. Hi,

            Ich habe jetzt durch die index.php (diese wird ja durch HTTP-Request aufgerufen) den "Aufenthaltsort" ermitteln lassen und in MYPATH gespeichert. Ohne Erfolg.

            Noch mal: Was *genau* enthält MYPATH?

            MfG ChrisB

            --
            Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
            1. Hallo ChrisB

              Noch mal: Was *genau* enthält MYPATH?

              Wenn ich 'mypath.php' aufrufe, die im '/root/'-Verzeichnis liegt, enthält MYPATH den Namen eben dieses - hier so genannten - '/root/'-Verzeichnisses, also /Name von root/. Mit genau diesen Slashes. (In 'mypath.php' wird MYPATH definiert.)

              Wenn ich 'navigation.php' aufrufe (worin 'mypath.php' inkludiert wird), enthält MYPATH den Namen /Name von root/Name von pages/. 'navigation.php' liegt in '/pages/', also eine Verzeichnisebene tiefer.

              Mein '/root/'-Verzeichnis ist nicht $_SERVER['DOCUMENT_ROOT'] , denn dann bräuchte ich ja gar nicht den Namen des '/root/' herauszufinden.
              $_SERVER['DOCUMENT_ROOT'] ergibt '..etc/htdocs', aber das will ich nicht, denn in htdocs liegen noch andere Websites.
              Ich möchte nur zum root dieser bestimmten Website kommen.
              Diesen root brauche ich, weil meine lokale Verzeichnisstruktur nicht diesselbe ist, wie die auf dem öffentlichen Server. Einen absoluten Pfad brauche ich, damit ich die 'navigation.php' von überall her inkludieren kann und die Verweise dann doch noch gefunden werden (zur Erinnerung: mein Anliegen und meine Verzeichnisstruktur ist zuoberst im thread formuliert).

              Gruss
              hannes

              1. Tach!

                Wenn ich 'mypath.php' aufrufe, die im '/root/'-Verzeichnis liegt, enthält MYPATH den Namen eben dieses - hier so genannten - '/root/'-Verzeichnisses, also /Name von root/. Mit genau diesen Slashes. (In 'mypath.php' wird MYPATH definiert.)

                mypath.php ist aber nicht zum direkten Aufrufen gedacht. Wenn du das jedoch mchst, dann lautet der Request auf mypath.php. Rufst du jedoch die eigentlichen URLs auf, dann lautet der Request anders und die Daten genau dazu stehen in $_SERVER. Der Webserver und das PHP haben vor dem Scriptstart (zum Zeitpunkt wenn $_SERVER gefüllt wird) keine Ahnung, dass du darin irgendwas inkludierst. Die Daten der inkludierten Datei sind nur über __FILE__ und __DIR__ abrufbar, in $_SERVER stehen weiterhin die Daten des eigentlichen Requests.

                Mein '/root/'-Verzeichnis ist nicht $_SERVER['DOCUMENT_ROOT'] , denn dann bräuchte ich ja gar nicht den Namen des '/root/' herauszufinden.

                Es liegt doch aber wohl innerhalb dieses DocumentRoot, genauso wie die mypath.php? Dann müsstest du eben den __DIR__ectorynamen von mypath.php um das DocumentRoot kürzen und hast einen relativen Pfad ausgehend vom DocRoot zur mypath.php, und damit hast du dein "so genanntes" /root/.

                dedlfix.

                1. ... und damit hast du dein "so genanntes" /root/.

                  Also mein /root/ habe ich auf zwei Arten gefunden:
                  entweder mit MYPATH
                  oder mit $thisHttpDir = substr(dirname($_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]), strlen($_SERVER['HTTP_HOST']));

                  In 'navigation.php' funktionieren die Links mit MYPATH und mit $thisHttpDir wenn:

                  ich beispielsweise 'a.php' aufrufe. Darin inkludiert 'header.php' (in 'header.php' inkludiert 'navigation.php') - alle auf gleichem Verzeichnisniveau.

                  Sobald ich in einer anderen Verzeichnisebene (also z.Bsp. 'subdir/b.php' oder 'subdir/subsubdir/c.php') 'header.php' und 'navigation.php' inkludiere, funktionieren die Links nicht mehr. Das wäre aber mein Anliegen.
                  Ich dachte, ich hätte mit MYPATH oder mit $thisHttpDir so etwas wie einen absoluten Wert, der dann gilt, egal woher darauf zurück gegriffen wird.

                  Ich durchschau das ganze Zeug einfach nicht.
                  Gruss
                  hannes

          2. __FILE__ und __DIR__ kann ich nicht gebrauchen. Die liefern ja Dateiname und Ort im Dateiverzeichnis meines Rechners, nicht den Ort im lokalen Webserver.

            Dann zieh $_SERVER['DOCUMENT_ROOT'] davon ab! Etwas wie

              
            $thisHttpDir = substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT']));  
            
            

            wird ja wohl reichen.

            Jörg Reinholz

            1. Etwas wie

              $thisHttpDir = substr(DIR, strlen($_SERVER['DOCUMENT_ROOT']));

                
              ja, gute Idee. Hilft mir für ein ander mal.  
                
              Hier jedoch bringt mir  
              ~~~php
                
              $thisHttpDir = substr(dirname($_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]), strlen($_SERVER['HTTP_HOST']));  
              
              

              das Gleiche wie MYPATH

              1. Etwas wie

                $thisHttpDir = substr(DIR, strlen($_SERVER['DOCUMENT_ROOT']));

                
                >   
                > ja, gute Idee. Hilft mir für ein ander mal.  
                >   
                > Hier jedoch bringt mir  
                > ~~~php
                  
                
                > $thisHttpDir = substr(dirname($_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]), strlen($_SERVER['HTTP_HOST']));  
                > 
                
                

                das Gleiche wie MYPATH

                Realitätscheck

                $_SERVER['HTTP_HOST'] : www.fastix.org

                $_SERVER['SERVER_NAME'] : www.fastix.org

                $_SERVER["SCRIPT_NAME"] : /foo.php

                Zusammengebaut:
                'www.fastix.org/foo.php'

                Dateiname mit dirname entfernt:
                'www.fastix.org/'

                Abziehen von www.fastix.org. Es bleibt:
                '/'

                Das sieht jetzt mal nach einer "ziemlich speziellen" Lösung aus. Darüber hinaus wolltest Du doch bisher immer wissen, wo denn die inkludierte Datei ist?

                Jörg Reinholz

                1. Realitätscheck

                  $_SERVER['HTTP_HOST'] : www.fastix.org

                  $_SERVER['SERVER_NAME'] : www.fastix.org

                  $_SERVER["SCRIPT_NAME"] : /foo.php

                  Zusammengebaut:
                  'www.fastix.org/foo.php'

                  Dateiname mit dirname entfernt:
                  'www.fastix.org/'

                  Abziehen von www.fastix.org. Es bleibt:
                  '/'

                  bei mir ergeben
                  $_SERVER['HTTP_HOST'] : localhost
                  $_SERVER['SERVER_NAME'] : localhost
                  $_SERVER['SCRIPT_NAME'] :  /der gesuchte root/meine pages/foo.php

                  das Ganze:
                  substr(dirname($_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]), strlen($_SERVER['HTTP_HOST'])) : /der gesuchte root/meine pages/
                  wenn foo.php in /der gesuchte root/meine pages/ liegt

                  Da dort auch die 'navigation.php' liegt, kann ich die auf diese Art zusammengesetzten Verweise verwenden. Aber eben nur aus dieser Verzeichnisebene heraus.

    2. Moin!

      Tach!

      $script_path = realpath(basename(getenv("SCRIPT_NAME")));

      Der aktuelle Dateisystemname des benutzten Files steht in der magischen Konstanten __FILE__ - wenn man nur das Verzeichnis braucht, nimmt man __DIR__.

      Kein Rumgefrickel mit Funktionen, kein Zugriff auf "das Environment", kein Auflösen des Pfads mit Dateisystemfunktionen (Lesezugriffe brauchen Performance).

      - Sven Rautenberg

      1. $script_path = realpath(basename(getenv("SCRIPT_NAME")));

        Der aktuelle Dateisystemname des benutzten Files steht in der magischen Konstanten __FILE__

        okay, vielen Dank

  2. Hi,

    echo MYPATH;
    zeigt den korrekten Namen des root-Verzeichnisses.

    Und das ist wortwörlich welcher?

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/