Ankündigung

Einklappen
Keine Ankündigung bisher.

auf json string zugreifen,wegen utf8 problem

Einklappen

Neue Werbung 2019

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

  • auf json string zugreifen,wegen utf8 problem

    Hallo Leute,
    ich möchte auf den json string zugreifen der so gesendet wurde:
    PHP-Code:
    $.ajax({
             
    url"ajax.php",
             
    data:{'ajax_app':'messages','ajax_do':'send_mail',
                 
    'mail':{'empfaenger':empfaenger,'betreff':betreff,'inhalt':inhalt,'typ':'0'}},
             
    datatype:"json",
             
    type"POST",
             
    success: function(data) { 
                 $(
    '.n_einzelnachricht').fadeOut(250,function(){
                     $(
    '.n_einzelnachricht').remove();
                     $(
    '#n_gesendet').trigger('click');
                 });
                 
             }
             }); 
    in der ajax.php hab ich das bis jetzt so gemacht:
    PHP-Code:
    $clean_postfilter_var_array($_POST,FILTER_SANITIZE_FULL_SPECIAL_CHARS); 
    Wenn ich jedoch Sonderzeichen verwende werden mir diese nicht richtig dargestellt.(obwohl php header=utf8;html meta= utf8,mysql=utf8 und mysql verbindung= utf8 daran liegts nicht

    Jetzt hab ich gelesen,dass das Problem gelöst werden kann,wenn ich json_decode verwende.Okay,aber woher bekomme ich den gesendeten json-String??
    also:
    PHP-Code:
    $clean_post=  filter_var_array(json_decode($wieheisstdieserstring?????),FILTER_SANITIZE_FULL_SPECIAL_CHARS); 
    Vielen Dank


  • #2
    Ajax sendet keinen JSON-String.
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      nagut gibt es denn eine andere möglichkeit den Post komplett zu dekodieren,damit sobnderzeichen wieder richtig dargestellt werden?

      Kommentar


      • #4
        Du musst die einzelen Daten mit POST auffangen und dann verarbeiten.

        PHP-Code:

        if(isset($_POST['ajax_app']))
        {

        }

        [...] 
        - Laravel

        Kommentar


        • #5
          kann es denn sein das "filter_var_array" nicht mit utf-8 klarkommt?

          Kommentar


          • #6
            edit:
            FILTER_SANITIZE_FULL_SPECIAL_CHARS ist nicht dafür gedacht, mehrstufige Arrays zu behandeln.

            FILTER_SANITIZE_FULL_SPECIAL_CHARS gibt, wenn ein "nicht string" validiert wird bool(false) zurück.

            Dein Post-Array sieht, wenn es nicht heute schon zu spät ist, etwa so aus:

            PHP-Code:
            $_POST = [
                
            'ajax_app' => 'messages',
                
            'content' => 'ÄÜÖP='
                'mail' 
            => [
                    
            // Hier ist der Hund begraben
                
            ],

            ];

            // ergebnis

            var_dump(filter_var_array($_POST,FILTER_SANITIZE_FULL_SPECIAL_CHARS)); 
            Code:
            array(3) { ["ajax_app"]=> string(8) "messages" ["content"]=> string(7) "ÄÜP=?" ["mail"]=> bool(false) }

            Original:

            Eher unwahrscheinlich. Was kommt denn in $_POST in deinem Script an?
            (var_dump)

            Wenn du die Situation nicht ohne Ajax nachstellen kannst, dumpe var_dump in eine Datei und schau dir den Inhalt an

            PHP-Code:
            ob_start();
            var_dump($_POST);
            file_put_contents('./dump'ob_get_clean()); 
            Zitat von nikosch
            Naja, anscheinend spricht die Steckdose kein HTTP. LOL

            Kommentar


            • #7
              doch klar,kann ich das nachstellen ,sogar mit ajax, der hund ist in mail auch nicht begraben,sondern nur in äöü:
              PHP-Code:
              $clean_post=  filter_var_array($_POST,FILTER_SANITIZE_FULL_SPECIAL_CHARS);
              var_dump($clean_post);
              //liefert:
              array (size=3)
                
              'ajax_app' => string 'messages' (length=8)
                
              'ajax_do' => string 'send_mail' (length=9)
                
              'mail' => 
                  array (
              size=4)
                    
              'empfaenger' => string 'Max Mustermann' (length=14)
                    
              'betreff' => string 'äöü' (length=45)
                    
              'inhalt' => string 'Hallo,blabla...' (length=14)
                    
              'typ' => string '0' (length=1
              nachtrag:
              $_POST['mail']['betreff'] liefert ganz normal äöü,das heißt die filterfunktion versagt hier ganz eindeutig

              gibt es da eine lösung?

              Kommentar


              • #8
                so scheint es zu gehen:
                PHP-Code:
                $clean_post=$_POST;
                array_walk_recursive($clean_post, function (&$value) {
                    
                $value htmlentities($value,ENT_QUOTES"UTF-8");
                }); 
                Vielen Dank für eure Anregungen und Kommentare,ohne euch wäre ich nie so schnell drauf gekommen und hätte den Denkfehler mit $_POST und dem nicht vorhandenen json-String beibehalten

                Kommentar


                • #9
                  Hallöchen,

                  das sieht mir irgendwie nach Murks aus. Ich arbeite sehr exzessiv mit JSON für die Datenübertragung, aber solch ein Würgaround war noch nie notwendig.

                  Viele Grüße,
                  lotti

                  Kommentar


                  • #10
                    naja funktionieren tut es,aber es kann schon sein das es trozdem murks ist...ich überleg eh grad ob es nicht sinnvoll ist alles komplett unbehandelt über prepared statements in die db zu speichern,weil ich auch sowas machen will,wie maximale zeichenbegrenzung pro nachricht und es problematisch wird,wenn nicht jedes zeichen wie eins zählt..

                    Kommentar


                    • #11
                      (Das beobachtete Problem dürfte an einer unpassenden Einstellung von default_charset liegen. http://php.net/manual/en/ini.core.ph...efault-charset)

                      OT:

                      Da scheint auch mal wieder die Doku zu den Filtern falsch zu sein.

                      Das var_dump in #7 ergibt unter anderem diese Ausgabe:

                      Code:
                      'betreff' => string 'äöü' (length=45)
                      In der Doku zu FILTER_SANITIZE_FULL_SPECIAL_CHARS steht:

                      Equivalent to calling htmlspecialchars() with ENT_QUOTES set.
                      - http://php.net/manual/en/filter.filters.sanitize.php

                      htmlspecialchars erzeugt keine HTML-Entities wie à und dergleichen.

                      Es ist echt schade, dass die Doku zu vielen neueren Bestandteilen von PHP so schlecht ist, dass man das im Grunde alles nicht verwenden kann, weil man nicht wirklich rausfinden kann, wann was wieso auf welche Weise passiert.

                      Ich finde es sogar sinnlos, dann zu Kleinigkeiten einen Bugreport zu erstellen, weil es halt zu viele Kleinigkeiten gibt.

                      Kommentar

                      Lädt...
                      X