include()-Phänomen

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

  • include()-Phänomen

    Hallo,

    bin neulich auf folgendes Problem gestoßen. Ich habe einen privaten Linux-Server auf dem u.a. PHP 4.3.2 selbstkompiliert rennt. Läuft auch alles.
    Habe ein Skript geschrieben, dass eine Datei inkludiert -> diese Datei inkludiert wieder eine. Und zwar sieht das so aus:

    Verzeichnisstruktur:
    /
    /lib

    Das erste Skript liegt in /lib und heißt db.class. Dieses Skript inkludiert ein weiteres Script, das da heißt db_connect.fnc, dieses liegt auch in /lib. In db.class steht die Anweisung include_once("./db_connect.fnc");.
    Das 3. Skript liegt in / und heißt index.php. Es inkludiert db.class wie folgt: include_once("./lib/db.class");
    So, auf meinem lokalen Server funktioniert das auch.
    Nun kam es dazu, dass ich dieses Skript auf einen Server eines Hosting-Anbieters raufgeladen habe.
    Dort kamen plötzlich Fehler bei der Inkludierung und open_basedir in restriction effects. Tja, hab vieles probiert.. ./ weggelassen, vollstaendige Pfadangabe. Bis ich dann mal ausprobiert hab, in db.class nicht ./db_connect.fnc sondern include_once("./lib/db_connect.fnc"); was ja eigentlich unlogisch waere, weil es in /lib kein Unterverzeichnis namens lib gibt. Mit der index.php funktioniert das aber. Warum? Bekommt das PHP nicht mehr mit, wenn er beim Inkludieren mehrmals die pwd wechselt? Nehme an, das is irgend ne Option oder evt der safe_mode?
    Man koennte es sich von daher erklaeren, dass index.php db.class und db_connect.fnc unabhaengig von einander inkludieren und nicht erkennt, dass db_connect.fnc schon durch db.class ins Leben gerufen wurde und deswegen den relativen Pfad von sich selbst braucht und nich von db.class' Position aus. Das is sehr wichtig fuer mich, da kann ich naemlich mb-weise Skripte umschreiben, wenn das so Gang und Gebe ist.

  • #2
    Im Zweifel dürfte das auf beiden Server nicht funktionieren.

    include_once() terminiert im Gegensatz zu require_once() nur den Ablauf des Scripts nicht. Wenn Du auf Deinem Lokalen Server dann auch noch die Warnungen deaktivert hast wirst Du's kaum merken.

    include() fügt das angegebene Script in Deine index.php ein ... das Basisverzeichnis für sämtliche Includes bleibt jedoch weiterhin das der index.php ... und nicht das der db.class ... !

    Wenn Du "relative" Includes absolut durchführen willst verwende einfach dirname(__FILE__) ...
    carpe noctem

    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

    Kommentar


    • #3
      Mhm, aber funktionieren tut es auf meinem Server auf jeden Fall. Auf dem oeffentlichen Server kam es ja direkt zu fatalen Warnung, also mit Skriptabbruch.
      include() kann ich auch nich benutzen, weil index.php ja mehrere Skripte inkludiert, die auf db_connect.fnc zugreifen. Wuerde ich in denen allen nur include() verwenden kommt es beim schließlichen Ausfuehren von index.php zu Fehlern, weil einige Sachen doppelt inkludiert sind.
      Das mit dirname() hab ich mir auch ueberlegt, aber ich muesste es ja dann in meinem Beispiel in db.class eintragen, was zur folge haette, dass dann in db.class steht: include_once("./lib/db_connect"); was der Pfadangabe relativ zu index.php entsprechen wuerde, aber nicht der von db.class, das ja im selben Verzeichnis (/lib) liegt. Im Endeffekt kann ich db.class nur inkludiert -und somit indirekt- ausfuehren lassen kann, durch eine Datei, die in / liegt. Das waere an sich nicht das Problem bei der Anwendung, weil db.class ja ne Library is, die nur ne Klasse importiert...beim Entwickeln bzw. Debuggen dann schon....
      Wuerde also dann der Einsatz von require_once() das Problem loesen?

      Und ueberhaupt, warum wurde das so gemacht? Wenn ich ein Skript inludieren will, hab ich ja das Ziel, dass es genau an der Stelle ausgefuehrt. Zur Aufuehrung gehoert nunmal, dass die PWD des Skriptes beruecksichtigt wird, und von daher ist include("./db_connect.fnc"); ja richtiger? Wuerde also daran liegen, dass include() nichts weiter macht, als so zu tun, als stuende der Source aus db.class (wo die mysterioese include_once()-Anweisung drinne is) in index.php....somit wuerde der Pfad ./lib/db_connect.fnc wieder hinhauen ....

      Kommentar


      • #4
        Versuche die servervariable: $_SERVER['DOCUMENT_ROOT'] zu verwenden.

        Beispiel:

        Bei dir jetzt
        ./index.php
        ./lib/db.class
        ./lib/db_connect

        Du includierst die db.class in deine index.php rein.
        dadurch ist für php nun folgendes szenario:
        ./index.php + db.class da index.php im ./ liegt ist db.class jetzt automatisch ebenfalls im ./

        in deiner db.class haste aber ein include("./db_connect"); also wenst jetzt logisch weiter gehst wird dir klar das php die db_connect im selben verzeichniss sucht wo die index.php liegt.

        Verwendest du aber z.b. in deiner db.class folgenden include befehl.

        include($_SERVER['DOCUMENT_ROOT']."lib/db_connect");
        so includiert PHP immer die datei die in ./lib/db_connect liegt. Vorraussetzung dafür ist das /lib/ ein verzeichniss direkt am server-root ist.

        Ich hoffe ich konnte etwas behilflich sein, denn ich kenn das leidige include problem.

        Gruß
        Amon-Jack

        Kommentar


        • #5
          Hey, das ist die Idee! Fragt sich nur ob Inkludierungen ueber den Doc-Root in der 'list of allowed inclusion_paths' liegen.

          Kommentar

          Lädt...
          X