Hi Matthias,
Füge ich nun aber output() noch global $variable hinzu, dann läuft's. Daraus schließe ich, daß die Funktion sozusagen außerhalb output() läuft, wobei ich eigentlich vom Gegenteil überzeugt war.
nein - sie läuft schon innerhalb von output(). Es gibt allerdings nur genau einen globalen Geltungsbereich für Variablen und der befindet sich _nicht_ in der Funktion output(). Durch das Schlüsselwort "global" in der while-Schleife gibst du der Funktion getSessVars() allerdings die Anweisung, die Werte im globalen Bereich zu ändern. Daher scheint es auch so, als laufe dein Script wie gewünscht, wenn du durch
global $variable;
der Funktion output() ebenfalls die Möglichkeit schaffst, auf den globalen Wert von $variable zuzugreifen.
ABER: Es scheint eben nur so. Denn deine Funktion getSessVars() kann ja noch mehr: Bei Aufruf von getSessVars($sid, "") holt sie dir ja alle Variablen, die der SID entsprechen, aus der Datenbank. Hier werden sie alle mit dem Schlüsselwort global versehen, verändern also die Werte der Variablen im globalen Geltungsbereich. output() kann jedoch immernoch lediglich auf die globale Variable $variable zugreifen. In diesem Fall tut dein Script also wieder nicht das, was du willst.
Wie kann man es evtl. eleganter lösen, so daß man direkt auf die Variable zugreifen kann, egal wie tief man sich in Subroutinen eingegraben hat?
Entweder du gibst, wie Yeti schon sagte, aus getSessVars() die Werte zurück, wofür sich ein Array als Rückgabe anbieten würde. Die Anzahl der zurückgegebenen Werte kriegst du dann via count(). Oder du arbeitest mit "echten" Referenzen - getSessVars() bekommt einen weiteren Parameter als Referenz, in dem sie die Ergebnisse speichern darf:
<?php
function getSessVars ($sid, $varname, &$vars)
{
// ...
while($rs = mysql_fetch_row($ret)) {
$vars[$rs[0]] = $rs[1];
}
// ...
}
function output()
{
$vars = array();
getSessVars($sid, "variable", $vars);
}
Nun referenzierst du in getSessVars() nicht mehr auf den globalen Geltungsbereich, sondern auf den Geltungsbereich, in dem die Funktion aufgerufen wurde, in diesem Fall also auf den in output(). In jedem Fall bietet sich aber ein Array an, einfach, da du evtl. mehrere Werte zurückgeben musst.
Gruß,
Andreas.