require Pfadangaben / define()

Senshi86

Erfahrenes Mitglied
Hi @all,
begebe mich nach etwas längerer Pause wieder an PHP ran und bin gerade dabei ein Videotutorial durch zu machen um mein Wissen noch mal aufzufrischen. Dabei bin ich jetzt über folgenden Stolperstein gefallen:

Ich habe folgende Ordner-/Dateianordnung:
/Hauptverzeichnis/includes/config.php
/Hauptverzeichnis/includes/database.php
/Hauptverzeichnis/public/index.php

Soweit so gut.
In der Config sind mittels define() die Datenbankverbindungsdaten definiert.
In die database.php binde ich per require_once() die config.php ein.
In die index.php binde ich dann per require_once() die database.php ein.

Jetzt folgendes Phenomen:
1. Wie es gehen sollte
database.php : require_once('config.php')
index.php : require_once('../includes/database.php')
Ergebnis: Wenn ich aus database.php heraus das Connect über die Konstanten, die in config.php definiert wurden (bzw. definiert werden sollten), machen will, bekomme ich die Meldung das der Name der Konstante kein gültiger Datenbankserver ist (logisch, stellt sich mir jetzt die Frage, warum hat er es nicht durch den korrekten Wert ersetzt?). In einer Abfrage der Konstanten in der index.php mittels defined() gibt es mir ein nicht deklariert aus. Das require_once() bringt mir aber auch keine Fehlermeldung beim Einbinden, das sollte also funktioniert haben.

2. Wie es geht
database.php : require_once('../includes/config.php')
index.php : require_once('../includes/database.php')
Ergebnis : Datenbankverbindung funktioniert, Abfrage auf defined() in index.php gibt true zurück

3. Wie es nicht geht (war einfach zum prüfen ob require auch wirklich nen Fehler bei fehlender Datei ausgibt ^^ )
database.php : require_once('bla.php')
index.php : require_once('../includes/database.php')
Ergebnis: Fatal error beim require_once() in der database.php


In dem Video funktioniert das erste Beispiel wunderbar, die Datei scheint er ja auch bei mir zu finden, jedoch definiert er aus mir unbekannten Gründen die Konstanten nicht wenn ich den Pfad nicht komplett angegeben habe :confused:
Gibt es da irgendwelche Einstellungen die noch vorgenommen werden müssen, z.b. in Apache oder bei PHP?
Klar könnte man jetzt sagen, arbeite doch einfach mit der kompletten Pfadangabe, aber ich kann mich noch gut daran erinnern das ich mal die Situation hatte, dass z.B. ein Adminbereich noch eine Ebene tiefer verschachtelt war und auf eben diese includes zugreifen sollte, in diesem Fall passen dann aber die Pfadangaben in der database.php nicht mehr.
Ich hab auch mehrmals noch mal den Code aus dem Tutorial mit dem meinigen verglichen und die sind definitiv identisch (sieht man von ein paar Formatierungsunterschieden ab).
Suche war bisher leider nicht sonderlich erfolgreich, hoffe daher das mir hier jemand helfen kann :)

Danke und Gruß
Marcel
 
Moin,

der include-Pfad muss immer gesehen werden im Verhältnis zu dem Skript, welches aufgerufen wurde....daher funktioniert Variante#2 auch.

Warum es beim 1. Versuch keine Fehlermeldung beim require gibt, kann ich nicht sagen.
Das Sinnvollste wäre, wenn du in jedem Skript, was direkt aufgerufen werden kann(also vermutlich alles, was du in public hast), eine Konstante definierst, welche den relativen Pfad zum include-Verzeichnis beinhaltet. Diese kannst du dann beim inkluden aus inkludeten Skripten heraus nutzen.

Bsp:index.php
Code:
define('includePath','../includes/');
database.php :
Code:
require_once(includePath.'config.php')

Du kannst den includePath auch als PHP-Konfiguration setzen: set_include_path()
 
Hmm... das mit dem Pfad ist eine sehr gute Idee, danke :)

Ist trotzdem sehr seltsam, ich hab auch den fertigen Code der Seite für den Abschnitt direkt bei der CD mit dabei und den mal versucht auszuführen .... geht auch nicht .... ist mir echt ein Rätsel wie der das gemacht hat .... ich glaub ich schreib den mal an ....
 
Zurück