Ankündigung

Einklappen
Keine Ankündigung bisher.

inlcludes verschachteln

Einklappen

Neue Werbung 2019

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

  • inlcludes verschachteln

    Huhu Zusammen,

    ich habe mir bei einem kleinen Projekt eine Dateistruktur angelegt die ein veschachteltes include() vorrausetzt.

    Hier ein Beispiel:

    Verzeichnisstruktur:
    Code:
    OrdnerA
    OrdnerB
    OrdnerC
    OrdnerC\SubOrdnerC1
    OrdnerC\SubOrdnerC2
    OrdnerC\SubOrdnerC3
    etc...
    Verschieden Konfigurationsdateien lege ich in OrdnerA ab. Meine Funktionssammlung die ich in OrdnerB ablege bindet die Konfiguration aus OrdnerA mit der Funktion include() ein.

    Nun möchte ich diese Funktionen in den Scripten in OrdnerC, SubOrdnerC, SubOrdnerC1 etc. verwenden.

    Dabei stosse ich allerdings auf das Problem dass scheinbar die includes vom ersten zur letzten Datei aufgelöst werden und so die Pfadangebe "Funktion aus Ordner B inlclude Konfig aus Ordner A" nicht stimmt.


    Ein Beispiel:
    Das Script aus OrdnerC\SubOrdnerC3 bindet eine Funktion aus OrdnerB ein. Nun kann es an dieser Stelle nicht die Konfiguration aus OrdnerA einbinden da die Pfadangabe relativ von OrdnerC\SubOrdnerC3 zur Konfig in Ordner A nicht stimmt.



    Mit der Lösung der absoluten Pfadangabe möchte ich nicht arbeiten, da ich das Script portabel gestalten möchte.




    Kann ich das verhalten irgendwie umkehren sprich:

    in der Verkettung Script in OrdnerC\SubOrdnerC2 include Funktion in OrdnerB include Konfig aus OrdnerA

    erst die Konfig aus OrdnerA in die Funktion in Ordner B eingelesen wird und dann komplett in das Script in OrdnerC\SubOrdnerC2?




    Ich hoffe Ihr habe mein Anliegen verstanden und könnt mir helfen.
    Mit Dank und freundlichen Grüssen
    Lindi

  • #2
    Hallo Lindwyrm,

    ich denke du adressierts deine "includes" relativ, richtig? Wenn ja, nimmt der Parser an, das Skript befände sich in einem Ordner C - oder dessen Subordner - und wenn du dann ein relatives include() absetzt, kann es sein, dass die Pfade nicht passen. Besser ist es absolut zu bepfaden. Was mich aber wundert ist, dass bei dir keine Fehlermeldungen auftreten wie "include failed...". Setze mal ein

    PHP-Code:
    <?php
    error_reporting
    (E_ALL && E_NOTICE);
    ini_set('display_errors','1');

    [..]
    ?>
    an den Anfang deines Skriptes. Eine weitere Debug-Hilfe ist es in jeder einzubindenden Datei ein


    PHP-Code:
    <?php
    echo getcwd().__FILE__;

    [..]
    ?>
    einzubinden, dann sieht du, welche Datei eingebunden wird und welche nicht.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Zitat von dr.e.
      PHP-Code:
      <?php
      error_reporting
      (E_ALL && E_NOTICE);
      ini_set('display_errors','1');
      ?>
      Genauer ein
      PHP-Code:
      <?php
      error_reporting
      (E_ALL E_NOTICE); // wobei E_ALL schon ausreicht
      ?>

      Kommentar


      • #4
        Danke Zergling, hast Recht. Ich hatte nur irgendwas mit "E_ALL" und "E_NOTICE" im Kopf...
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #5
          Wenn du unbedingt relative Pfade verwenden willst, dann achte darauf, dass alle Pfade ausgehend von der Datei, die zuerst aufgerufen wird passen:

          Datei1 -> include Datei2 (Pfad von Datei1 ausgehend)
          Datei2 -> include Datei3 (Pfad auch von Datei1 ausgehend, nicht von Datei2)

          --------------

          Edit: Habe gerade gesehen, dass das Problem daran liegt, dass du die Include-Dateien aus verschiedenen Unterordnern aufrufen willst. Dann mach es doch lieber so:
          Lege eine Index Datei im obersten Verzeichnis an. Gib dieser Datei einen Parameter mit, welche Seite du eigentlich aufrufen möchtest. Diese Index Datei holt sich über den Include dann zuerst die Funktionsdateien. Nun können die Adressen dafür immer gleich bleiben. Danach wird die eigentliche Seite aus dem Unterordner geholt.

          Kommentar


          • #6
            dann nimm absolute Pfade und benutze dazu diese Konstanten.

            http://www.php.net/manual/en/languag...predefined.php

            Kommentar


            • #7
              Relative Pfadangaben gehen immer (nicht nur bei include) vom Arbeitsverzeichnis aus. Den aktuellen Pfad kann man per getcwd() auslesen und (wenn es wirklich sein muss) mit chdir() ändern.
              Als Webservermodul setzt PHP das Arbeitsverzeichnis auf den Pfad der Skriptdatei, für die es aufgerufen wurde - das "Hauptskript" also. Ein include() ändert das Arbeitsverzeichnis nicht.

              Kommentar


              • #8
                Eine weitere Möglichkeit ist, eine Settingsdatei (die freilich immer korrekt eingebunden werden muß) mit Pfaddefinitionen zu erstellen. Du definierst meinetwegen Konstanten für die Pfade: Libraries, Templates... als relativ zum Root der gesamten Applikation. Letztlich mußt Du dann nur noch das Wurzelverzeichnis absolut angeben oder relativ für jedes Script das direkt aufgerufen werden darf.

                Verwirrenderweise wird auf HTML Seite die PHP typische 'Pfadauflösung' nicht praktiziert (kann ja auch nicht). Wenn Du also in einem CSS ein background-bild mit url() relativ angibst, muß hier relativ zur css Datei referenziert werden.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Huhu Zusammen,

                  viele Dank für eure zahlreichen Antworten *bow*

                  Den Debugmodus hatte ich schon zuvor gesetzt und ich bekam auch eine Fehlermeldung

                  Warning: include(../test1/var.php) [function.include]: failed to open stream: No such file or directory in /var/www/kunden/webs/jepjep/htdocs/test2/echo.php on line 4

                  Warning: include() [function.include]: Failed opening '../test1/var.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/kunden/webs/jepjep/htdocs/test2/echo.php on line 4

                  Notice: Undefined variable: var in /var/www/kunden/webs/immodb/htdocs/test2/echo.php on line 6
                  Diese habe ich leider vergessen euch zu berichten.

                  Und ich werde die Pfade wohl mit Hilfe der Konstanten absolut angeben.

                  Mit Dank und freundlichen Grüssen
                  Lindi

                  Kommentar


                  • #10
                    Ein Beispiel meiner seite:

                    config.php
                    PHP-Code:

                    $page_path
                    ='absoluter/pfad/zu/deinem/seitenordner/';
                    $template_path=$page_path.'templates/';
                    $xyz_path=$page_path.'x/y/z/'
                    index.php
                    PHP-Code:

                    include('./config.php');

                    // Einbinden einer beliebigen Seite
                    include($page_path.'beliebige/seite.php');

                    // Einbinden eines Templates
                    include($template_path.'start.pl'); 

                    Kommentar

                    Lädt...
                    X