include Variable geht nicht

Ich habe 2 Scripte:


<?

$counter_old_ID = 20225 ;

includeScript(56748 /*[sonstiges\Auswertung Stromzähler]*/);

//Copy&Paste aus dem "Wie kann ich...?" Thema der Dokumentation
function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
 include($s['ScriptFile']);
}
?>

und hier das 2. (56748)


<?
$counter_neu = GetValueInteger(54776 /*[Zaehlerschrank_01_Building_03\DS2438\UV1]*/);     // aktueller Zaehlerstand (Zähler 1) einlesen
$counter_alt = GetValueInteger($counter_old_ID);  //alten Zählerwert auslesen
$delta = $counter_neu - $counter_alt;     //alter Wert von neuen Wert abziehen
SetValueInteger($counter_old_ID , $counter_neu );    //aktueller Zählerwert ablegen
SetValueInteger(54960 /*[Zaehlerschrank_01_Building_03\DS2438\UV1\UV1_diff]*/, $delta );          //Ausgabe Differenz zwischen alt und aktuell
...........

wiso meint IPS die Variable $counter_old_ID steht in dem Script nicht zur Verfügug?

Welches der beiden Scripte wird denn ausgeführt? Hast du vielleicht verkehrt herum includet?

Toni

…ausgeführt wird das erste Script
hier die Fehlermeldung im Detail


Notice:  Undefined variable: counter_old_ID in D:\Program Files\IP-Symcon\scripts\56748.ips.php on line 10

Warning:  '' is not a valid integer value in D:\Program Files\IP-Symcon\scripts\56748.ips.php on line 10

interessant… sollte ja normal gehen…

ich habe jetzt mal testweise versucht und im 2. script ein:

global $counter_old_ID;

oben hinzugefügt…
dann gehts

Du solltest deine Aufrufe mal in einer Funktion kapseln.

  1. Script

<?
includeScript(56748 /*[sonstiges\Auswertung Stromzähler]*/);

UpdateTralala(20225);

//Copy&Paste aus dem "Wie kann ich...?" Thema der Dokumentation
function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
 include($s['ScriptFile']);
}
?>

  1. Script

function UpdateTralala($counter_old_ID)
{ 
  $counter_neu = GetValueInteger(54776 /*[Zaehlerschrank_01_Building_03\DS2438\UV1]*/);     // aktueller  Zaehlerstand (Zähler 1) einlesen
  $counter_alt = GetValueInteger($counter_old_ID);  //alten Zählerwert auslesen
  $delta = $counter_neu - $counter_alt;     //alter Wert von neuen Wert abziehen
  SetValueInteger($counter_old_ID , $counter_neu );    //aktueller Zählerwert ablegen
  SetValueInteger(54960 /*[Zaehlerschrank_01_Building_03\DS2438\UV1\UV1_diff]*/, $delta );          //Ausgabe Differenz zwischen alt und aktuell
  ...........
}

mir is gerade eingfallen, die variable $counter_old_ID gibts ja in der Funktion ‚includeScript‘ dann gar nicht oder?
also müsst ma sie per Parameter übergeben, oder eben mit global $counter_old_ID;

ahja, tonic hats eh auch gerade per Parameter gemacht g

…Danke für den Tip mit dem ‚global‘ das hat funktioniert

bitte… :slight_smile:
allerdings sieht die lösung von Tonic schöner aus, find ich

Was immer wieder übersehen wird ist, dass includes in einer Funktion Einschränkungen unterliegen:

Funktionen aus den includierten Dateien stehen im globalen Scope zur Verfügung ABER:

Die in einer Funktion includierten Variablen & Arrays aus den include Dateien stehen NUR IN DER FUNKTION zur Verfügung, weil sie als dort geschrieben angesehen werden - im Prinzip logisch aber in der Praxis eben auch Schade, weil das die Benutzung der in der Doku unter „wie kann ich …“ für viele Anwendungen unbrauchbar macht.

Daher werden auch viele Leute mit dem in der Doku angegebenen Beispiel Probleme haben - bis sie das „schnallen“.

jwka

Richtig, ich bin damit eben leider auch auf die Nase gefallen.

Ich habe in einem Script mehrere Variablen, die ich gerne in einem anderen Script zur Verfügung haben möchte. Habe mittels „includeScript“ das Script in das 2. Script eingebunden und möchte nun ALLE Variablen des 1. Scriptes im 2. haben. Wie schaffe ich das?

Gruß,
Christoph

include(require) „12345.ips.php“; oder den Namen. require „Script.ips.php“;

Danke, funktioniert soweit. Habe nun

include(require "54131.ips.php");

mit eingebaut.

Funktioniert, liefert aber:

Warning:  include(1) [function.include]: failed to open stream: No such file or directory in D:\Programme\IP-Symcon\scripts\29591.ips.php on line 6

Warning:  include() [function.include]: Failed opening '1' for inclusion (include_path='.;C:\php5\pear') in D:\Programme\IP-Symcon\scripts\29591.ips.php on line 6

29591 ist die ID des Scripts, in der die Kommandos stehen…

Kann ich das ignorieren?

Danke und Gruß,
Christoph

entscheide dich für eins :slight_smile: entweder oder!

Oha … ich sollte heute besser keine einzige Zeile Code mehr schreiben …

Tausend Dank! Jetzt bin ich einen entscheidenden Schritt weiter!

Falls man sich mal bei einem Stammtisch sieht, hast Du einen gut bei mir :slight_smile:

Ähm.

Das Problem, dass Variablen nicht im globales Scope zur Verfügung stehen, die in einer Include definiert wurde, welche in einer Funktion eingebunden wird, hat nix mit include / require / inlcude_once / require_once zu tun.

Es hat schlicht damit zu tun, dass der include Vorgang in der Funktion und deren lokalem Scope ausgeführt wird, und die includierten Variablen nur im lokalen Scope der Funktion und damit NICHT im globalen Scope der die Funktion aufrufenden Routine zur Verfügung steht.

Abhilfe schafft nur, das Include im „Hauptscript“ direkt als Codezeile zu schreiben und damit auf den „Komfort“ der in der Doku aufgeführten Funktion (zugriff auf Script, Scriptfile und include) zu verzichten.

Deshalb habe ich auch angeregt, eine Funktion "IPS_GetScriptFile($id) einzubauen, damit die nötige (richtige) Hilfskonstruktion entfallen kann:


include( GetScriptFile(12345) );

function GetScriptFile($scriptID)
{ 
   $s = IPS_GetScript( $scriptID );
   return( $s['ScriptFile'] );
};

jwka