Andreas Korthaus: serialize() und multidimensionale Arrays

Beitrag lesen

Hi

Widerspruch, das ganze ist bei Sessions höchst unsauber gemacht, wie wir neulich herausgefunden haben, bei Sessions wird nämlich völlig unnötigerweise die Angabe, dass es sich beim Inhalt des serialisierte String um ein assoziatives array handelt weggelassen. Würde das da stehen könnte man mit unserialize eine Session-Datei auslesen. Geht aber nicht.

Ich habe es gerade mal aus Spaß probiert, ein durch dei Session-Funktion serialisierter multidimensionaler Array sieht _exakt_ so aus wie bei serialize(). Alle Angaben sind gleich. Der einzige Unterschied ist das in der Session vorer noch der Name in Form von name| gespeichert wird und mehrere Variablen durch ; getrennt in der Datei stehen.

Ja, aber wie willst das das denn ausschneiden, wenn du nicht weißt, welcher Teil "fehlt"?

Das weiß die Session-Funktion ebensowenig. Naja, ich habe mal kurz probiert ob das mit unserialize klappt, das tut es, nur ist es IMHO umständlicher als das komplett zu parsen, außerdem hatte ich keine Lust das ganze zu perfektionieren, es funktioniert nur grob:

$input = 'zaehler|i:25;fruits|a:3:{s:7:"früchte";a:3:{s:1:"a";s:6:"Orange";s:1:"b";s:6:"Banane";s:1:"c";s:5:"Apfel";}s:7:"nummern";a:6:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;}s:6:"löcher";a:3:{i:0;s:7:"erstens";i:5;s:8:"zweitens";i:6;s:8:"drittens";}}map|a:4:{s:7:"version";i:4;s:2:"OS";s:5:"Linux";s:7:"Sprache";s:8:"englisch";s:10:"short_tags";b:1;}array|a:5:{i:0;i:7;i:1;i:8;i:2;i:0;i:3;i:156;i:4;i:-10;}str|s:50:"sadasddasd9ß490q 0ßw oadölk dökö erp89p23jöo köa";int|i:234234234;';

for($i=0,$klammer=0,$len=strlen($input);$i<=$len;$i++){
    if ($input{$i} == "{") {
     $klammer++;
  $string .= $input{$i};
 }
 else if ($input{$i} == "}") {
     $klammer--;
  $string .= $input{$i};
  if($klammer == 0) {
   $mySESSION[$last_name] = unserialize($string);
      $string = "";
  }
 }
 else if ($input{$i} == "|") {
        $mySESSION[$string] = "";
  $last_name = $string;
  $string = "";
 }
 else if ($klammer == 0 && $input{$i} == ";") {
     if(substr($string,0,1) == "i") {
      $mySESSION[$last_name] = substr($string,2);
  }
  else if(substr($string,0,1) == "s") {
      $mySESSION[$last_name] = unserialize($string);
  }
  $string = "";
 }
 else {
     $string .= $input{$i};
 }
}

echo "<pre>mySession:\n";
print_r($mySESSION);
echo "</pre>";

Wie gesagt, im nachhinein finde ich das da oben gruselig. Aber ich bleibe dabei => warum soll man das nicht einfach dem Session-Mechanismus überassen? Und bisher konntet Ihr auch nicht wirklich begründen, warum die Entwicker von PHP irgendwas an diesem Mechanismus ändern sollten. Wenn einer doch irgendwie an die Daten muß soll er gefälligst in den Quelltext gucken und die dortige Parse-Funktion für die Session-Dateien übernehmen, wobei ich mir sicher bin das ihr das in Wirklichkeit gar nicht wollt/braucht.

Grüße
Andreas