PHP Sessions und Arrays
Peter Mairhofer
- php
Hallo,
Ich will in meiner Session ein Array der Form
$MEINE_ARRAY[$ID][$i] speichern.
Für meine Webapplikation hab ich mir einen ganzen Apparat von Code geschrieben, um Variablen in PHP sozusagen als "global" zu definieren. (Bitte keine Kommentar dazu, dass die Sicherheit darunter leidet, Variablen die als Parameter übergeben worden sind direkt zu verwenden, ich hab meinen Grund wieso ich das so will).
Dazu habe ich folgendes gemacht:
// MEINE_ARRAY als Sessionvariable definieren.
// session_register funktioniert irgendwie leider nicht;
// ich will das Array leer initialisieren
if(!isset($_SESSION["MEINE_ARRAY"]))
{
$_SESSION["MEINE_ARRAY"] = array();
}
// falls die gleiche variable über GET übergeben wird, die globale variable updaten
while(list($value, $key) = each($_GET))
{
if(isset($_SESSION["MEINE_ARRAY"]))
eval('$'.$value.'='.'"'.$key.'";');
}
Das funktioniert perfekt. So hab ich alle wichtigen Variablen als "global" definiert und wenn ich sie ändern will, übergebe ich sie einfach mit GET oder POST.
Jetzt will ich das aber beim oben genannten Array machen:
echo $MEINE_ARRAY[$var1][$var2];
echo "<input type="text" name="MEINE_ARRAY[".$var1."][".$var2."]" value="$var3">\n";
wenn ich die Sessions ausgeschaltet habe und das Formular abschicke, funktioniert es prächtig. Wenn ich den oben ganannten Sessioncode dazuschalte, dann gibt mir das
echo $MEINE_ARRAY[$var1][$var2];
nix mehr aus.
Wie könnte ich das richtig machen? Wieso funktioniert das bei solchen (2D) Arrays nicht??
Vielen Dank,
*Ptr
Moin!
Hallo,
Ich will in meiner Session ein Array der Form
$MEINE_ARRAY[$ID][$i] speichern.
Fein.
Für meine Webapplikation hab ich mir einen ganzen Apparat von Code geschrieben, um Variablen in PHP sozusagen als "global" zu definieren. (Bitte keine Kommentar dazu, dass die Sicherheit darunter leidet, Variablen die als Parameter übergeben worden sind direkt zu verwenden, ich hab meinen Grund wieso ich das so will).
Doch, das muß ich kommentieren. Damit handelst du dir mehr Probleme ein, als du dir denken kannst. Sowas sollte man _niemals_ machen.
// MEINE_ARRAY als Sessionvariable definieren.
// session_register funktioniert irgendwie leider nicht;
Das soll man nicht mehr verwenden - ist also besser so.
// ich will das Array leer initialisieren
if(!isset($_SESSION["MEINE_ARRAY"]))
{
$_SESSION["MEINE_ARRAY"] = array();
}
Bis hierhin ist alles gut. Wenn du globale Konfigurationsparameter speichern willst, könntest du das beispielsweise in $_SESSION['conf'] tun.
// falls die gleiche variable über GET übergeben wird, die globale variable updaten
while(list($value, $key) = each($_GET))
{
if(isset($_SESSION["MEINE_ARRAY"]))
eval('$'.$value.'='.'"'.$key.'";');
}
Und das hier ist wieder oberpeinlicher Graus-Code.
Warum greifst du nicht einfach auf $_SESSION direkt zu? Das Array ist superglobal, steht dir also ohne irgendwelche Probleme direkt auch in Funktionen und Klassen zur Verfügung:
echo $_SESSION['conf']['deinwert'];
Ist viel besser als
echo $deinwert;
Zumal du hier ein vollkommen unnötiges eval() benutzt.
Weitere Alternativen zum eval():
Variable Variablen benutzen:
$$value = $key;
Oder noch einfacher mit extract(). http://de3.php.net/manual/en/function.extract.php
Das funktioniert perfekt.
Das will ich bezweifeln.
So hab ich alle wichtigen Variablen als "global" definiert und wenn ich sie ändern will, übergebe ich sie einfach mit GET oder POST.
Das ist eben genau das Problem. Die Variablen sind "nur" global, und man kann dir ohne Probleme nicht nur die von dir gewünschten Variablen passend setzen, sondern jede andere existierende oder nicht existierende Variable in deinem Skript auch.
Dein globaler Variablenraum wird durch die Möglichkeit, dass du unkontrollierte Variablen hineinläßt, vertrauens_unwürdig_!
Wenn du die Konfigurationsvariablen schön gekapselt in $_SESSION['conf'] läßt, kann man dir zwar immer noch von außen deine Konfiguration kaputtmachen, aber nicht mehr an die in deinem Skript verwendeten Variablen ran. Das ist ein _enormer_ Sicherheitsgewinn, auch wenn ich persönlich das noch nicht als ausreichend erachten würde. Zumindest hast du damit immer noch die gleiche Funktionalität.
Jetzt will ich das aber beim oben genannten Array machen:
echo $MEINE_ARRAY[$var1][$var2];
echo "<input type="text" name="MEINE_ARRAY[".$var1."][".$var2."]" value="$var3">\n";
wenn ich die Sessions ausgeschaltet habe und das Formular abschicke, funktioniert es prächtig. Wenn ich den oben ganannten Sessioncode dazuschalte, dann gibt mir das
echo $MEINE_ARRAY[$var1][$var2];
nix mehr aus.
Hast du die Daten irgendwann man in $_SESSION reingeschrieben? Der Code oben löscht nur Daten bzw. entpackt welche, aber schreibt keine hinein.
Wie könnte ich das richtig machen? Wieso funktioniert das bei solchen (2D) Arrays nicht??
Alles funktioniert, ich glaube nur, dass du noch einen wichtigen Denkfehler machst.
- Sven Rautenberg