UTF-8, header() und MySQL

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

  • UTF-8, header() und MySQL

    Ich habe ein Problem mit UTF-8. Das Skript unten soll dieses Problem deutlich machen.
    ich möchte Formulareingaben in eine MySQL-Datenbank eintragen. Wenn ich das Skript mit header("content-type: text/html; charset=utf-8"); beginne, werden nicht-ISO-8859-1-Zeichen verschlüsselt, so dass diese den Platz von zwei Zeichen einnehmen (z.B. wird aus Jürgen Müller Jürgen Müller). Abgesehen davon, dass das zu unleserlichen Feldinhalten in meiner MySQL-Datenbank führt (wenn ich die Inhalte z.B. über phpMyAdmin bearbeiten möchte), sprengt dieses Verhalten auch mein Größenlimit für die Tabellenspalte. Im Beispiel ist die Spalte für name auf 30 Zeichen begrenzt. Werden 30 nicht-ISO-8859-1-Zeichen in das Formular eingegeben, werden die letzten 15 abgeschnitten, da ja jedes Zeichen nun den doppelten Platzbedarf hat. Wenn ich header("content-type: text/html; charset=utf-8"); weglasse, tritt dieses Verhalten nicht auf, aber muss ich den Header nicht immer schicken?

    2. Frage: Ist es richtig, dass man bei Dokumenten in UTF-8 nicht-ISO-8859-1-Zeichen nicht mehr durch HTML-Entities ersetzen muss?
    Vielen Dank!

    Code:
    <?php
      header("content-type: text/html; charset=utf-8");
      $db = mysql_connect("localhost", "web007", "xyz");
      mysql_select_db("usr_web007_1", $db);
      echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>";
      echo "<html xmlns='http://www.w3.org/1999/xhtml' lang='de' xml:lang='de'>";
      echo "<head><title></title><meta http-equiv='content-type' content='text/html; charset=utf-8' /></head><body>";
      if ($_POST['senden']) {
        $name = trim($_POST['name']);
        if (!$name) $error[0] = " <span style='color:red'>Es wurde kein Name eingegeben!</span>";
        if (!$error) {
          $sql = "CREATE TABLE IF NOT EXISTS namen (
            id SERIAL,
            name VARCHAR(30)
          ) TYPE = MYISAM CHARACTER SET utf8";
          mysql_query($sql,$db);
          $sql = "INSERT INTO namen (name) VALUES ('$name')";
          mysql_query($sql,$db);
          echo "<p>Der Name ".stripslashes($name)." wurde eingetragen.</p>";
          //echo "<p>Der Name ".stripslashes(htmlentities($name, ENT_QUOTES, UTF))." wurde eingetragen.</p>";
          $sql = "SELECT * FROM namen WHERE id = ".mysql_insert_id();
          $res = mysql_query($sql,$db);
          $ds = mysql_fetch_array($res);
          echo "<p>Beweis: ".$ds['name']."</p>";
          //echo "<p>Beweis: ".htmlentities($ds['name'], ENT_QUOTES, UTF)."</p>";
          echo "<p><a href='test.php'>Weiterer Eintrag</a></p>";
        }
      }
      if (!$_POST['senden'] || $error) {
        echo "<form action='test.php' method='post'><div>";
        echo "<input type='text' maxlength='30' name='name' />".$error[0];
        echo "<br /><input type='submit' name='senden' value='Namen eintragen' /></div></form>";
      }
      echo "</body></html>";
    ?>
    http://www.zentralplan.de/

  • #2
    Du fügst ISO in die DB ein, und wunderst dich das es dann kaputt ist?
    Schalte mal deine DB Verbindung auf utf-8 um, nach dem connect ein

    (aus meinen Scripten)

    PHP-Code:
            // auf UTF-8 schalten
            
    if( defined'_FRM_MYSQL_UTF8_' ) ) {
                
    $this->query'    SET CHARACTER_SET_CLIENT = utf8' );
                
    $this->query'    SET CHARACTER_SET_RESULTS = utf8' );
                
    $this->query'    SET COLLATION_CONNECTION = utf8_unicode_ci' );
                
    $this->query'    SET NAMES utf8' );
            } 
    zu 2: Ja
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Also mein Prolog sieht jetzt so aus:

      PHP-Code:
        header("content-type: text/html; charset=utf-8");
        
      $db mysql_connect("localhost""web007""xyz");
        if( 
      defined'_FRM_MYSQL_UTF8_' ) ) {
          
      $this->query'    SET CHARACTER_SET_CLIENT = utf8' );
          
      $this->query'    SET CHARACTER_SET_RESULTS = utf8' );
          
      $this->query'    SET COLLATION_CONNECTION = utf8_unicode_ci' );
          
      $this->query'    SET NAMES utf8' );
        }
        
      mysql_select_db("usr_web007_1"$db); 
      Aber trotzdem bleibt es beim Fehler. Ich muss allerdings auch zugeben, dass ich überhaupt keinen Plan habe, was dein Skript bewirkt, vielleicht hab ich's nur falsch platziert...?
      http://www.zentralplan.de/

      Kommentar


      • #4
        Hi,

        Du hast aber schon gesehen, dass TBT im Gegensatz zu Dir irgendeine Datenbank-Klasse benutzt?
        Er wollte Dir damit nur die Queries zeigen, die er nach dem connect absetzt. Copy&Paste ist hier nicht angesagt!

        LG

        Kommentar


        • #5
          Abgesehen davon ist das doppelt gemoppelt~
          Die Kollation hat überhaupt keine Bewandtnis, kann man also weg lassen, und alles andere wird durch den SET NAMES-Query erledigt, d.h. statt allen vier Queries reicht auch nur der letzte

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            ich freu mich ja schon, dass es ein paar leute mit ahnung von diesem thema gibt. leider verstehe ich nur bahnhof. macht das hier mehr sinn:

            PHP-Code:
            header("content-type: text/html; charset=utf-8");
            $db mysql_connect("localhost""web007""xyz");
            if (
            defined('_FRM_MYSQL_UTF8_')) {
              
            $sql "SET NAMES utf8";
              
            mysql_query($sql,$db);

            http://www.zentralplan.de/

            Kommentar


            • #7
              Hi,
              macht das hier mehr sinn:
              Tut sich denn was? Vermutlich nicht, es sei denn, Du hast eine Konstante _FRM_MYSQL_UTF8_ vorher definiert. Nimm die Bedingung raus.
              leider verstehe ich nur bahnhof.
              Dann fang mal mit Tutorials an, z.B. bei Peter oder bei Quakenet.

              LG

              Kommentar


              • #8
                ok, also mit

                PHP-Code:
                header("content-type: text/html; charset=utf-8");
                $db mysql_connect("localhost""web007""xyz");
                $sql "SET NAMES utf8";
                mysql_query($sql,$db); 
                klappts jetzt. vielen dank!

                was hat es denn mit
                PHP-Code:
                if (defined('_FRM_MYSQL_UTF8_')) 
                auf sich?
                http://www.zentralplan.de/

                Kommentar


                • #9
                  if (defined(...))

                  Kommentar


                  • #10
                    ja, vielen dank!

                    noch eine frage: ist in html-formularen die angabe von
                    Code:
                    accept-charset='utf-8'
                    notwendig? ich habe das lokal und auf einem entfernten server ausprobiert und konnte keinen unterschied feststellen, aber vielleicht ist das user-abhängig...
                    http://www.zentralplan.de/

                    Kommentar


                    • #11
                      Original geschrieben von hamoda108
                      ist in html-formularen die angabe von accept-charset='utf-8' notwendig? ich habe das lokal und auf einem entfernten server ausprobiert und konnte keinen unterschied feststellen, aber vielleicht ist das user-abhängig...
                      Dass es allerhöchstens client-abhängig sein kann, sollte klar sein.

                      Und ja, es ist empfehlenswert, diese Angabe zu machen. Einige ältere Browser schicken sonst teilweise Murks.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        merci nach düdo

                        jetzt habe ich das problem, dass der entfernte server, auf dem das projekt liegt, nur die mysql version 4.1 installiert hat und die leute dort nicht wissen, wann sie updaten. also kein SET NAMES. gibt es eine alternative, die auch mit einer alten mysql version funktioniert?
                        Zuletzt geändert von hamoda108; 29.06.2007, 13:01.
                        http://www.zentralplan.de/

                        Kommentar


                        • #13
                          Wurde SET NAMES nicht mit 4.1 eingeführt? Hast du es einfach mal versucht?

                          Letzte Alternative: Providerwechsel.

                          Kommentar


                          • #14
                            Ja, hab's versucht, dadurch habe ich ja bemerkt, dass SET NAMES nicht funktioniert. Der Hoster hat mir das auch bestätigt. Providerwechsel steht wohl wirklich an. Verstehe nicht, wieso die nicht einfach updaten, wenn MySQL 5 schon 1,5 Jahre draußen ist. Kann doch kein so großer Aufwand sein... Kann mir aber auch irgendwie nicht vorstellen, dass UTF-8 Unterstützung erst seit MySQL 5 möglich ist. Hat da nicht jemand Erfahrungen mit älteren Versionen?

                            Stelle grade fest, dass php-resource.de seine Seiten in ISO-8859-1 verschickt und trotzdem keine HTML-Entites verwendet. Bin ja kein Apple-User, aber sollten die Sonderzeichen dort nicht falsch dargestellt werden? Oder haben die Betreiber dieser Seite einen Weg gefunden, Unicode-Zeichen OS-spezifisch auszugeben?
                            http://www.zentralplan.de/

                            Kommentar


                            • #15
                              Original geschrieben von hamoda108
                              Ja, hab's versucht, dadurch habe ich ja bemerkt, dass SET NAMES nicht funktioniert. Der Hoster hat mir das auch bestätigt.
                              Ich habe nachgesehen. Die Doku zu MySQL <= 4.1 erklärt die Verwendung von SET NAMES. Es ist also kein Versionsproblem, dein Provider muß nicht updaten sondern ggf. seine bzw. deine Konfiguration anpassen.

                              Kommentar

                              Lädt...
                              X