hossi: Daten aus MySQL in Formular laden problem mit Umlauten

Hallo,

ich habe ein kleines script geschrieben, mit dem Daten in eine MySQL eingefügt, angezeigt und wieder in einem Formular bearbeitet werden können.

Das mit dem Einfügen der Daten samt Umlauten klappt wunderbar,auch bei der Ausgabe der Datensätze werden die Umlaute korrekt dargestellt, dank dieser zeile nach dem Verbindugnsaufbau...

mysql_query("SET NAMES 'utf8'");

Bei dem einlesen der Daten in ein <textarea>-feld werden die Umlaute aber nicht mehr dargestellt, stattdessen kommt sowas .. ����

Woran kann es liegen? Die MySQL wurde in Kollation utf8_general_ci erstellt und auch die Daten werden wie genannt mit dem query("SET NAMES utf8...) eingetragen.

Danke

  1. Hallo,

    vielleicht solltest du Mal die Codierung der HTML-/PHP-Seite, auf der die Daten im textarea angezeigt werden, prüfen.

    Hier sollte im einen der metatags die Codierung ebenfalls auf utf8 gestellt sein.

    1. Hallo,

      vielleicht solltest du Mal die Codierung der HTML-/PHP-Seite, auf der die Daten im textarea angezeigt werden, prüfen.

      Hier sollte im einen der metatags die Codierung ebenfalls auf utf8 gestellt sein.

      Hi,
      daran hatte ich gedacht und habs so gelöst:

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
      <html xmlns="http://www.w3.org/1999/xhtml">  
      <head>  
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      
    2. Hi,

      vielleicht solltest du Mal die Codierung der HTML-/PHP-Seite, auf der die Daten im textarea angezeigt werden, prüfen.

      ich habe im Moment noch nicht angenommen, dass ein generelles Codierungsproblem vorliegt, denn dann müssten Umlaute und andere Nicht-ASCII-Zeichen auch im restlichen Dokument falsch wiedergegeben werden. Davon hat hossi aber nichts gesagt.
      Trotzdem ist es natürlich kein Fehler, auch diese Angaben nochmal zu überprüfen.

      Hier sollte im einen der metatags die Codierung ebenfalls auf utf8 gestellt sein.

      Ja, nur dass diese Angabe in den meisten Fällen keine Rolle spielt, da der HTTP-Header Vorrang hat. *DAS* wäre die entscheidende Stelle.

      Ciao,
       Martin

      --
      Der Alptraum jedes Computers:
      "Mir war, als hätte ich gerade eine 2 gesehen."
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hi,

    mysql_query("SET NAMES 'utf8'");
    Bei dem einlesen der Daten in ein <textarea>-feld werden die Umlaute aber nicht mehr dargestellt, stattdessen kommt sowas .. ����

    diese Kästchen werden angezeigt, wenn die Zeichen, die der Browser meint anzeigen zu müssen, nicht in der gewählten Schriftart enthalten sind. Leider überspringst du mit der Beschreibung der Symptome nun einige Zwischenschritte.

    Um die Stelle zu finden, an der die Codierung "kaputtgeht", solltest du mal nach jedem Schritt, bei dem die Daten weitergegeben oder verändert werden, eine Kontrollausgabe als Hexdump machen (z.B. mit urlencode leicht zu machen). Und zwar sowohl auf dem Weg vom Formular zur DB, als auch auf dem Rückweg. So sieht man deutlich, an welcher Stelle die Daten verfälscht sind, und kann dann gezielt nach der Ursache suchen.

    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. Um die Stelle zu finden, an der die Codierung "kaputtgeht", solltest du mal nach jedem Schritt, bei dem die Daten weitergegeben oder verändert werden, eine Kontrollausgabe als Hexdump machen (z.B. mit urlencode leicht zu machen). Und zwar sowohl auf dem Weg vom Formular zur DB, als auch auf dem Rückweg. So sieht man deutlich, an welcher Stelle die Daten verfälscht sind, und kann dann gezielt nach der Ursache suchen.

      Oh weia ;)

      Das übersteigt als noob absolut meine Fähigkeiten :(

    2. Hi!

      Bei dem einlesen der Daten in ein <textarea>-feld werden die Umlaute aber nicht mehr dargestellt, stattdessen kommt sowas .. ����
      diese Kästchen werden angezeigt, wenn die Zeichen, die der Browser meint anzeigen zu müssen, nicht in der gewählten Schriftart enthalten sind.

      In dem Fall kommt beim Firefox ein auf der Kante stehendes Rechteck mit dem Hex-Wert darin. Die Fragezeichen kommen in der Regel bei Dekodierungsfehlern, also beispielsweise wenn eine Bytefolge keine UTF-8-Sequenz ergibt. Und das passt dann auch mit dem im Verlauf des Threads herausgefundenem zu späten Umschalten auf UTF-8.

      Kleine Werbung fürs Wiki: Themen:Zeichencodierung und speziell: Themen:Zeichencodierung/MySQL

      Lo!

      1. Kleine Werbung fürs Wiki: Themen:Zeichencodierung und speziell: Themen:Zeichencodierung/MySQL

        JUHU :)

        Besten Dank :) Der Wiki Link wars :)

        Habe die config.php entsprechend so bearbeitet

        <?php  
          
        $link =  mysql_connect("localhost", "root","") or die  
            ("Keine Verbindung moeglich");  
          
        mysql_set_charset('utf8', $link);  
          
        mysql_select_db("mangel") or die  
            ("Die Datenbank existiert nicht.");  
          
          
        $root = "192.168.1.1/mangel/";  
          
        ?>
        
  3. Mahlzeit hossi,

    Bei dem einlesen der Daten in ein <textarea>-feld werden die Umlaute aber nicht mehr dargestellt, stattdessen kommt sowas .. ����

    Was verstehst Du unter "Einlesen der Daten in ein <textarea>-Feld"?

    Ist die PHP-Datei als UTF-8 (ohne BOM!) gespeichert? Ist der Webserver so konfiguriert, dass er als HTTP-Header UTF-8 angibt?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Mahlzeit hossi,

      Mahlzeit auch :)

      Bei dem einlesen der Daten in ein <textarea>-feld werden die Umlaute aber nicht mehr dargestellt, stattdessen kommt sowas .. ����

      Was verstehst Du unter "Einlesen der Daten in ein <textarea>-Feld"?

      Unter einlesen versteh ich das:

        
        <?php  
        include('config.php');  
        
        
        $id = $_POST["id"];  
        
        $abfrage1 = "SELECT * FROM garant WHERE id = '".$id."'";  
        $ergebnis1 = mysql_query($abfrage1);  
        mysql_query("SET NAMES 'utf-8'");  
        while($row = mysql_fetch_object($ergebnis1))  
                     {  
         		echo "  
        
      <form id=\"form1\" name=\"form1\" method=\"post\" action=\"update-garant-3.php\">  
        <table width=\"620\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">  
          <tr>  
            <th width=\"174\" scope=\"col\"><div align=\"left\">Bauvorhaben</div></th>  
            <th width=\"426\" scope=\"col\"><div align=\"left\">  
              <label>  
                $row->bauvorhaben  
      		  ";  
        
      		echo "  
                </select>  
                </label>  
            </div></th>  
          </tr>  
          <tr>
      

      ... code gekürtzt....

      Ist die PHP-Datei als UTF-8 (ohne BOM!) gespeichert?

      Was heißt BOM?!

      Ist der Webserver so konfiguriert, dass er als HTTP-Header UTF-8 angibt?

      Läuft nur lokal im Intranet auf einer Xampp-Version

      ApacheFriends XAMPP (Basispaket) version 1.6.3a

      + Apache 2.2.4
        + MySQL 5.0.45
        + PHP 5.2.3 + PHP 4.4.7 + PEAR
        + PHP-Switch win32 1.0 (von Apachefriends, man nehme die "php-switch.bat")
        + XAMPP Control Version 2.5 from www.nat32.com
        + XAMPP Security 1.0
        + SQLite 2.8.15
        + OpenSSL 0.9.8e
        + phpMyAdmin 2.10.3
        + ADOdb 4.95
        + Mercury Mail Transport System v4.01b
        + FileZilla FTP Server 0.9.23
        + Webalizer 2.01-10
        + Zend Optimizer 3.3.0
        + eAccelerator 0.9.5.1 für PHP 5.2.3 (auskommentiert php.ini)

      1. Hallo,

        Unter einlesen versteh ich das:

        ah, jetzt werden wir konkret! :-)

        <?php

        $id = $_POST["id"];
          $abfrage1 = "SELECT * FROM garant WHERE id = '".$id."'";
          $ergebnis1 = mysql_query($abfrage1);
          mysql_query("SET NAMES 'utf-8'");

          
        Zu diesen paar Zeilen habe ich schon drei böse Anmerkungen.  
         \* Dass du dir eine gefährliche Sicherheitslücke aufreißt, ist dir bewusst? Wenn dir für den URL-Parameter 'id' jemand etwas hinreichend gemeines unterschiebt, kann er mit deiner DB so ziemlich alles tun.  
         \* Das Umkopieren zur Verschleierung der Herkunft von Daten ist wohl auch nicht auszurotten.  
         \* Wenn du \*erst\* eine Abfrage absetzt, und danach die Codierung der Verbindung auf UTF-8 umstellst, ist das Kind möglicherweise schon in den Brunnen gefallen. Die Codierung sollte als erstes festgelegt werden, noch bevor irgendeine DB-Operation stattfindet, sogar noch vor der Auswahl der Datenbank!  
          
        
        > > Ist die PHP-Datei als UTF-8 (ohne BOM!) gespeichert?  
        > Was heißt BOM?!  
          
        Was heißt Google? Was heißt [Wikipedia](http://en.wikipedia.org/wiki/Byte-order_mark)?  
          
        
        > > Ist der Webserver so konfiguriert, dass er als HTTP-Header UTF-8 angibt?  
        > Läuft nur lokal im Intranet auf einer Xampp-Version  
          
        Noch besser, dann hast du (bzw. jemand, den du direkt ansprechen kannst) ja unmittelbaren Zugriff auf die Serverkonfiguration.  
          
        Die Frage sollte eher sein: Liefert der Server das Dokument auch als UTF-8 aus? Das kann man ja in den heute üblichen Browsern über die Seiteninformationen abfragen, im FF auch bequem mit der LiveHTTP-Extension, auf die ich nicht mehr verzichten möchte.  
          
        
        > ###### ApacheFriends XAMPP (Basispaket) version 1.6.3a ######  
        >   + Apache 2.2.4  
        >   + MySQL 5.0.45  
        >   + PHP 5.2.3 + PHP 4.4.7 + PEAR  
        >   + PHP-Switch win32 1.0 (von Apachefriends, man nehme die "php-switch.bat")  
        >   + XAMPP Control Version 2.5 from www.nat32.com	  
        >   + XAMPP Security 1.0	  
        >   + SQLite 2.8.15  
        >   + OpenSSL 0.9.8e  
        >   + phpMyAdmin 2.10.3  
        >   + ADOdb 4.95  
        >   + Mercury Mail Transport System v4.01b  
        >   + FileZilla FTP Server 0.9.23  
        >   + Webalizer 2.01-10  
        >   + Zend Optimizer 3.3.0  
        >   + eAccelerator 0.9.5.1 für PHP 5.2.3 (auskommentiert php.ini)  
          
        Dass du hier die ganze serverseitige Softwareausstattung aufzählst, hilft nicht wirklich weiter.  
          
        So long,  
         Martin  
        
        -- 
        Ich liebe Politiker auf Wahlplakaten.  
        Sie sind tragbar, geräuschlos, und leicht wieder zu entfernen.  
          (Loriot, deutscher Satiriker)  
          
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. Hello,

          <?php

          $id = $_POST["id"];
            $abfrage1 = "SELECT * FROM garant WHERE id = '".$id."'";
            $ergebnis1 = mysql_query($abfrage1);
            mysql_query("SET NAMES 'utf-8'");

          
          >   
          > Zu diesen paar Zeilen habe ich schon drei böse Anmerkungen.  
          >  \* Dass du dir eine gefährliche Sicherheitslücke aufreißt, ist dir bewusst? Wenn dir für den URL-Parameter 'id' jemand etwas hinreichend gemeines unterschiebt, kann er mit deiner DB so ziemlich alles tun.  
          >  \* Das Umkopieren zur Verschleierung der Herkunft von Daten ist wohl auch nicht auszurotten.  
          >  \* Wenn du \*erst\* eine Abfrage absetzt, und danach die Codierung der Verbindung auf UTF-8 umstellst, ist das Kind möglicherweise schon in den Brunnen gefallen. Die Codierung sollte als erstes festgelegt werden, noch bevor irgendeine DB-Operation stattfindet, sogar noch vor der Auswahl der Datenbank!  
            
          Wenn man eine Abfrage durchführt, dann sollte man vorher auch sicher sein, dass eine Verbindung besteht. Leider kann man nicht sehen, ob die im Include auch geprüft wird...  
          Und nach der Abfrage sollte man fragen, ob diese auch geklappt hat, oder ob $ergebnis1 vielleicht den Typ boolean angenommen hat und den Wert false enthält.  
            
          Wenn das der Fall ist, könnte die MySQL-Fehlermeldung (mysql\_error()) von Nutzen sein.  
            
            
            
            
          Liebe Grüße aus dem schönen Oberharz  
            
            
          Tom vom Berg  
          ![](http://selfhtml.bitworks.de/Virencheck.gif)  
            
          
          -- 
           ☻\_  
          /▌  
          / \ Nur selber lernen macht schlau  
          <http://bergpost.annerschbarrich.de>
          
          1. Wenn man eine Abfrage durchführt, dann sollte man vorher auch sicher sein, dass eine Verbindung besteht. Leider kann man nicht sehen, ob die im Include auch geprüft wird...
            Und nach der Abfrage sollte man fragen, ob diese auch geklappt hat, oder ob $ergebnis1 vielleicht den Typ boolean angenommen hat und den Wert false enthält.

            Wenn das der Fall ist, könnte die MySQL-Fehlermeldung (mysql_error()) von Nutzen sein.

            Also aus meiner Seite ganz leihenhaft betrachtet: Warum soll ich das prüfen? Wenn die Formularfelder ausgefüllt sind MUSS ja eine Verbindung bestehen ;) oder sehe ich das falsch? Wenn ein Auto fährt MUSS auch Benzin/Diesel drin sein, ohne das ich in den Tank schauen mus.

            1. Hello,

              Wenn man eine Abfrage durchführt, dann sollte man vorher auch sicher sein, dass eine Verbindung besteht. Leider kann man nicht sehen, ob die im Include auch geprüft wird...
              Und nach der Abfrage sollte man fragen, ob diese auch geklappt hat, oder ob $ergebnis1 vielleicht den Typ boolean angenommen hat und den Wert false enthält.

              Wenn das der Fall ist, könnte die MySQL-Fehlermeldung (mysql_error()) von Nutzen sein.

              Also aus meiner Seite ganz leihenhaft betrachtet: Warum soll ich das prüfen? Wenn die Formularfelder ausgefüllt sind MUSS ja eine Verbindung bestehen ;)

              Gemeint ist eine Verbindung zur Datenbank, Du Nase!

              Und übrigens hast Du da eben tatsächlich noch einen Punkt angesprochen, der wichtig sein kann, wenn man aus einem PHP-Script mehrere Queries an eine Datenbank absetzt. Dann sollte man tatsächlich dafür sorgen, dass diese auch fertig abgehandelt werden, auch wenn der Client schon aufgegeben hat.

              Siehe: http://de2.php.net/manual/en/function.ignore-user-abort.php

              Wenn der User-Abort nämlich zwischen zwei Statements stattfindet, dann könnte es sein, das das zweite und alle weiteren gar nicht mehr ausgeführt werden.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
        2. » Zu diesen paar Zeilen habe ich schon drei böse Anmerkungen.

          OK, das aber nur lokal laufen wird, seh ich dem gelassen entgegen :)

          Ist der Webserver so konfiguriert, dass er als HTTP-Header UTF-8
          Die Frage sollte eher sein: Liefert der Server das Dokument auch als UTF-8 aus? Das kann man ja in den heute üblichen Browsern über die Seiteninformationen abfragen, im FF auch bequem mit der LiveHTTP-Extension, auf die ich nicht mehr verzichten möchte.

          Wo kann man das den konfigurieren?

          1. Mahlzeit hossi,

            » Zu diesen paar Zeilen habe ich schon drei böse Anmerkungen.

            OK, das aber nur lokal laufen wird, seh ich dem gelassen entgegen :)

            Das ist keine gute Idee. Wenn Du Dir eine derartig schlampige (ja, das ist sie wirklich!) Programmierung angewöhnst, dann ist es äußerst unwahrscheinlich, dass Du Deine Vorgehensweise dann, wenn es doch mal um öffentlich erreichbare Dinge geht, änderst. Außerdem weißt Du eigentlich nie, was aus Deinen "nur mal eben und nur für intern" entwickelten Anwendungen in Zukunft passiert.

            Mach es gleich richtig - dann wirst Du weniger Probleme haben. Dauerhaft.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  4. Besten Dank an dedel, für den entscheidenen Hinweis :) aber natürlich auch allen anderen, die sich damit beschäftigt haben :)

    Problem gelöst, und zwar folgendermasen:

      
    <?php  
      
    $link =  mysql_connect("localhost", "root","") or die  
        ("Keine Verbindung moeglich");  
      
    mysql_set_charset('utf8', $link);  
      
    mysql_select_db("mangel") or die  
        ("Die Datenbank existiert nicht.");  
      
      
    $root = "192.168.1.1/mangel/";  
      
    ?>  
    
    

    Habe in zeile 3 eine Variable geschrieben und dann in Zeile 6 in den Befehl mit rein, jetzt gehts :)

    1. Hallo,

      Problem gelöst, und zwar folgendermasen:

      <?php

      $link =  mysql_connect("localhost", "root","") or die
          ("Keine Verbindung moeglich");

      mysql_set_charset('utf8', $link);

        
      das habe ich dir ja [um kurz nach zwölf schon empfohlen](https://forum.selfhtml.org/?t=198046&m=1329078) ("böse Anmerkung" #3).  
        
      
      > Habe in zeile 3 eine Variable geschrieben und dann in Zeile 6 in den Befehl mit rein, jetzt gehts :)  
        
      Den Satz muss ich wohl nicht verstehen ...  
        
      Ciao,  
       Martin  
      
      -- 
      Lieber Blödeleien als blöde Laien.  
        
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      
    2. Hello,

      <?php

      $link =  mysql_connect("localhost", "root","") or die
          ("Keine Verbindung moeglich");

      mysql_set_charset('utf8', $link);

      mysql_select_db("mangel") or die
          ("Die Datenbank existiert nicht.");

      $root = "192.168.1.1/mangel/";

      ?>

      
      >   
      > Habe in zeile 3 eine Variable geschrieben und dann in Zeile 6 in den Befehl mit rein, jetzt gehts :)  
        
      Aber nur, wenn $link eine gültige Verbindungskennung enthält. ;-P  
        
      Das solltest Du direkt nach Zeile 3 prüfen!  
        
        
        
        
        
      Liebe Grüße aus dem schönen Oberharz  
        
        
      Tom vom Berg  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
       ☻\_  
      /▌  
      / \ Nur selber lernen macht schlau  
      <http://bergpost.annerschbarrich.de>