include Problemchen

Hi,

ich will eine PHP aus einem Unterverzeichnis des Scriptverzeichnisses includen.

Die Datei ist da und wenn ich sie direkt ins Scriptverzeichnis lege, geht auch alles. Sobald das Ding aber im Unterverzeichnis „0_Globals_Parts“ liegt (Sub zu Scripts), machen mir folgende Zeilen:


include "0_Globals_Parts/Debug_V2-00_SetGlobalVar.php";
include 38346;
testfunctioncall( 0 );

Folgende Fehler:

Warning: include(0_Globals_Parts/Debug_V2-00_SetGlobalVar.php) [function.include]: failed to open stream: No such file or directory in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 3

Warning: include() [function.include]: Failed opening ‚0_Globals_Parts/Debug_V2-00_SetGlobalVar.php‘ for inclusion (include_path=’.;C:\php5\pear’) in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 3

Warning: include(38346) [function.include]: failed to open stream: No such file or directory in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 5

Warning: include() [function.include]: Failed opening ‚38346‘ for inclusion (include_path=’.;C:\php5\pear’) in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 5

Fatal error: Call to undefined function testfunctioncall() in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 7

Dabei ist’s egal, ob ich im Pfad Slash oder Backslash benutze.

Die include 38346 habe ich nur mal so zum Test benutzt, weil ich unter diser ObjektID das script, welches includiert werden soll einwandfrei bearbeiten kann.

Was mach ich falsch???

Danke im voraus!
jwka

noch was: setze ich den gesamten Pfad incl. Laufwerk ein, so bekomme ich den Fehler:
Warning: include(D:\IPS\scripts) [function.include]: failed to open stream: Permission denied in D:\IPS\scripts\0_Globals_Parts\Debug_V2-00_SetGlobalVar==0.php on line 3

rumfrickeln hilft …

Habe folgendes herausgefunden:

Die PHP, die das include beinhaltet, liegt selbst in einem (hier demselben) Unterverzeichnis des Scriptverzeichnisses.

Daher führt der Aufruf auch zum Fehler und der full-qualified-path läuft.

Also hilft nur eine „back-reference“ zum scriptroot plus pfad-stückchen:

include „…/subdir/file“. Wird dann die PHP später bei „Aufräumarbeiten“ in eine andere Ebene gelegt, läuft das Ganze natürlich wieder nicht mehr.

UND:

„include 12345“ funzt NUR, wenn das script, das include benutzt im scriptverzeichnis liegen.

Und auch das Beispiel bei „Vorgehensweisen“ (http://www.ip-symcon.de/service/dokumentation/vorgehensweisen/skripte-wiederverwenden/):


function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
 include($s['ScriptFile']);
}  

läuft bei Nutzung von Unterverzeichnissen dann falsch wenn das script in einem unterverzeichnis liegt, weil auch der code oben einen relativen Pfad liefert.

Hier wird dann der, der ordentlich strukturiert bestraft, weil das nur gut funzt, wenn alle Scripte im Script-Verzeichnis ohne weitere Struktur liegen.

Gibt’s IPS_GetRoot ?? Dann könnte man generell mit dem absoluten Pfad arbeiten und gut ist’s.

Oder mach ich jetzt nen gravierenden Denkfehler weils schon zu spät ist?

jwka

Änderung:

Hab’s gefunden: IPS_GetKernelDir() . „scripts/“

Das Beispiel sollte dann so heissen:


function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
 $fullfilepath = IPS_GetKernelDir() . "scripts/" . $s['ScriptFile'];
 include($fullfilepath);
}  

$includefile=„0_Globals_Parts/Debug_V2-00_SetGlobalVar.php“;

include( $fullpathfile);

function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
include($s[‚ScriptFile‘]);
}

Die relativen Pfade beziehen sich auf das ausführende Programm, also die Position von IPS.EXE, und nicht auf die Position des aufgerufenen Scriptes.
Tommi