Paul: Objekte in PHP und JS

Hallo,
habe gestern die Frage gestellt wie man ein Objekt von PHP nach JS und wieder zurück schieben kann.
Dabei kam die Antwort das das mit serialize() funzen sollte.

Nun habe ich mein PHP Objekt darauf angewendet. Das Ergebnis sieht gekürzt so aus:
O:10:"abc_obj":33:{s:8:"###schnipp###

Wenn ich mir das dann in JS anzeigen lasse, wird mir allerdings nur:
O:10:
ausgegeben. Alles ab dem ersten Anführungszeichen fällt weg.

Wieso und wie gehts besser?

Danke,
Paul

  1. habe gestern die Frage gestellt wie man ein Objekt von PHP nach JS und wieder zurück schieben kann.
    Dabei kam die Antwort das das mit serialize() funzen sollte.

    JSON ist flexibler und du kannst es in einigen Sprachen einfach mit eval umwandeln.

    Nun habe ich mein PHP Objekt darauf angewendet. Das Ergebnis sieht gekürzt so aus:
    O:10:"abc_obj":33:{s:8:"###schnipp###

    Wenn ich mir das dann in JS anzeigen lasse, wird mir allerdings nur:
    O:10:
    ausgegeben. Alles ab dem ersten Anführungszeichen fällt weg.

    Was heißt anzeigen lasssen?

    Dieses Format musst du entsprechenden umwandeln, d.h. eine serialize und unserialize Funktion in JS schreiben (ich vermute mal sowas gibt es schon). Ich würd aber JSON verwenden

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Was heißt anzeigen lasssen?

      Moin Struppi,
      anzeigen lassen heißt bei mir

      1. in PHP
        $postMap = serialize($map);
        echo("postMap= ".$postMap);
        // hier ist noch alles iO

      2. in JS
        <input type=hidden name="postMap" value="<?php echo $postMap ?>">
        <script type="text/javascript">
          alert("postedMap= "+document.pdfForm.postMap.value);
          //ab hier kommt nur noch der verstümmelte Ausdruck
        </script>

      3. in PHP
        $postMap = $_POST["postMap"];
        echo("postedMap= ".$postMap);
        $data = unserialize($postMap);
        echo("data= ");
        print_r($data);

      Paul

      1. Hi,

        <input type=hidden name="postMap" value="<?php echo $postMap ?>">

        bah. Schau Dir mal den Quellcode an, dann siehst Du Deinen kapitalen Fehler.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. bah. Schau Dir mal den Quellcode an, dann siehst Du Deinen kapitalen Fehler.

          Moin Cheatah,
          keine Ahnung was Du meinst...

          Paul

          1. bah. Schau Dir mal den Quellcode an, dann siehst Du Deinen kapitalen Fehler.

            Moin Cheatah,
            keine Ahnung was Du meinst...

            Den quellcode, der iom Browser ankommt. Das was du machst wird so nicht funktionieren.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
    2. JSON ist flexibler und du kannst es in einigen Sprachen
      einfach mit eval umwandeln.

      Moin nochmal,
      wie kann ich JSON anwenden? Gibt es dazu Beispiel Quellcode?
      Geht das auch wenn mein Objekt automatisch erstellt wird und ich nichtmal jede Eigenschaft davon kenne bzw immer neue dazukommen?

      Paul

    3. echo $begrüßung;

      habe gestern die Frage gestellt wie man ein Objekt von PHP nach JS und wieder zurück schieben kann.

      Es wäre besser gewesen, stellte er seine Folgefrage in seinem "alten" Thread, so wird es nur für Mitlesende schwerer, wenn das Problem in vielen kleinen Stücken über das ganze Forum verteilt liegt.

      Dabei kam die Antwort das das mit serialize() funzen sollte.
      JSON ist flexibler und du kannst es in einigen Sprachen einfach mit eval umwandeln.

      Soweit ich seine Aufgabenstellung verstanden habe, will er in Javascript gar nichts damit machen, sondern es nur durchreichen. Dann wäre ein Umwandeln in JSON nicht sehr sinnvoll.

      Ich denke, es läuft auf das von Cheatah angesprochene Problem der Maskierung von Stringbegrenzungszeichen, so sie innerhalb eines Strings vorkommen, hinaus.

      echo "$verabschiedung $name";

      1. Moin dedlfix,

        Es wäre besser gewesen, stellte er seine Folgefrage in seinem "alten" Thread, so wird es nur für Mitlesende schwerer, wenn das Problem in vielen kleinen Stücken über das ganze Forum verteilt liegt.

        Ok, nächstes mal bin ich schlauer.

        Soweit ich seine Aufgabenstellung verstanden habe, will er in Javascript gar nichts damit machen, sondern es nur durchreichen. Dann wäre ein Umwandeln in JSON nicht sehr sinnvoll.

        »»
        Genau so.

        Ich denke, es läuft auf das von Cheatah angesprochene Problem der Maskierung von Stringbegrenzungszeichen, so sie innerhalb eines Strings vorkommen, hinaus.

        »»
        Was ist das und wie macht man das? #schäm#

        Paul

        1. echo $begrüßung;

          Ich denke, es läuft auf das von Cheatah angesprochene Problem der Maskierung von Stringbegrenzungszeichen, so sie innerhalb eines Strings vorkommen, hinaus.
          Was ist das und wie macht man das?

          Beispielstring: Das ist eine Zeichenkette, die "Anführungszeichen" enthält.

          Möchte man das als String notieren, der in "" eingefasst ist, bekommt der Parser ein Problem, wenn er auf das erste im Beispielstring enthaltene " stößt. Für ihn ist der String dort zu Ende. Deshalb muss man dieses " entschärfen. Man nennt das Maskieren und macht dies mit einem \ davor:

          $Beispielstring = "Das ist eine Zeichenkette, die maskierte "Anführungszeichen" enthält.";

          Das was ich hier für PHP vorgeführt habe, musst du auch für den Javascript-Code machen.

          Es müssen übrigens auch noch andere Zeichen entschärft werden: Steuerzeichen und besondere Notationen.

          Wenn du nicht Zeichen für Zeichen durchgehen willst, kannst du dafür die Funktion addcslashes() (man beachte das c im Namen) verwenden. Als zweiter Parameter wäre ""\n\f\b\r\t" angebracht.

          Eine weitere Möglichkeit wäre noch, den serialisierten String mit base64_encode() zu behandeln und in vor dem Unserialisieren mit base64_decode() wieder in die serialisierte Form zurückbringen.
          Ich denke, ich würde bei so einer Aufgabenstellung zu dieser Methode greifen.

          #schäm#

          echo str_replace('schäm', 'wissenwill', $zitat);

          echo "$verabschiedung $name";

          1. Vielen Dank erst einmal!

            Allerdings kann man base64_encode() wohl nur auf Strings und nicht auf Objekte anwenden. Kann man Objekte in ein String umwandeln?

            Bei addcslashes() werden die " zwar mit " maskiert, allerdings bekomme ich dann bei der Ausgabe nur:
            O:10:\ heraus.
            Vorher war das:
            O:10:
            Und herauskommen soll:
            O:10:"abc_obj":33:{s:8:"###schnipp###

            Hilfe!

            1. echo $begrüßung;

              Allerdings kann man base64_encode() wohl nur auf Strings und nicht auf Objekte anwenden. Kann man Objekte in ein String umwandeln?

              Nein, aber wenn du das Objekt erst serialisierst, und dann base64-kodierst, erhältst du einen String, der für Javascript keine weiteren Maskierungen benötigt. Das Wiederherstellen des Objekts geht dann in umgekehrter Reihenfolge und mit den jeweiligen Umkehrfunktionen.

              echo "$verabschiedung $name";

              1. Hallo,
                das Objekt wurde in PHP wieder erstellt (man kann es sich nur mit print_r und nicht mehr mit echo anschauen) allerdings kommt beim Versuch darauf zuzugreifen folgendes:

                Fatal error: Object has an invalid _handle_ property in c:\PFAD\pdf.php on line 16

                line16:
                $map->set('width',1200);

                Die Line 16 ist 100%ig i.O.

                Paul

                1. echo $begrüßung;

                  das Objekt wurde in PHP wieder erstellt (man kann es sich nur mit print_r und nicht mehr mit echo anschauen) allerdings kommt beim Versuch darauf zuzugreifen folgendes:

                  echo war noch nie wirklich geeignet, komplexe Typen (Arrays, Objekte) darzustellen (solange man unter PHP5 nicht die magische Funktion __toString() implementiert hat).

                  Fatal error: Object has an invalid _handle_ property in c:\PFAD\pdf.php on line 16
                  $map->set('width',1200);

                  Die Fehlermeldung ist mir noch nicht über den Weg gelaufen. Meine Vermutungen und Kurzrecherche schlagen folgende mögliche Ursachen vor:

                  • Die Klassendeklaration ist dem empfangenen Script nicht bekannt. Das ist daran zu sehen, dass als Klasse __PHP_Incomplete_Class ausgegeben wird.
                  • Es ist ein Ressourcen-Handle übertragen worden. Diese überstehen einen solchen Transport nicht. Damit baut sich am Zielort nicht automatisch beispielsweise eine Datenbankverbindung wieder auf.

                  Wenn es das nicht ist, müsstest du mal versuchen, das Problem mit dem kleinstmöglichen Code (alles Überflüssige aus der Klassendeklaration entfernen) nachzustellen und den dann hier zu zeigen.

                  echo "$verabschiedung $name";

                  1. Hallo,
                    leider habe ich das gefunden:

                    serialize() kann mit den Typen integer, double, string, array (mehrdimensional) und object umgehen. Beim Objekt werden die Eigenschaften serialisiert, die Methoden gehen aber verloren.

                    [http://www.dynamicwebpages.de/php/function.serialize.php]

                    Sollte das ganze damit gestorben sein?

                    Paul

                    1. Hi,

                      Sollte das ganze damit gestorben sein?

                      nicht unbedingt.

                      Cheatah

                      --
                      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                      X-Will-Answer-Email: No
                      X-Please-Search-Archive-First: Absolutely Yes
                      1. echo $begrüßung;

                        Sollte das ganze damit gestorben sein?
                        nicht unbedingt.

                        Ich glaube nicht. __sleep() und __wakeup(), auf die du sicher anspielst, müssen Bestandteil der Klasse des Objekts sein, das wiederhergestellt werden soll. Ohne Klassendeklaration stehen diese beiden Methoden logischerweise auch nicht zur Verfügung[*]. Sie dienen auch vielmehr nur dazu, Ressourcen-Bindungen zu beenden und wiederherzustellen. Oder meintest du etwas anderes?

                        echo "$verabschiedung $name";

                        [*] Es sind ja keine Stand-Alone-Funktionen, wie beispielsweise __autoload().

                    2. echo $begrüßung;

                      serialize() kann mit den Typen integer, double, string, array (mehrdimensional) und object umgehen. Beim Objekt werden die Eigenschaften serialisiert, die Methoden gehen aber verloren.

                      Es werden nur die Werte der Eingenschaften in den serialisierten String übernommen, nicht der komplette Quelltext, der die Deklaration der Methoden enthält, oder irgendwelcher Byte-Code, den der Compiler erzeugt haben mag.
                      Aus einem Haus werden quasi nur die Bewohner evakuiert. Will man sie an anderer Stelle wieder in ein gleiches Haus setzen, muss man es kopieren und an der anderen Stelle zur Verfügung stellen. (Der Vergleich ist aus OOP-Sicht nicht ganz korrekt, aber sei's drum.)

                      Sollte das ganze damit gestorben sein?

                      Nein, du musst einfach nur die Klassendeklaration vor dem Unserialisieren inkludieren oder in den Quelltext kopieren oder anderweitig bekanntgeben. Steht die Klassendeklaration nicht zur Verfügung wird ein Ersatzobjekt angelegt, das dann nur die Eigenschaften enthält. Die Bewohner des Hauses bekommen in dem Fall nur ein Zelt ohne weitere Ausstattung. Natürlich quengeln sie dann rum, wenn sie ihren Bedürfnissen nachgehen wollen und kein passendes Örtchen finden.

                      echo "$verabschiedung $name";

                      1. Hallo,

                        saubere Erklärung für einen wie mich :-) !!

                        Paul

            2. Und herauskommen soll:
              O:10:"abc_obj":33:{s:8:"###schnipp###

              Nein, dass soll nicht rauskommen, eigentlich soll das im Browser ankommen:
              "O:10:"abc_obj":33:{s:8:" ..... ";

              Du musst mit PHP die Zeichen so maskieren, dass du sie im Browser mit JS einlesen kannst.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Wie kann man " sonst noch maskieren? In PHP wird abc" abgeschickt aber im Browser kommt nur abc\ an.

                Paul

                1. Hi,

                  Wie kann man " sonst noch maskieren?

                  so, wie es der jeweilige Kontext verlangt. Siehe https://forum.selfhtml.org/?t=134469&m=872322.

                  In PHP wird abc" abgeschickt aber im Browser kommt nur abc\ an.

                  Im Browser - oder auf Deinem Bildschirm? Schaue Dir den _Quellcode_ an, nicht die Interpretation desselben.

                  Cheatah

                  --
                  X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                  X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                  X-Will-Answer-Email: No
                  X-Please-Search-Archive-First: Absolutely Yes
                  1. In PHP wird abc" abgeschickt aber im Browser kommt nur abc\ an.

                    Im Browser - oder auf Deinem Bildschirm? Schaue Dir den _Quellcode_ an, nicht die Interpretation desselben.

                    Hallo,
                    am Bildschirm: abc\ im Quelltext: abc"

                    allerdings gebe ich das dann ja in einem hidden Feld weiter. Als "Brücke" zwischen den beiden PHP Anwendungen benutze ich JS. JS gibt dann nur:
                    abc\ zurück, was dann auch nur weiter an PHP geleitet werden kann.

                    Paul

        2. Hi,

          Ich denke, es läuft auf das von Cheatah angesprochene Problem der Maskierung von Stringbegrenzungszeichen, so sie innerhalb eines Strings vorkommen, hinaus.
          Was ist das und wie macht man das? #schäm#

          wenn Du einen Wert in einen Kontext bringst, musst Du ihn kontextspezifisch kodieren. Bringst Du einen Text in einen String-Kontext (also "in Anführungszeichen"), musst Du ihn String-kodieren; bringst Du diesen String in einen URL-Kontext (also z.B. den String in einen URL-Parameter), musst Du ihn URL-kodieren; bringst Du diese URL in einen HTML-Kontext (also z.B. in ein href-Attribut), musst Du sie HTML-kodieren. Das gilt

          *** immer ***

          und bei

          *** jedem ***

          Wert. Lerne dies als eisernes Gesetz, und vergiss es niemals. Beispiele hat dedlfix genannt.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes