PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Falsche include Verzeichnis?



Maruu
26-07-2005, 11:20
Hallo!

Ich hab ein kleines Problem.
Ich hab ein PHP-Skript (im Ordner html/test) in das ich die Datei config.php (aus dem Ordner html) include und zwar so:

require('../config.php')

so nun muss aber die Datei config.php auch wieder andere Files includen, nur funktioniert das irgendwie nicht, da die config.php jetzt denkt Sie sie im Ordner html/test und wenn sie z.B. versucht require('config2.php') dann gibts die ja nicht im Verzeichnis html/test sondern nur in html;
Leider kann ich die config.php nicht ändern also keine Pfade anpassen und das test-skript muss auch im angegebenen Pfad liegen. Kann ich das auch irgendwie anders lösen??

MFG

Maruu

co_negol
26-07-2005, 14:33
Hola Maruu,

also wenn ich Dich richtig verstehe, si, kann man anders lösen,
die ../config.php mittels file() auslesen, in html/test/ eine
tmp_config.php schreiben lassen (fopen) mit den pfaden plus "../"
vorangestellt und diese tmp_config.php dann includieren.

hab ichs richtig verstanden???
grüße alex

Maruu
26-07-2005, 14:48
Hi

Stimmt das kann ich mal versuchen, muss nur mal abchecken ob ich Schreibrechte hab.
Ne andere Lösung gibts nicht oder??

MFG

Maruu

nEox
26-07-2005, 15:14
Hi,


require_once dirname(__FILE__)."/ordner_der_anderen_datei/datei.php";

geht auch. Wenn du in der config.php ein Verzeichnis zurückspringen willst kannst du das so tun:


require_once realpath( dirname(__FILE__)."/../ordner_der_anderen_datei/datei.php" );

__FILE__ enthällt den Pfad zur aktuellen Datei, egal ob die Datei includet wird oder nicht.

Gruß
nEox

Pingu
26-07-2005, 15:44
oder man packt einfach alle Dateien, die per include, include_once, require oder require_once geladen werden in ein spezielles Verzeichnis, wie man das bei jeder ordentlichen Programmierung auch tut, und definiert dann, daß dieses spezielle Verzeichnis jedesmal mit berücksichtig werden soll, wenn einer der obigen Befehle auf die Suche nach einer Datei geht.
siehe auch: http://de2.php.net/manual/de/ini.sect.path-directory.php#ini.include-path

Pingu

co_negol
26-07-2005, 15:56
Hola,

eine ordentliche programmierung hätte diese probleme nicht,
richtig!!!
bei der problemstellung will man doch den bock zum gärtner
machen :)

grüße alex

nEox
26-07-2005, 16:48
Hallo,

also ich finde nicht das das was mit ordentlicher oder nicht ordentlicher Programmierung zu tun hat. Manchmal geht es einfach nicht anders und dann die INI-Variablen von PHP zu ändern, die sich auf alle PHP-Scripte auswirken die noch eingebunden werden... also ideal finde ich das auch nicht.

Beispielsweise beim Einbinden eines Moduls, Klassenbibliothek, Framework oder etwas anderes was über eine "include-Datei" verfügt und noch weitere Dateien einbindet ist es doch viel praktischer das include-Verzeichnis z. B. in einer Variable/Konstante zu speichern und diese dann vor die eigentliche, relative, Pfadangabe zu stellen.

Dann muss PHP auch nicht bei jedem anderen include wo evtl. im Script noch stattfindet auch noch das definierte Verzeichnis durchsuchen.

Wenn man an den "include_path" wie pingu gesagt hat sein include-Verzeichnis anhängt und man dann in der "include-Datei" ein ...

requre_once "datei.php"
...macht dann werden ja meines Wissens nach die Verzeichnisse(durch Doppelpunkt getrennt) nacheinander durchsucht. Liegt in dem Verzeichnis das die "include-Datei" einbindet diese "datei.php" ebenfalls, könnte eine falsche Datei eingebunden werden.

Grüße
nEox

Pingu
26-07-2005, 19:00
Es ist richtig, daß die Verzeichnisse der Reihe nach durchsucht werden und dann die erste gefundene Datei mit dem Namen genommen wird.

Aber meiner Meinung nach hat dies schon in gewisser Weise mit guter oder schlechter Programmierung zu tun. Denn wenn man das Problem nicht handhaben kann, dann hat man etwas falsch gemacht.

Übrigens, läßt sich der Pfad vom Indiander her über die .htaccess und auch aus PHP heraus mit Hilfe von ini_set() (http://de2.php.net/ini-set) setzen bzw. erweitern. Insbesondere durch letzteres gewinnt man damit einiges an Flexibilität. Weil man obiges Verhalten damit zu seinem Vorteil ausnutzen kann. In dem lokale und globale Include-Verzeichnisse erstellt.

Pingu

undefined
26-07-2005, 19:18
Egal ob du es jetzt als Umständlich ansiehst oder nicht, deinen ganzen Script Aufbau Ändern zu müssen. Den Bock hast du dir definitive selbst geschossen.
1) Doppelte Namensgebung ( schlecht sehr schlecht ) solltest du wirklich vermeiden.
2) Include Scripte die man auch so zu sagen eine Funktion als Bibliothek zuweisen kann - gehören in ein Spezieles Verzeichnis auf das mit ini_set() .htaccess oder Globalen Konstanten verwiesen wird.
3) Bei include Anweiseungen sollte man immer mit Relativen Pfaden Arbeiten. Das macht die Geschichte schneller und sicherer.


foreach( get_defined_constants() AS $k => $v ) {
if ( is_string( $v ) )
echo " $k => $v <br />";
}

Glaube mir auch wenn es vielleicht jetzt mehr Arbeit bedeuten wird, es wird der Tag kommen, an dem du darüber froh sein wirst es richtig gemacht zu haben ;)

nEox
26-07-2005, 20:23
Hallo Ihr,

@Pingu

Aber meiner Meinung nach hat dies schon in gewisser Weise mit guter oder schlechter Programmierung zu tun. Denn wenn man das Problem nicht handhaben kann, dann hat man etwas falsch gemacht.
Was ist denn an der Methode mit dirname() falsch?

Ini_Set() ist mir bekannt, hatte mir das auch mit der Funktion vorgestellt, sehe darin aber trotzdem keinen Vorteil zu der Methode mit dirname.

Denn bei include_path muss man ja den absoluten Pfad angeben, somit muss man Änderungen am Script vornehmen wenn man es auf einen anderen Server spielt(besonders bei einem Framework unpraktisch). Plattformunabhängig ist es auch nicht.

@undefined
Maruu hat doch das Problem nicht ich :)
Trotzdem mein Kommentar zu den Punkten:

1) Doppelte Namensgebung ( schlecht sehr schlecht ) solltest du wirklich vermeiden.
War nur ein Beispiel, kann aber durchaus vorkommen.
Als Beispiel dafür fällt mir jetzt nur eine internationale Website in z. B. deutscher, englischer und französischer Sprache ein. Wenn man das von der Datei-Struktur so aufbaut das die Dateien in den jeweiligen Länderordnern liegen und die restliche Datei-Struktur gleich aufgebaut ist. Dann gibts in etwa so was:
/deDE/contact.php
/enUK/contact.php
/frFR/contact.php
Angenommen es kommt jemand auf die Idee die contact.php einzubinden gibts mit der include_path-Methode evtl. Probleme. Zugegeben, schlechtes Beispiel aber ich denke das ist gerechtfertigt.


2) Include Scripte die man auch so zu sagen eine Funktion als Bibliothek zuweisen kann - gehören in ein Spezielles Verzeichnis auf das mit ini_set() .htaccess oder Globalen Konstanten verwiesen wird.
Würde hier die letztere Methode verwenden ;)
Zumindest wenn es ein Script gibt, das andere Scripte einbindet.


3) Bei include Anweisungen sollte man immer mit Relativen Pfaden Arbeiten. Das macht die Geschichte schneller und sicherer.
Genau, deshalb auch mein Einwand mit der eben nicht relativen include_path-Methode.



Glaube mir auch wenn es vielleicht jetzt mehr Arbeit bedeuten wird, es wird der Tag kommen, an dem du darüber froh sein wirst es richtig gemacht zu haben
Mit ini_set() ists ja praktisch auch nicht mehr Aufwand, im Gegenteil eigentlich weil man beim Einbinden nichts weiter beachten muss(wie eine Variable/Konstante).

Grüße,

nEox

nEox
26-07-2005, 20:28
Hallo alle,

mir fällt gerade auf das ich die Problemstellung nicht genau gelesen habe :o
Du (Maruu) kannst ja die config.php garnicht ändern, sorry ich hab das irgendwie überlesen. Dann gibt es wohl nur die Möglichkeit über include_path...

Viel Wind um nichts, aber gut das wirs besprochen haben :D

Bin aber (wegen meinem obigen Beitrag) für alle Kritik offen :)

Gruß,

nEox

Pingu
26-07-2005, 21:09
Was ist denn an der Methode mit dirname() falsch?
Ich habe das Wort "falsch" nicht in den Mund genommen bzw. geschrieben ;).

Aber ich komme halt von der C-Programmierung und da wäre dies ein ziemlich schlechter Stil. Auch bei Perl habe ich das nocht nicht gesehen. PHP ist meiner Meinung nach ähnlich.


Ini_Set() ist mir bekannt, hatte mir das auch mit der Funktion vorgestellt, sehe darin aber trotzdem keinen Vorteil zu der Methode mit dirname.
Denn bei include_path muss man ja den absoluten Pfad angeben, somit muss man Änderungen am Script vornehmen wenn man es auf einen anderen Server spielt(besonders bei einem Framework unpraktisch). Plattformunabhängig ist es auch nicht.
Stimmt nicht. Die Pfade können absolut und relativ angegeben werden. Gerade dadurch ergibt sich sein volle Flexibilität. Der Nachteil bei Deiner Methode liegt darin, daß die Files alle immer im selben Verzeichnis liegen müssen (ok, nur das war hier auch das ursprüngliche Problem). Aber durch die implizite automatische Suche des Systems lassen sich mit der Pfad-Methode für bestimmte Anwendungsteile bestimmte Funktionalitäten durch lokale Files gezielt überschreiben, ohne daß man eines der bestehenden Files auch nur anfassen muß.


War nur ein Beispiel, kann aber durchaus vorkommen.
Als Beispiel dafür fällt mir jetzt nur eine internationale Website in z. B. deutscher, englischer und französischer Sprache ein. Wenn man das von der Datei-Struktur so aufbaut das die Dateien in den jeweiligen Länderordnern liegen und die restliche Datei-Struktur gleich aufgebaut ist. Dann gibts in etwa so was:
/deDE/contact.php
/enUK/contact.php
/frFR/contact.php
Angenommen es kommt jemand auf die Idee die contact.php einzubinden gibts mit der include_path-Methode evtl. Probleme. Zugegeben, schlechtes Beispiel aber ich denke das ist gerechtfertigt.
Wie Du schon geschrieben hast: Schlechtes Beispiel. Denn gerade hier liegt der Vorteil der Flexibilität.

Pingu

PS: Bitte nicht auf Schreibfehler achten, ich denke immer schneller als ich schreibe und habe gerade keine Lust alles nocheinmal durchzulesen.

nEox
26-07-2005, 21:31
Hallo Pingu,


Der Nachteil bei Deiner Methode liegt darin, daß die Files alle immer im selben Verzeichnis liegen müssen (ok, nur das war hier auch das ursprüngliche Problem).
Mh, ok stimmt. Aber dann fehlt doch die Übersicht welche Datei nun wirklich eingebunden wird.


Aber durch die implizite automatische Suche des Systems lassen sich mit der Pfad-Methode für bestimmte Anwendungsteile bestimmte Funktionalitäten durch lokale Files gezielt überschreiben, ohne daß man eines der bestehenden Files auch nur anfassen muß.
Interessanter Ansatz, aber ich hab hier das gleiche Problem wie oben.


Wie Du schon geschrieben hast: Schlechtes Beispiel. Denn gerade hier liegt der Vorteil der Flexibilität.
Sorry, aber irgendwie ist mir der Vorteil nicht richtig klar. Wenn man in include_path einen relativen Pfad angibt, dann weis man doch überhaupt nicht mehr woher die Datei kommt.

Bei Verwendung von dirname() z. B. bei einem Framework, einem Modul oder sonstwas kann man die Scripte überall einfügen(Plattform wäre dann auch egal) und sie funktionieren ohne das am Script was geändert werden muss.

Hat man eine config.php(wie in der Problemstellung) die andere Scripte einbindet und gleichzeitig selbst von den restl. Scripten in der Website eingebunden wird, kann man auch die Webseite ohne Änderungen auf andere Server/Systeme/Verzeichnisse schieben.

Würd ich Rechtschreibfehler finden, würde ich sie behalten ;)

Grüße,
nEox