unserialize - Leeres Resultat

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • unserialize - Leeres Resultat

    Liebe PHP-Gemeinde

    Zugegeben, ich hab nicht allzuoft mit PHP zu tun. Meistens halt, wenn ich beim benutzten CMS die eine oder andere Anpassung an einem Modul vornehmen muss. Dazu hat mein PHP-Wissen einigermassen gereicht.

    Jetzt aber folgendes: Ich lese aus einem Datenbank-Tabelle folgenden Inhalt aus:
    HTML-Code:
    a:2:{s:5:"de-DE";s:127:"<p>07.04.2012: 08.00 - 12.00 GK 1. Teil<br />14.04.2012: 13.00 - 17.00 GK 2. Teil<br />21.04.2012: 13.00 - 17.00 GK 3. Teil</p>";s:5:"en-GB";s:0:"";}
    Ich denke mal, unserialize wäre da ja der richtige Weg

    Das ist mein bisheriger Ansatz:
    PHP-Code:
    $var 'a:1:{s:5:"de-DE";s:127:"<p>24.03.2012:    08.00 - 12.00    GK 1. Teil<br/>31.03.2012:    08.00 - 12.00    GK 2. Teil<br/>07.04.2012:    13.00 - 17.00    GK 3. Teil</p>";}a:2:{s:5:"de-DE";s:127:"<p>07.04.2012: 08.00 - 12.00 GK 1. Teil<br/>14.04.2012: 13.00 - 17.00 GK 2. Teil<br/>21.04.2012: 13.00 - 17.00 GK 3. Teil</p>";s:5:"en-GB";s:0:"";}';

    $data unserialize $var );

    print ( 
    $data ); 
    Das gibt aber eine leere Ausgabe. Das Thema ist für mich Neuland. Wo liegt meint Denkfehler?

  • #2
    json_decode
    Außerdem musst du print_r nehmen.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      unserialize passt schon.

      Das sind im Codebeispiel vermutlich zwei serialisierte Einträge, die aus irgendeinem Grund hintereinander stehen. CONCAT in irgendeiner Form im Spiel?

      Das Beispiel ist übrigens nicht testbar, weil da offenbar Tabs im Originalstring stehen, die es nicht durch den BBCode-Parser im Forum schaffen, weshalb die Längenangaben für die serialisierten Strings nicht passen.

      Kommentar


      • #4
        Hm, kann leider nicht sagen ob CONCAT im Spiel ist. Ich weiss nur, dass dieser Eintrag genau so im Feld "fulldescription" der Datenbank-Tabelle steht.

        Der Eintrag in dieses Feld wurde über ein CMS-Backend mit einem TinyMCE-Editor gemacht.

        Wäre es einfach wenn nicht mehrere Einträge hintereinander stehen würden?

        Kommentar


        • #5
          Ich habe es mal getestet. Bei Deserialisierung scheint alles verworfen zu werden, was nach dem ersten abgeschlossenen Datenstruktur-Block noch in der Eingabe steht.

          PHP-Code:
          var_dump(
              
          unserialize(serialize('Hello World!') . 'this is ignored')
          );
          // string(12) "Hello World!" 
          Ich habe keine Ahnung, ob das dokumentiertes Verhalten ist.

          Das bedeutet für deinen Fall, dass unserialize den Inhalt des ersten Arrays zurückliefert.

          PHP-Code:
          $entries = array();
          $entries[] = array(
              
          'de-DE' => '<p>24.03.2012: 08.00 - 12.00 GK 1. Teil<br/>
                             31.03.2012: 08.00 - 12.00 GK 2. Teil<br/>
                             07.04.2012: 13.00 - 17.00 GK 3. Teil</p>'
          );
          $entries[] = array(
              
          'de-DE' => '<p>07.04.2012: 08.00 - 12.00 GK 1. Teil<br/>
                             14.04.2012: 13.00 - 17.00 GK 2. Teil<br/>
                             21.04.2012: 13.00 - 17.00 GK 3. Teil</p>'
          ,
              
          'en-GB' => ''
          );

          $serialized serialize($entries[0]) . serialize($entries[1]);
          var_dump($serialized);
          var_dump(unserialize($serialized));
              
          // Inhalt von $entries[0] 
          Noch mal: Ich weiß nicht, ob das definiertes, das heißt verlässliches, Verhalten ist.

          Ich würde davon ausgehen, dass es sich um einen Bug im CMS-Backend handelt und dass eigentlich nicht die Serialisierung zweier eigenständiger Datenstrukturen (zwei Arrays) konkateniert in dem Tabellenfeld stehen sollte.

          Du hast im Grunde einige Möglichkeiten, die sich nicht alle gegenseitig ausschließen:
          1. Du schaust nach, wie das CMS das Auslesen bewerkstelligt (wird es ja auch irgendwo tun, wenn die Daten bearbeitbar sind?).
          2. Du wendest dich an den Support des CMS und fragst, was da abgeht.
          3. Du schreibst einen „Parser“, der die Eingabe in die passende Anzahl eigenständiger Blöcke zerlegt und jeden Block einzeln deserialisiert. Dabei erhältst du dann natürlich mehrere Arrays von lokalisierten Strings für einen Datensatz. Ich weiß nicht, wie sinnvoll das inhaltlich ist.
          4. Du arbeitest nur mit dem ersten Block und hoffst, dass das oben skizzierte Verhalten standardisiert ist, sich also nicht von PHP-Version zu PHP-Version einfach so ändert. (Die Möglichkeit ist nicht unbedingt zu empfehlen, falls du nicht in der Doku noch was dazu findest. Auch inhaltlich ist sie wahrscheinlich nicht sinnvoll.)
          5. Du wartest auf weitere Antworten in der Hoffnung, dass ich etwas übersehen habe. (Man kann nie wissen.)


          Punkt 3 würde allerdings einen sehr netten Weg eröffnen, eine Funktion zu schreiben, die eine konkatenierte Eingabe passend zerlegt.

          Du durchläufst die Eingabe in einer Schleife, deserialisierst pro Durchgang einmal, serialisierst diese Daten wieder und schneidest strlen davon von der Eingabe ab. So wird die Eingabe pro Durchlauf jeweils um einen eigenständigen Block reduziert. Die jeweils deserialisierte Datenstruktur schiebst du pro Durchlauf in ein Array, das die Rückgabe bildet.

          Das wiederholst du, bis die Eingabe aufgebraucht ist.

          Nicht maximal effektiv, aber irgendwie elegant.
          Zuletzt geändert von mermshaus; 16.03.2012, 11:00.

          Kommentar

          Lädt...
          X