Ankündigung

Einklappen
Keine Ankündigung bisher.

mysql_set_charset

Einklappen

Neue Werbung 2019

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

  • mysql_set_charset

    nachdem ich große probleme hatte mit SimpleXMLElement::asXML in verbindung mit umlauten, konnte ich mein problem lösen, indem ich mysql_set_charset auf meine db-connetion angewendet habe. ich hab 3 stunden herumexperimentiert und weiß nicht, wie ich es ohne verwendung von mysql_set_charset hinbekommen soll, SimpleXMLElement zu verwenden.
    seit ich nun mysql_set_charset drin habe, kann ich mit meiner db nicht mehr normal interagieren. manipuliere ich bsw. einen utf8_general_ci wert via UPDATE oder füge ich einen hinzu via INSERT, wird alles ab dem umlaut einfach abgeschnitten.

    bsp:

    PHP-Code:
    mysql_query("INSER INTO t (a) VALUES ('fooäbar')"); 
    in der datenbanktabelle steht dann nur foo als wert von a

    bitte helft mir, ich bin am verzweifeln und ich weiß auch nicht, wonach ich googeln könnte.

  • #2
    Funktioniert es mit PDO?

    Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
    Choosing an API
    Warum man mysql* generell nicht (mehr) nutzen sollte.
    Wie man von mysql* auf PDO umsteigt
    Wissenswertes zum Thema SQL-Injection

    Kommentar


    • #3
      wie wäre es denn, uns nicht mit einer Hälfte abzuspeisen

      mysql_set_charset ?? .-.- auf welchen Zeichensatz / Encoding hast du die Verbindung denn gesetzt ?

      Wie ist dein PHP-Script encoded , wie deine Webseite .. wie das XML ... Fragen über Fragen !
      "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

      Kommentar


      • #4
        ich verwende kein pdo
        mysqli leider auch noch nicht.
        ich hab mal teile meines codes hier zusammengefasst, um euch zu zeigen was ich genau tue:
        PHP-Code:
        $connection=@mysql_connect($db['dbhost'], $db['dbuser'], $db['dbpwd']);
        if(
            !$connection
            OR !@mysql_select_db($db['dbdb'])
            OR !mysql_query("SELECT 1 FROM ".$db['prefix']."_products")
        ){
        die('
            <meta http-equiv="refresh" content="0; URL='.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'].'?build-db-connect=1" />
        ');
        }else{
            mysql_set_charset('utf8',$connection);
        }

        ...

        $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><'.$root.'/>');
        $this->_to_xml($xml, $array, $listitemname);
        $simpleXml = utf8_decode(html_entity_decode($xml->asXML(), ENT_NOQUOTES, 'UTF-8'));

        ...

        function _to_xml(SimpleXMLElement $object, array $data, $listitemname)
        {   
            foreach ($data as $key => $value)
            {   
                if (is_array($value))
                {
                    if(is_numeric($key)) {
                        $new_object = $object->addChild($listitemname);
                        $this->_to_xml($new_object, $value, $listitemname);
                    }
                    else {
                        $new_object = $object->addChild($key);
                        $this->_to_xml($new_object, $value, $listitemname);
                    }
                }   
                else
                {
                    //http://stackoverflow.com/questions/552957/rationale-behind-simplexmlelements-handling-of-text-values-in-addchild-and-adda
                    //$object->addChild($key, $value);
                    $value=utf8_encode($value);
                    if(strpos($value,'<') !== false || strpos($value,'>') !== false || strpos($value,'&') !== false) {
                        $value = '<![CDATA['.$value. ']]>';
                    }
                    if(is_numeric($key)) {
                        $child = $object->addChild($listitemname)->{0} = $value;
                    }
                    else {
                        $child = $object->addChild($key)->{0} = $value;
                    }
                }   
            }   
        }

        ...
        durch das gezeigte, kann ich nun ordnungsgemäß daten nach xml exportieren. der untere teil ist ein teil einer funktion, die diese aufgabe übernimmt. der obere teil stellt die datenbankverbindung her und wird mehr oder weniger global für alle über ajax verwendete php dateien verwendet. dazu zählen natürlich auch andere scripte, als nur dieser export. diese anderen scripte können dann keine umlaute mehr zur datenbank übertragen, sondern schneiden die strings immer in der weise, wie ich es in meinem ersten post erklärt habe ab.
        php-script, website und xml sind in utf8 encodet.

        Kommentar


        • #5
          Wenn wirklich alles bereits in UTF8 vorliegt
          - dann verwendest du die falschen Stringfunktionen
          - warum finden sich im Code Aufrufe von utf8_encode()?

          Insbesondere der zweite Punkt ist kritisch, denn wenn du hingehst und UTF8 Daten nochmal encodest, erzeugst du Datenmüll...

          Bei konsequenter Nutzung von UTF8 ist keine Konvertierung mehr nötig!
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            das dachte ich auch, aber nur so, wie es dasteht, funktioniiert es. ich habe ewig rumprobiert um das hinzubekommen und es ist auch nicht intuitiv.
            das problem ist ja nun, dass bei updates oder inserts in die db die entsprechend zu übertragenden strings an den umlauten abgeschnitten werden. damit hat das oben aufgeführte jedoch nichts zutun, bis auf den ersten teil, der die konnektivität erstellt. seit ich dort die zeile:
            PHP-Code:
            mysql_set_charset('utf8',$connection); 
            eingebaut habe, funktioniert das zeug mit dem xml, was ich oben stehen habe. seitdem funktionieren aber wie gesagt alle anderen stellen, die die datenbank manipulieren nicht mehr, da sie eben die werte an den umlauten abschneiden.

            Kommentar


            • #7
              das klingt danach, als ob du ISO-zeichencodes in die utf8-Spalten füllst.

              UTF8 -> Umlaute bestehen aus 2 Bytes, deren erstes Byte den Werg 128 trägt.
              ISO -> Umlaute bestehen aus 1 Byte, dessen Wert >128 ist -
              wenn du solche Werte in Utf8-Spalten einfüllst, kommt es zum Konflikt-> ergo kann dein beobachtetes Verhalten auftreten, die Zeichenketten werden abgeschnitten
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

              Kommentar


              • #8
                ich verwende kein pdo
                mysqli leider auch noch nicht
                Und wieso nicht? Dir ist schon klar, dass mysql* aber nächsten PHP Version weg sein wird, oder?
                https://github.com/Ma27
                Javascript Logic is funny:
                [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                Kommentar


                • #9
                  ich konnte das problem jetzt "lösen", indem ich die zeile mysql_set_charset('utf8',$connection); nur noch in der datei für den export einbaue und nicht global in der config.php. das ist keine schöne lösung, aber es funktioniert alles. :-/
                  ich weiß, dass mysql_* schonbald nicht mehr existiert... seit kurzem. mir ist das leider nicht aufgefallen, bis jetzt. das bedeutet, dass ich an vielen vielen stellen nacharbeiten muss.

                  Kommentar

                  Lädt...
                  X