hannes: relativer Pfad? absoluter Pfad?

Hallo,
Ich habe zwei files (a.php, b.php), die auf unterschiedlichem Verzeichnisniveau liegen.
Beide sollen Inhalt eines dritten files (head.php) per include darstellen.
Das funktioniert auch, wenn ich bei b.php (das ein Niveau tiefer liegt) beim Pfad des zu inkludierenden head.php '../' voranstelle.
Im file head.php aber ist eine Grafik eingebunden, mit absolutem Pfad (Grafik/logo.gif). Diese Grafik wird nun aber nur in a.php angezeigt (a.php ist auf dem gleichen Verzeichnisniveau wie der Grafik-Ordner), nicht in b.php, das ja wie gesagt eine Ebene tiefer im Verzeichnisniveau liegt.
Nun könnte ich ja zwei head.php-files erstellen (mit entsprechend angepassten Verweisen zur Grafikdatei. Aber das beeinhaltet eine mögliche Fehlerquelle (bei späteren Anpassungen müssten die Änderungen an zwei Orten vorgenommen werden); und sehr elegant ist es wohl  auch nicht.
Ich finde keine Lösung zu diesem Problem. Hat jemand eine gute Idee?
Gruss

  1. Hi,

    Im file head.php aber ist eine Grafik eingebunden, mit absolutem Pfad (Grafik/logo.gif).

    Das ist *kein* absoluter Pfad.

    Ich finde keine Lösung zu diesem Problem. Hat jemand eine gute Idee?

    Verwende einen wirklich absoluten Pfad.
    Entweder mit einem vollstaendigen URI inkl. Protokollangabe und Domainname - oder eben eine absolute Pfadangabe relativ zum Basis-URI.

    http://de.selfhtml.org/html/allgemein/referenzieren.htm

    MfG ChrisB

    1. ... oder eben eine absolute Pfadangabe relativ zum Basis-URI.

      Ja, so geht das hier auf dem lokalen Rechner, bei meiner Verzeichnisstruktur. Wenn ich aber die Seite auf den Server des Providers hochlade, funktioniert das nicht, weil die Verzeichnisstruktur eine andere ist.

      Gibt es denn nicht irgendwie eine Möglichkeit mit $_SERVER['PHP_SELF'] oder $_SERVER['DOCUMENT_ROOT'] oder ähnlich? (Diese beiden Varianten hatte ich schon probiert, aber ohne Erfolg.)

      1. Hi,

        ... oder eben eine absolute Pfadangabe relativ zum Basis-URI.

        Ja, so geht das hier auf dem lokalen Rechner, bei meiner Verzeichnisstruktur. Wenn ich aber die Seite auf den Server des Providers hochlade, funktioniert das nicht, weil die Verzeichnisstruktur eine andere ist.

        Berücksichtige meine andere Antwort, dann klappt's auch.

        Gibt es denn nicht irgendwie eine Möglichkeit mit $_SERVER['PHP_SELF'] oder $_SERVER['DOCUMENT_ROOT'] oder ähnlich?

        letzteres liefert Dir den absoluten Pfad des Startverzeichnisses im Dateisystem des Servers - den brauchst Du für include, wenn Du keine relative Angabe zum aktuellen Verzeichnis machen willst.

        freundliche Grüße
        Ingo

  2. Hi hannes!

    Ich finde keine Lösung zu diesem Problem. Hat jemand eine gute Idee?

    Du könntest in a.php und b.php eine Variable mit dem jeweiligen Pfad anlegen und diese dann in head.php vor den Namen der Grafik setzen.
    Wobei ich persönlich es vermutlich so halten würde, dass Seiten, die den gleichen Header verwenden, auch im gleichen Verzeichnis liegen. Aber vermutlich hast Du deine Gründe.

    mfG
    Benjamin

    --
    Selfcode: ie:} fl:{ br:> va:) ls:< fo:( rl:? n4:# ss:| de:] js:| ch:? sh:( mo:? zu:)
    "Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung."
    (Albert Einstein)
  3. Hi,

    Im file head.php aber ist eine Grafik eingebunden, mit absolutem Pfad (Grafik/logo.gif).

    das ist ein relativer Pfad.

    Diese Grafik wird nun aber nur in a.php angezeigt (a.php ist auf dem gleichen Verzeichnisniveau wie der Grafik-Ordner),

    Du meinst direkt darüber?!

    Nun könnte ich ja zwei head.php-files erstellen (mit entsprechend angepassten Verweisen zur Grafikdatei. Aber das beeinhaltet eine mögliche Fehlerquelle (bei späteren Anpassungen müssten die Änderungen an zwei Orten vorgenommen werden); und sehr elegant ist es wohl  auch nicht.
    Ich finde keine Lösung zu diesem Problem. Hat jemand eine gute Idee?

    Du kannst absolute Pfade angeben. Wobei Du unterscheiden musst zwischen dem Dateisystem und dem HTTP-Server. Include nutzt die Verzeichnisse des Dateisystems und HTTP das eingestellte Startverzeichnis der Domain als Root. Ein über HTML eingebundes Bild http://example.org/Grafik/logo.gif kannst Du demnach so addressieren: "/Grafik/logo.gif".

    freundliche Grüße
    Ingo

    1. Guten Tag Ingo,

      Diese Grafik wird nun aber nur in a.php angezeigt (a.php ist auf dem gleichen Verzeichnisniveau wie der Grafik-Ordner),
      Du meinst direkt darüber?!

      a.php liegt hier: http://example.org/a.php
      b.php liegt hier: http://example.org/sub/b.php
      head.php liegt hier: http://example.org/head.php
      logo.gif liegt hier: http://example.org/Grafik/logo.gif

      ...kannst Du demnach so addressieren: "/Grafik/logo.gif".

      Das habe ich ohne Erfolg probiert.

      Auch über den Vorschlag von Benjamin Buxbaum

      Du könntest in a.php und b.php eine Variable mit dem jeweiligen Pfad anlegen und diese dann in head.php vor den Namen der Grafik setzen.

      habe ich nachgedacht. Ich komme einfach nicht zum gewünschten Ziel.

      1. Mahlzeit,

        a.php liegt hier: http://example.org/a.php
        b.php liegt hier: http://example.org/sub/b.php
        head.php liegt hier: http://example.org/head.php
        logo.gif liegt hier: http://example.org/Grafik/logo.gif

        ...kannst Du demnach so addressieren: "/Grafik/logo.gif".
        Das habe ich ohne Erfolg probiert.

        Tut mir leid, aber das kann ich nicht glauben. Wenn "logo.gif" in einem Verzeichnis namens "Grafik" liegt, das direkt im DOCUMENT_ROOT existiert, dann MUSS eine absolute Pfadangabe wie <img src="/Grafik/logo.gif"> funktionieren - oder aber Dein Webserver ist total verkonfiguriert ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hallo EKKi,

          Tut mir leid, aber das kann ich nicht glauben.

          Damit hast du möglicherweise recht. Ich glaube, ich habe das ganze immer noch nicht ganz begriffen. Die Pfadangaben sind so:
          a.php liegt hier: http://localhost/Bsp2/[example.org]/a.php
          b.php liegt hier: http://localhost/Bsp2/[example.org]/sub/b.php
          head.php liegt hier: http://localhost/Bsp2/[example.org]/head.php
          logo.gif liegt hier: http://localhost/Bsp2/[example.org]/Grafik/logo.gif

          Nach Fertigstellung soll alles, was jetzt in 'example.org' liegt (das ist ein Ordner) in das root-Verzeichnis beim Provider ('public_html' oder 'www' oder wie das dann dort heisst) kommen.

          1. Hi,

            Damit hast du möglicherweise recht. Ich glaube, ich habe das ganze immer noch nicht ganz begriffen. Die Pfadangaben sind so:
            a.php liegt hier: http://localhost/Bsp2/[example.org]/a.php

            aha, Du testest offline! Und Dein Server hat vermutlich XAMPP als Startverzeichnis eingestellt?

            Nach Fertigstellung soll alles, was jetzt in 'example.org' liegt (das ist ein Ordner) in das root-Verzeichnis beim Provider ('public_html' oder 'www' oder wie das dann dort heisst) kommen.

            dort wird es dann auch funktionieren.

            freundliche Grüße
            Ingo

          2. Hi,

            Die Pfadangaben sind so:
            a.php liegt hier: http://localhost/Bsp2/[example.org]/a.php
            b.php liegt hier: http://localhost/Bsp2/[example.org]/sub/b.php
            head.php liegt hier: http://localhost/Bsp2/[example.org]/head.php
            logo.gif liegt hier: http://localhost/Bsp2/[example.org]/Grafik/logo.gif

            Nach Fertigstellung soll alles, was jetzt in 'example.org' liegt (das ist ein Ordner) in das root-Verzeichnis beim Provider ('public_html' oder 'www' oder wie das dann dort heisst) kommen.

            Warum machst du dir das Leben so schwer, in dem du deine Testumgebung so suboptimal aufsetzt?
            Je besser eine Testumgebung die Realitaet widerspiegelt, desto einfacher ist doch alles.

            Lege dir also einen VirtualHost an, dessen DocumentRoot direkt auf das Verzeichnis "/example.org/" zeigt, und dazu noch einen darauf verweisenden lokalen Hostnamen, wie bspw. example.org.local - und rufe dann deine Testseiten einfach darueber auf.

            MfG ChrisB