php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.04.2007, 12:15  
Neuer Benutzer
 
Registriert seit: 10.04.2007
Beiträge: 10
Lindwyrm
Standard 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
Lindwyrm ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.04.2007, 12:28  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

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 before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 10.04.2007, 12:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
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
?>
Zergling-new ist offline  
Alt 10.04.2007, 13:58  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

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 before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 10.04.2007, 14:49  
Erfahrener Benutzer
 
Registriert seit: 09.03.2005
Beiträge: 219
webbi
Standard

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.
webbi ist offline  
Alt 10.04.2007, 15:00  
Erfahrener Benutzer
 
Registriert seit: 23.08.2007
Beiträge: 1.510
M3g4Star befindet sich auf einem aufstrebenden Ast
Standard

dann nimm absolute Pfade und benutze dazu diese Konstanten.

http://www.php.net/manual/en/languag...predefined.php
M3g4Star ist offline  
Alt 10.04.2007, 15:01  
Erfahrener Benutzer
 
Registriert seit: 03.03.2007
Beiträge: 112
Schnulli
Standard

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.
Schnulli ist offline  
Alt 10.04.2007, 15:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

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.
nikosch ist offline  
Alt 11.04.2007, 10:39  
Neuer Benutzer
 
Registriert seit: 10.04.2007
Beiträge: 10
Lindwyrm
Standard

Huhu Zusammen,

viele Dank für eure zahlreichen Antworten *bow*

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

Zitat:
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
Lindwyrm ist offline  
Alt 17.04.2007, 06:02  
Neuer Benutzer
 
Registriert seit: 13.08.2006
Beiträge: 21
Exon
Standard

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'); 
Exon ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
BBCode - Tag verschachteln, Problem mit Reihenfolge. horstenpeter PHP Tipps 2006 4 21.08.2006 12:33
Richtig verschachteln horstenpeter PHP Tipps 2006 3 27.02.2006 15:41
Formulare verschachteln R4v3r HTML, Usability und Barrierefreiheit 8 16.01.2006 11:09
verschachteln von Blöcken mit PHPLIB argon PHP Tipps 2007 1 28.12.2005 09:28
Template: Verschachteln von foreach PHP Tipps 2005 2 12.05.2005 15:37
[Erledigt] Klassen in einander verschachteln? PHP-Fortgeschrittene 4 28.04.2005 22:14
div verschachteln HTML, Usability und Barrierefreiheit 2 18.01.2005 21:35
<form> verschachteln PHP-Fortgeschrittene 4 15.01.2005 10:37
IF verschachteln Sachse PHP Tipps 2004 5 29.09.2004 17:38

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php include verschachteln

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.