Include: Andere Architektur -> Problem

Liebe Leute,
Ich habe eine datei top.php, die von diversen Dateien in diversen Ordnern und Unterordnern eingebunden wird. Top.php verweist ihrerseits auf sqllogin.php, die im Ordner /php/ liegt.
Damit top.php sqllogin.php findet, verwende ich:

include($\_SERVER["DOCUMENT\_ROOT"]."/php/sqllogin.php");

Das funktioniert auf localhost wunderbar. Leider aber will das der Zeilserver nicht akzeptieren, da seine Architektur anders ist (es erscheint eine Fehlermeldung, dass /web/aohaewr29w8hWAS-WEISS-ICH-DINGS-ZEUGS/php/sqllogin.php nicht gefunden wurde.
Die Variable $_SERVER[‚HTTP_HOST‘] funktioniert auf dem Server, leider funktioniert include aber weder lokal noch auf dem Server, wenn ich DOCUMENT_ROOT durch HTTP_HOST ersetze.
Ich habe keinen Zugriff auf die Serverkonfiguration.
Was kann ich tun, damit das include auf beiden Architekturen funktioniert?
lg
Kalsan

Guten Tag,

ich kann mir nicht vorstellen das der root-path falsch ist. Anonsten versuch dir per var_dump($_SERVER[DOCUMENT_ROOT]) mal den Pfad auszugeben zu lassen, vllt stimmt da bei dem Server was nicht.
Ansonsten einfach mal auf den root-path verzichten und einfach include ‚/ordner/file.php‘ versuchen!
Meine Empfehlung liegt beim test auf require, denn include wirft nur eine Warnung, währendessen require einen Fatal wirft !

PS:
Die HTTP_HOST enthält folgendes: (aus dem Manual)
Enthält den Inhalt des Host:-Headers des aktuellen Requests, sofern ein solcher gesendet wurde.
Diesen Wert brauchst du beim Include nicht.
Gruß

Moin,

include($_SERVER[„DOCUMENT_ROOT“]."/php/sqllogin.php");

Das funktioniert auf localhost wunderbar.

Das funktioniert normalerweise immer und überall.
Das kann ja nur dann Probleme geben, wenn $_SERVER[„DOCUMENT_ROOT“] nicht (richtig) gesetzt ist.

Leider aber will das
der Zeilserver nicht akzeptieren, da seine Architektur anders
ist

Das hat mit der Architektur nichts zu tun.

es erscheint eine Fehlermeldung, dass
/web/aohaewr29w8hWAS-WEISS-ICH-DINGS-ZEUGS/php/sqllogin.php
nicht gefunden wurde.

Dann überprüfe mal, welchen DocumentRoot-Pfad Dir Dein Provider nennt mit dem, der da in der Fehlermeldung steht. Den Pfad zum DocumentRoot stellt Dir Dein Provider normalerweise zur Verfügung, vielleicht in einer FAQ.

Möglicherweise hast Du aber Deine Dateien auch an die falsche Stelle hochgeladen. Überprüfe das in Deinem FTP-Programm.

Die Variable $_SERVER[‚HTTP_HOST‘] funktioniert auf dem
Server

Hat aber gar nichts mit Deinem Problem zu tun.

leider funktioniert include aber weder lokal noch auf
dem Server, wenn ich DOCUMENT_ROOT durch HTTP_HOST ersetze.

Weil HTTP_HOST auch nichts mit dem lokalen Filesystem des jeweiligen Servers zu tun hat. Das ist so, wie wenn Du Dich wunderst, dass Du Dein Auto nicht mit einem Dosenöffner öffnen kannst.

Ich habe keinen Zugriff auf die Serverkonfiguration.

Aber kannst sie Dir anzeigen lassen.
Entweder durch Infos vom Provider oder z.B. auch durch phpinfo(), was alle gesetzten Variablen, auch Servervariablen, auflistet.

Was kann ich tun, damit das include auf beiden Architekturen
funktioniert?

Nachprüfen, wo die Diskrepanz liegt und dann entweder Deinen Fehler korrigieren oder den Provider mit seinem Fehler konfrontieren (hässliches Wort, aber man kann das natürlich auch freundlich machen :smile:.

Liebe Grüße,
-Efchen

ich kann mir nicht vorstellen das der root-path falsch ist.
Anonsten versuch dir per var_dump($_SERVER[DOCUMENT_ROOT]) mal
den Pfad auszugeben zu lassen, vllt stimmt da bei dem Server
was nicht.

vardump gibt /home/www/6db76ea02a5e9d6c6bcb340f74ff4021/web zurück. Dieser Ordner ist beim Includen aber ungültig.

Ansonsten einfach mal auf den root-path verzichten und einfach
include ‚/ordner/file.php‘ versuchen!

Geht nicht '-(
lg
Kalsan

Tja, der Server ist seit Jahren schlecht konfiguriert und wir haben ständig Probleme damit. Da es sich aber um einen Schulserver handelt, der von einer Firma monopolartig und aus meiner Sicht mies verwaltet wird, kann das Problem aus organisatorischen Gründen und aufgrund der ineffizienten Struktur bezüglich des Informatikwesens der Institution nur über viele Umwege gelöst werden.
Kurz, wenn ich die um Hilfe frage, dauert das womöglich Jahrhunderte…
Gibt es den keine Möglichkeit, wie ich das selber lösen könnte?
lg
Kalsan

Guten Tag,

am Besten du Kontaktierst deinen Anbieter oder du suchst dir einen der es schafft die php includes richtig zu setzen. Alternative wäre du findest ürgendwie herraus wie der korrekte Pfad lautet. Eine andere möglichkeit sehe ich im Moment nicht.

Gruß

1 „Gefällt mir“

Alternative wäre du findest ürgendwie herraus wie der
korrekte Pfad lautet.

Wie würde das gehen?
lg
Kalsan

Guten Tag,

steht alles im Manual, aber ich würde dir das hier raten
bis V 5.3.0:
include dirname(__FILE__).’/datei.php’;

ab V 5.3.0:

include __DIR__.’/datei.php’;

Gruß

bis V 5.3.0:
include dirname(__FILE__).’/datei.php’;

Warning: include(/home/www/6db76ea02a5e9d6c6bcb340f74ff4021/web/creusex/private/php/sqllogin.php) [function.include]: failed to open stream: No such file or directory in /home/www/6db76ea02a5e9d6c6bcb340f74ff4021/web/creusex/private/left.php on line 11

ab V 5.3.0:
include __DIR__.’/datei.php’;

Warning: include(__DIR__/php/sqllogin.php) [function.include]: failed to open stream: No such file or directory in /home/www/6db76ea02a5e9d6c6bcb340f74ff4021/web/creusex/private/left.php on line 11

Gruß

lg

Moin,

Ansonsten einfach mal auf den root-path verzichten und einfach
include ‚/ordner/file.php‘ versuchen!

Geht nicht '-(

Das ist auch extrem unwahrscheinlich, dass das geht, denn das Root-Verzeichnis des Web-Servers wird in so ziemlich keinem Falle jemals mit dem Root-Verzeichnis des Computers überein stimmen.

Mit getcwd() kannst Du Dir das Verzeichnis anzeigen lassen, in dem Dein aktuelles Script steht.
http://de.php.net/manual/de/function.getcwd.php

Dann weißt Du den Pfad.

Ansonsten kannst Du include() auch mit relativen Pfaden benutzen, es muss ja nicht absolut sein!

Grüße,
-Efchen

Salü Efchen,
leider hat getcwd() das selbe Problem wie relative Pfade: Da top.php und left.php ihrerseits von anderen Dateien eingebunden werden, ändern sich ihr Standort. Zum Beispiel, bei der Startseite gibt getcwd() /opt/lampp/htdocs/private zurück. Gehe ich dann ins Forum, so lautet die Ausgabe: /opt/lampp/htdocs/private/forum
…/php/sqllogin führt also bei ersterem zum Erfolg, scheitert jedoch beim zweiten.
lg
Kalsan

Salü Efchen,
leider hat getcwd() das selbe Problem wie relative Pfade: Da
top.php und left.php ihrerseits von anderen Dateien
eingebunden werden, ändern sich ihr Standort. Zum Beispiel,
bei der Startseite gibt getcwd() /opt/lampp/htdocs/private
zurück. Gehe ich dann ins Forum, so lautet die Ausgabe:
/opt/lampp/htdocs/private/forum
…/php/sqllogin führt also bei ersterem zum Erfolg, scheitert
jedoch beim zweiten.

vermutlich hilft die __FILE__ weiter. damit kannst du von der aktuellen datei aus weiterrechnen.
http://php.net/manual/de/language.constants.predefin…

1 „Gefällt mir“

Moin,

leider hat getcwd() das selbe Problem wie relative Pfade:

ann überdenke doch mal Deine Seitenstruktur.
Wenn es nicht möglich ist, dass der Server richtig konfiguriert wird, dann musst Du halt Deine Seiten auf die Probleme hin anpassen. Das allereinfachste, was auf jeden Fall funktionieren sollte (aber auch nicht wirklich schön ist), wäre alle Dateien im selben Verzeichnis abzulegen. Es gibt aber auch sicher eine Möglichkeit, Deine Dateien so abzulegen, dass relative Pfade anwendbar sind.
Ich nehme an, Du hast auch keinen Direktzugriff (Shell) auf den Server-Rechner? Dann könntest Du ggfs. auch Links (das ist so ähnlich wie Verknüpfungen unter Windows, nur viel besser) anlegen.

Die andere Alternative wäre ein gescheiter Provider/Webspace.

Liebe Grüße,
-Efchen

P.S.: Lösungen wurden jetzt eine ganze Menge aufgezeigt. Immer nur „das geht nicht“ oder „Kann ich nicht machen“ - damit ist Dir am allerwenigsten geholfen. Wenn das etwas für die Schule ist, dann muss die Schule halt mal aktiv werden oder aber das Projekt wird sterben. Die Zeit, die Du da schon investiert hast, rumzudoktorn, würde bei bezahlten Menschen teurer sein, als ein paar Jahre normaler Webspace bei einem anständigen Provider.

1 „Gefällt mir“

Das allereinfachste, was auf jeden Fall
funktionieren sollte (aber auch nicht wirklich schön ist),
wäre alle Dateien im selben Verzeichnis abzulegen. Es gibt
aber auch sicher eine Möglichkeit, Deine Dateien so abzulegen,
dass relative Pfade anwendbar sind.

Bei 128 Dateien in 13 Unterordnern, von denen 7 eine identische Unterstruktur haben, absolut unmöglich…

Ich nehme an, Du hast auch keinen Direktzugriff (Shell) auf
den Server-Rechner? Dann könntest Du ggfs. auch Links (das ist
so ähnlich wie Verknüpfungen unter Windows, nur viel besser)
anlegen.

Leider nicht.

Die andere Alternative wäre ein gescheiter Provider/Webspace.

Geht auch nicht, das ist eine Maturaarbeit und die sollte falls irgendwie möglich auf den Schulserver.

P.S.: Lösungen wurden jetzt eine ganze Menge aufgezeigt. Immer
nur „das geht nicht“ oder „Kann ich nicht machen“ - damit ist
Dir am allerwenigsten geholfen. Wenn das etwas für die Schule
ist, dann muss die Schule halt mal aktiv werden oder aber das
Projekt wird sterben. Die Zeit, die Du da schon investiert
hast, rumzudoktorn, würde bei bezahlten Menschen teurer sein,
als ein paar Jahre normaler Webspace bei einem anständigen
Provider.

Haha, da hast du recht :smile:
Ich werde Folgendes tun: „Hilf dir selbst, dann hilft dir Gott“ - auch als nicht gottesfürchtiger Mensch mag ich dieses Sprichwort sehr und probiere daher erst mal selber klar zu kommen. Zwei Möglichkeiten sind mir noch offen:

  • __FILE__ ausprobieren
  • getcwd() und dann per Zusatzfunktion alles hinter private/ aus dem String wegzuschnipseln
    Wenn diese Versuche auch noch scheitern, so werde ich kläglich und hoffnungslos verzweifelt an meinen Provider wenden :wink:
    Vielen Dank für eure Hilfe!
    lg
    Kalsan

Tatsächlich: Die Lösung lautet: include dirname(__FILE__)."/…/php/sqllogin.php";
Das hab ich zwar schon mal probiert, aber vermutlich falsch eingetippt… dein Link hat mir geholfen. Herzlichen Dank!
lg
Kalsan

Moin,

Das allereinfachste wäre alle Dateien im selben
Verzeichnis abzulegen.

Bei 128 Dateien in 13 Unterordnern, von denen 7 eine
identische Unterstruktur haben, absolut unmöglich…

Da sehe ich nichts Unmögliches. Es ist höchstens aufwändig, vielleicht sogar anstrengend. Aber wenn alle anderen Optionen versagen…

Die andere Alternative wäre ein gescheiter Provider/Webspace.

Geht auch nicht, das ist eine Maturaarbeit und die sollte
falls irgendwie möglich auf den Schulserver.

Ich meinte auch ein gescheiter Provider für die Schulwebsite. Wenn der Server nicht richtig gepflegt wird, ist er unbenutzbar. Und entweder die Verantwortlichen ändern diesen Zustand (indem sie ihn richtig pflegen lassen oder indem sie auf einen anderen Webspace umziehen) oder aber die Arbeit kommt halt nicht auf den Schulserver (Du schriebst „falls irgendwie möglich“ - mein Gefühl sagt mir, dass wir vielleicht noch nicht gegen die Wand rennen, sie aber schon zum Greifen nahe ist) oder auf einen eigenen Server.

Vielen Dank für eure Hilfe!

Gerne. Hoffentlich kommst Du zu einem anständigen Ergebnis.

Liebe Grüße,
-Efchen

Es hat tatsächlich geklappt :smile:
include dirname(__FILE__)."/…/php/sqllogin.php";

schreib dir mal eine kurze php datei mit
echo phpinfo();

Vielleicht findest du darin Hinweise, wie der korrekte Pfad lauten müsste. Ich denke dein /web/xyz… ist eine changeroot Umgebung.

Vielleicht muss davor noch sowas wie /var/www/ ect.

Vielen Dank für deine Antwort. Das Problem ist mittlerweile gelöst:
include dirname(__FILE__)."/…/php/sqllogin.php";