Frank.: JS in php übersetzen?

Hallo,

eine Datei countries.js

var countries = {};  
countries.results = [  
	{id:'AF',name:'Afghanistan'},  
	{id:'AL',name:'Albania'},  
	{id:'DZ',name:'Algeria'},  
	{id:'AS',name:'American Samoa'},  
	{id:'AD',name:'Andorra'},  
	{id:'EH',name:'Western Sahara'},  
	{id:'YE',name:'Yemen'},  
	{id:'ZM',name:'Zambia'},  
	{id:'ZW',name:'Zimbabwe'}  
];  
countries.total = countries.results.length;

möchte ich "in php übersetzen", sprich, es soll derselbe json-output dabei entstehen. Ich bin nicht sicher, ob mir das gelungen ist. Es scheint aber, das das nicht der Fall ist, weil mein Ergebnis nicht ganz dem erwarteten entspricht.

  
<?php  
  
$results = array("total" => "20",  
                                "results" => array(  
                                        array(id=>1,name=>'Ant'),  
                                        array(id=>2,name=>'Bear'),  
                                        array(id=>3,name=>'Cat'),  
                                        array(id=>4,name=>'Dog'),  
                                        array(id=>5,name=>'Elephant'),  
                                        array(id=>6,name=>'Fox'),  
                                        array(id=>7,name=>'Guinea Pig'),  
                                        array(id=>8,name=>'Horse'),  
                                        array(id=>9,name=>'Iguana'),  
                                        array(id=>10,name=>'Jaguar'),  
                                        array(id=>11,name=>'Kangaroo'),  
                                        array(id=>12,name=>'Lion'),  
                                        array(id=>13,name=>'Monkey'),  
                                        array(id=>14,name=>'Nanook'),  
                                        array(id=>15,name=>'Orangoutan'),  
                                        array(id=>16,name=>'Pig'),  
                                        array(id=>17,name=>'Qgo'),  
                                        array(id=>18,name=>'Rabbit'),  
                                        array(id=>19,name=>'Snake'),  
                                        array(id=>20,name=>'Tapir')  
                                )  
                        );  
  
$results = json_encode($results);  
echo $results;  
?>  

Sind die js-datei und die php-datei vom Output her (natürlich nicht die Einträge, das seh ich auch) identisch?

Gruß, Frank

  1. Hi!

    eine Datei countries.js
    möchte ich "in php übersetzen", sprich, es soll derselbe json-output dabei entstehen. Ich bin nicht sicher, ob mir das gelungen ist. Es scheint aber, das das nicht der Fall ist, weil mein Ergebnis nicht ganz dem erwarteten entspricht.

    Produziere in Javascript den JSON-String. Lass diesen von PHPs json_decode() interpretieren und schau dir das Ergebnis mit var_dump() an. Dann solltest du sehen, was du erzeugen muss. Zumindest kannst du dann diese Ausgabe mit einem var_dump() deiner erstellten Struktur vergleichen. Wenn dann beim json_encode() was anderes entsteht, solltest du prüfen, ob es nicht syntaktisch dasselbe ist, nur unbedeutend anders notiert ist (zum Beispiel weggelassene optionale Anführungs- oder Maskierzeichen).

    Lo!

    1. Hi Dedlfix,

      Produziere in Javascript den JSON-String.

      Gute Idee. Wie mache ich das?

      Dann solltest du sehen, was du erzeugen muss. Zumindest kannst du dann diese Ausgabe mit einem var_dump() deiner erstellten Struktur vergleichen.

      Ok. Das würde ich, denke ich, hinbekommen. Aber ich weiß nicht, wie ich an den originalen JSON-String komme.

      Grüße, Frank

      1. Produziere in Javascript den JSON-String.

        Gute Idee. Wie mache ich das?

        In Browsern mit nativer JSON-Unterstützung (da sind alle großen aktuellen):

        var json = [link:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify@title=JSON.stringify](countries);

        Für ältere Browser gibt es ein Script, das JSON.stringify (und das Gegenstück JSON.parse) nachbaut, wenn es nicht vorhanden ist.

        Mathias

  2. Hallo,

    möchte ich "in php übersetzen", sprich, es soll derselbe json-output dabei entstehen. Ich bin nicht sicher, ob mir das gelungen ist.

    Wieso bist du dir da nicht sicher?

    Es scheint aber, das das nicht der Fall ist, weil mein Ergebnis nicht ganz dem erwarteten entspricht.

    Inwiefern?

    Sind die js-datei und die php-datei vom Output her (natürlich nicht die Einträge, das seh ich auch) identisch?

    Dein Code liefert ein

    {"total":"20","results":[{"id":1,"name":"Ant"},{"id":2,"name":"Bear"},{"id":3,"name":"Cat"},{"id":4,"name":"Dog"},{"id":5,"name":"Elephant"},{"id":6,"name":"Fox"},{"id":7,"name":"Guinea Pig"},{"id":8,"name":"Horse"},{"id":9,"name":"Iguana"},{"id":10,"name":"Jaguar"},{"id":11,"name":"Kangaroo"},{"id":12,"name":"Lion"},{"id":13,"name":"Monkey"},{"id":14,"name":"Nanook"},{"id":15,"name":"Orangoutan"},{"id":16,"name":"Pig"},{"id":17,"name":"Qgo"},{"id":18,"name":"Rabbit"},{"id":19,"name":"Snake"},{"id":20,"name":"Tapir"}]}

    Was gefällt dir daran nicht?

    Diese JSON-Serialisierung hat kein Whitespace, ist also nicht schön menschenlesbar formatiert – kannst du zum Test aber mal tun.

    Und die Schlüsselnamen der Objects sind alle in Anführungszeichen gefasst. Das ist eine Erfordernis von JSON, in JavaScript kann man sie in in vielen Fällen weglassen.

    Mathias

    1. Hallo Mathias,

      Es scheint aber, das das nicht der Fall ist, weil mein Ergebnis nicht ganz dem erwarteten entspricht.

      Inwiefern?

      Ich würde die Daten hierfür nutzen. Wenn ich aber die json-Daten über php dynamisch generiere, funktioniert das Script zwar auch, aber es zeigt immer alle 20 Einträge an, d.h. es selektiert beim buchstabenweisen Eintragen nicht mehr die aus, die nicht mehr passen.

      Bsp: Ich trage "e" ein und erhalte alle Einträge. Das alleine ist schon falsch, weil z.b. "CAT" kein e hat. Dann tippe ich weiter und es bleiben nach wie vor alle 20 Einträge, die aus der result.php kommen in der Vorschlagliste.

      Grüße, Frank

      1. Hi,

        Ich würde die Daten hierfür nutzen. Wenn ich aber die json-Daten über php dynamisch generiere, funktioniert das Script zwar auch, aber es zeigt immer alle 20 Einträge an, d.h. es selektiert beim buchstabenweisen Eintragen nicht mehr die aus, die nicht mehr passen.

        Üblicherweise ist es bei solchen Autocompletern Aufgabe des serverseitigen Scriptes, die Daten entsprechend zu filtern – gibt es hier Hinweise (Doku) darauf, dass das bei diesem Script anders ist?

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hi Chris,

          Üblicherweise ist es bei solchen Autocompletern Aufgabe des serverseitigen Scriptes, die Daten entsprechend zu filtern – gibt es hier Hinweise (Doku) darauf, dass das bei diesem Script anders ist?

          Oh, völlig neuer Ansatz. Aber Du hast vielleicht völlig Recht. Und es wäre auch in meinem Sinne.

          In diesem Script wird es deshalb (in der Demo) clientseitig sein, weil (in der Demo) das Javascript den JSON-String produziert.

          Aber wenn Du Recht hast, wäre tatsächlich mein JSON-String völlig in Ordnung und ich müsste es im php-script ändern.

          Die Doku läßt sich zu diesem Thema gar nicht aus.

          Gruß, Frank

        2. Aufgabe des serverseitigen Scriptes, die Daten entsprechend zu filtern –

          Eine Frage dazu, wie kann ich prüfen, was in meinem serverseitigem Script von dem Ajaxrequest ankommt?

          Gruß, Frank

          1. Hi!

            Eine Frage dazu, wie kann ich prüfen, was in meinem serverseitigem Script von dem Ajaxrequest ankommt?

            Ein Ajax-Request ist aus Sicht des Servers auch nichts anderes als ein normaler Request. Alle üblichen Strukturen wie $_GET und $_POST werden erwartungsgemäß gefüllt. Ich vermute, dass dein Problem ist, wie man davon Kontrollausgaben erstellen kann, da der Ajax-Request ja im Hintergund des Browsers läuft und dieser die Response nicht direkt rendert. Eine Möglichkeit ist, die Kontrollausgabe auf dem Server einfach durchzuführen, so dass diese in der Ajax-Response landet. Im Browser greifst du an der Stelle ein, an der du die Response erwartest und macht davon eine Kontrollausgabe (mit alert() oder mit Webdeveloper-Tools geschaut). Alternativ kannst du auf dem Server eine Datei anlegen, die Ausgabe dorthinein schreiben und sie dir geeignet zu Gemüte führen.

            Lo!

            1. Hi Dedlfix,

              Ich vermute, dass dein Problem ist, wie man davon Kontrollausgaben erstellen kann, da der Ajax-Request ja im Hintergund des Browsers läuft und dieser die Response nicht direkt rendert.

              Korrekt vermutet. Bis mir dann eine Idee kam:

              Alternativ kannst du auf dem Server eine Datei anlegen, die Ausgabe dorthinein schreiben und sie dir geeignet zu Gemüte führen.

              Genau diese Idee hatte ich. :-)
              Und im $_GET array findet sich dann je eingegebenem Zeichen folgendes wieder:

              *110application/json; charset=utf-8

              Heißt das, ich kann mir daraus immer das erste Zeichen fischen und den Rest streichen und mir so sukkzessive meinen "Suchstring" basteln?

              Gruß, Frank

              1. *110application/json; charset=utf-8

                * = das eingebene Zeichen, also bei einem eigegebenen y stünde da:

                y110application/json; charset=utf-8

                Gruß, Frank

                1. *110application/json; charset=utf-8

                  * = das eingebene Zeichen, also bei einem eigegebenen y stünde da:

                  y110application/json; charset=utf-8

                  Das dachte ich, würde übergeben, aber wenn ich wie nachfolgend ändere

                  $uebergebenes_zeichen=$uebergebenes_zeichen."---";

                  erscheint z.b. für ein eingegebenes Zeichen # das folgende:

                  #---1---10---application/json; charset=utf-8---

                  Wer kann mir das mal erklären? Vielleicht kann ich dann  die übergenenen Zeichen auch mal auslesen und nutzen :-(

                  Gruß, Frank

                  1. Hi,

                    Wer kann mir das mal erklären?

                    Niemand, weil du uns noch gar nicht gesagt hast, was genau das eigentlich ist, was du dir da anschaust.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. Niemand, weil du uns noch gar nicht gesagt hast, was genau das eigentlich ist, was du dir da anschaust.

                      Echt? Ich dachte, schon. Aber egal:

                        
                      $datei = fopen("control.txt","a");  
                      foreach($_GET as $uebergebenes_zeichen) {  
                      $uebergebenes_zeichen=$uebergebenes_zeichen."---";  
                      fwrite($datei, $meine_blume);  
                         }  
                      fclose($datei);  
                      
                      

                      Bei einem übergebenen ü z.B. steht dann da in der Datei contol.txt:

                      ü---1---10---application/json; charset=utf-8---

                      Kann das sein, dass ich das decodieren muss?

                      Gruß, Frank

                      1. fwrite($datei, $uebergebenes_zeichen);

                      2. Hi,

                        Bei einem übergebenen ü z.B. steht dann da in der Datei contol.txt:

                        ü---1---10---application/json; charset=utf-8---

                        Kann das sein, dass ich das decodieren muss?

                        Nein, du musst es nur aus $_GET entnehmen, unter dem Parameternamen, unter dem es übergeben wird.
                        Dummerweise hast du die Parameternamen ja vollkommen ignoriert bei deiner Debugausgabe.

                        MfG ChrisB

                        --
                        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                        1. Dummerweise hast du die Parameternamen ja vollkommen ignoriert bei deiner Debugausgabe.

                          Oh. Kannst Du ewtas genauer werden bitte?

                          Gru, Frank

                          1. Hi,

                            Dummerweise hast du die Parameternamen ja vollkommen ignoriert bei deiner Debugausgabe.

                            Oh. Kannst Du ewtas genauer werden bitte?

                            Ja: Beschäftige dich bitte mit den absoluten Grundlagen.

                            Lass dir den Inhalt von $_GET entweder komplett ausgeben (print_r/var_dump), oder nutze die Version der foreach-Schleife, die auch die Array-Schlüssel zur Verfügung stellt.

                            MfG ChrisB

                            --
                            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                            1. Lass dir den Inhalt von $_GET entweder komplett ausgeben (print_r/var_dump), oder nutze die Version der foreach-Schleife, die auch die Array-Schlüssel zur Verfügung stellt.

                              Immer freundlich bleiben, Chris. Ok?

                              $datei = fopen("control2.txt","a");
                              foreach($_GET as $key => $value) {
                              fwrite($datei, $key."--".$value);
                                 }
                              fclose($datei);

                              ergibt bei Übergabe von #:

                              q--#p--1s--10contentType--application/json; charset=utf-8

                              Gruß, Frank

                              1. Hi,

                                Immer freundlich bleiben, Chris. Ok?

                                Gerne. Dann aber bitte auch ein bisschen selber mitdenken. Und: Mit Grundlagen beschäftigen, und nicht jeden Kleinkram hier im Privatunterricht erklären lassen. OK?

                                MfG ChrisB

                                --
                                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                                1. Gerne. Dann aber bitte auch ein bisschen selber mitdenken. Und: Mit Grundlagen beschäftigen, und nicht jeden Kleinkram hier im Privatunterricht erklären lassen. OK?

                                  Gerne. Schaui Dir aber den Themenstrang an und Du siehst, dass ich mitdenke.

                                  Gruß, Frank

                                  1. Hi,

                                    Gerne. Schaui Dir aber den Themenstrang an und Du siehst, dass ich mitdenke.

                                    OK, dann gehe ich davon aus, dass du bei der letzten Statusmeldung („Code [foo] gibt [bar] aus“) einfach vergessen hast uns mitzuteilen, wie du diese Ausgabe jetzt interpretiert :-)

                                    Also …?

                                    MfG ChrisB

                                    --
                                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                                    1. Also …?

                                      Naja, das ist ja nu echt nicht mehr schwer, oder?

                                      Also, Du hattest aber wohl recht damit, dass das Serverscript die Auswertung vornimmt und selektiert. Und unter korrekter Interpretation des letzten Ausgabeergebnisses (sie Also...?) ist die Versorgung des Serverscriptes mit Auswahlkriterien gar kein Problem mehr.

                                      Was aber seltsam ist, und damit komme ich zum nächsten Knackpunkt:

                                      By default, clicking the arrow will return all results (up to paging.pageSize, which is 10 by default).

                                      Sagt die Doku. Sie sagt auch:

                                      The paging object contains many properties to customize the appearance of the paging toolbar:

                                      paging: {
                                          style: ‘input’, // or ‘links’
                                          cssClass: ‘paging’, // prefix with containerClass (e.g. .ffb .paging)
                                          pageSize: 10, // acts as a threshold. if }

                                      Paging hat aber leider, im Gegensatz zu allen anderen Optionen, die die Doku vorgibt, bei mir keinerlei Auswirkung. Auch die Default-Einstellung von 10 Einträgen per Seite, stimmt bei mir nicht.

                                      Angewendet sollte ich es korrekt haben:

                                      <script type="text/javascript">  
                                          $(function() { // $(function() { ... });  is equivalent to $(document).ready(function() { ... });  
                                      				$('#fb').flexbox('res.php', {  
                                      					watermark: 'Enter name',  
                                      					showArrow: 'false',  
                                      					paging: {  
                                                          pageSize: 5  
                                                                   }  
                                      				});  
                                      				});  
                                        
                                      </script>
                                      

                                      Und das Paging läuft doch clientseitig ab, oder?

                                      Gruß, Frank

                              2. Hallo,

                                $datei = fopen("control2.txt","a");
                                foreach($_GET as $key => $value) {
                                fwrite($datei, $key."--".$value);
                                   }
                                fclose($datei);

                                ergibt bei Übergabe von #:

                                q--#p--1s--10contentType--application/json; charset=utf-8

                                schön, also hast du in Wirklichkeit übergeben:  ?q=%23&p=1&s=10
                                Und worüber wunderst du dich jetzt noch?

                                So long,
                                 Martin

                                --
                                Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
                                  (Gernot Back)
                                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                1. q--#p--1s--10contentType--application/json; charset=utf-8

                                  schön, also hast du in Wirklichkeit übergeben:  ?q=%23&p=1&s=10
                                  Und worüber wunderst du dich jetzt noch?

                                  Hi Martin,

                                  ja, sorry, ich vergaß, es dazu zu schreiben. Nach dieser Ausgabe war mir natürlich alles klar und ich konnte über $_GET['q'] natürlich meinen Übergabestring ermitteln.

                                  Danke natürlich für Deinen Tip.

                                  Gruß, Frank

                      3. Hi!

                        Niemand, weil du uns noch gar nicht gesagt hast, was genau das eigentlich ist, was du dir da anschaust.
                        Echt? Ich dachte, schon. Aber egal:

                        Hätte ich auch nicht gewusst, wie dein Ausgabestring zustandekommt.

                        $datei = fopen("control.txt","a");

                        foreach($_GET as $uebergebenes_zeichen) {
                        $uebergebenes_zeichen=$uebergebenes_zeichen."---";
                        fwrite($datei, $meine_blume);
                           }
                        fclose($datei);

                          
                        Abgesehen von deinem Fehler beim Array-Zugriff hättest du es mit fwrite(..., print\_r($\_GET, true)) einfacher haben können. Das true sorgt dafür, dass print\_r() nichts ausgibt sondern die Ausgabe zurückliefert. Etwas vergleichbares hat var\_dump() leider nicht, da muss man sich mit Output Buffering behelfen. Und noch einfacher als mit fopen/fwrite geht es mit file\_put\_contents(). Das hat auch eine Option zum Anhängen an bestehende Dateien.  
                          
                          
                        Lo!