Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Include mit relativen Pfaden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Include mit relativen Pfaden

    Hallo zusammen,

    ich habe ein Problem bei der Verwendung von includes. Vereinfacht gesagt, habe ich folgende Struktur:

    index.php
    config.php
    php/dir1/login.php
    php/dir2/tools.php

    In der Datei "tools.php" wird die Datei "config.php" includiert. Nun habe ich aber das Problem, dass die Datei "tools.php" einmal von der Datei "index.php" und einmal von der Datei "login.php" includiert wird. Somit ist der Pfad aus dem die Datei "tools.php" aufgerufen wird (und in dem sie sich dann sozusagen befindet), unterschiedlich in den beiden Fällen.
    Wenn ich also in "tools.php" den Befehl
    Code:
    include "config.php"
    verwende, dann geht das gut, solange "tools.php" im Kontext von "index.php" aufgerufen wird, in einem anderen Kontext bräuchte man aber den Befehl
    Code:
    include "../../config.php"
    Kann mir jemand sagen, wie man mit diesem Problem umgehen kann?
    Ich habe in der PHP-FAQ auch schon den Hinweis auf die Konstante __FILE__ gesehen,
    Code:
    include(dirname(__FILE__)."/bar.php");
    aber auch das funktioniert ja in meinem Fall nicht, da die zu includierende Datei nicht im selben Verzeichnis ist, wie die Datei in der der include-Befehl steht.

    Ich bin mir aber sicher, dass es eine Lösung für das Problem gibt.
    Wer kennt sie?

    Gruß,
    Ole


  • #2
    Falls index.php Deine "zentrale Anlaufstelle" ist, solltest Du dort die entsprechenden Variablen oder Konstanten generieren, die die gewünschten Pfade beinhalten.

    Ich selber nutze dafür die Möglichkeit, in der PHP Config ein auto_prepend_file zu definieren, welches automatisch immer vorher gestartet wird, wenn der Client ein PHP File aufruft. Somit sind alle Configvariablen/-konstanten in jedem Script verfügbar.

    Kommentar


    • #3
      Grundsetzlich erstmal

      -nur include in der main datei verwenden.
      -kein include in einer datei die selber include wird verwenden. das schaft nur verwirung. so wie in deinem fall.

      Ich habe mir das alles mal durchgelesen ist zwar simpel wenn man eine saubere struktur hat aber ichhab keine lust mich nun in dein wirwar einzulesen.

      mfg

      Kommentar


      • #4
        Zitat von nilsfeld
        -kein include in einer datei die selber include wird verwenden.
        Dagegen hilft require_once und include_once.

        Kommentar


        • #5
          Zitat von meikel
          Falls index.php Deine "zentrale Anlaufstelle" ist, solltest Du dort die entsprechenden Variablen oder Konstanten generieren, die die gewünschten Pfade beinhalten.

          Ich selber nutze dafür die Möglichkeit, in der PHP Config ein auto_prepend_file zu definieren, welches automatisch immer vorher gestartet wird, wenn der Client ein PHP File aufruft. Somit sind alle Configvariablen/-konstanten in jedem Script verfügbar.

          Ok, dass klingt sinnvoll. Aber so ganz habe ich noch nicht verstanden, was Du meinst. Welche Pfade sollen in diesen Konstanten stehen und inwiefern hilft mir das bei meinem Problem?
          Stehe gerade irgendwie auf dem Schlauch...

          Kommentar


          • #6
            Zitat von Olel
            Welche Pfade sollen in diesen Konstanten stehen und inwiefern hilft mir das bei meinem Problem?
            Dein Problem sind die relativen Pfade. Sowas ist suboptimal, weil man absolute Pfade verwenden will. Außerdem verwendet mit nicht include sondern require_once. Dann prüft PHP nämlich, ob er das File schon mal eingefügt hat, und fügt es so nur einmal ein.

            Kommentar


            • #7
              Grundsätzlich:
              Wenn du so ein Konstrukt aufbaust, musst du davon ausgehen zumindest in einer der Erweiterungsdateien ein
              Code:
              include "config.php"
              zu haben.
              In deinem Fall liegt der Fehler in der Hauptlogik der Dateiverteilung. Du möchtest in index.php zwar ein Subinclude (tools.php), aber gleichzeitig läuft login.php auf der gleichen Verzeichnisebene wie tools.php als standalone-Skript. Wenn das so funktionieren soll, musst du alles was du in index.php machst, auch in login.php tun. Aber im Normalfall (saubere Programmierung von größeren Projekten) sollte index.php, je nach Fall, alle Subincludes verwalten.

              Besser wäre:

              In /config.php:
              Code:
              ...
              $_cfg['inc_path'] = dirname(__FILE__).'/php/inc';
              ...
              In /index.php:

              Code:
              ...
              include_once(dirname(__FILE__).'/config.php');
              ...
              if (foo_something_extended) {
                  include_once($_cfg['inc_path'].'/tools.php');
              }
              ...
              if (foo_not_logged_in) {
                  include_once($_cfg['inc_path'].'/login.php');
              }
              ...
              tools.php und login.php selbst müssten nichts mehr extra includieren und würden auf jeden Fall Zugriff auf alle config.php - Variablen haben.

              Grüsse

              Lev

              Kommentar

              Lädt...
              X