unicode von browserformular ueber PHP in mysql korrekt abspeichern



  • hi folks.

    ich haben ein webformular in das der nutzer einen text eingeben kann. dieser wird ganz unspektakulär per GET an PHP uebermittelt, dieses packt den string in das SQL Insert und schreibt es in eine DB-tabelle.

    hier kommen probleme auf wenn man sonderzeichen in das formular eintraegt. die eingabe von z.B. japanischen schriftzeichen wird nicht von firefox escaped, sondern "direkt" (ich nehme an UTF8-enkodiert) weitergeben. das erkennt man daran, dass die werte in dem GET-string (browseradresse) direkt lesbar sind, selbst japanische schriftzeichen.
    wenn diese dann in der datenbank (die komplett auf UTF8 eingestellt ist) stehen scheint er die einzelnen bytes der multi-byte-zeichen als einzelne zeichen anzeigen zu wollen, also schrott. ich kann per MySQL Query Browser die japanischen zeichen direkt eingeben, dann stimmt es.

    ich habe jetzt eine umgehungsloesung, ich zwinge den browser mit der angabe des accept-charset attributes die texte als ISO-8859-1 (aka Latin1) zu enkodieren. dass klappt, man erkennt im GET-string (browseradresse) dass er die texte enkodiert.
    problem an dieser umgehungsloesung: in der datenbank steht jetzt zwar der text, aber nicht-Latin1-zeichen sind im HTML-format "&#Nummer;" escaped. wenn man das spaeter wieder als HTML ausgibt kein problem, dann geht das. aber es waere mir doch deutlich lieber wenn in der datenbank korrektes UTF8 steht.

    meiner meinung nach liegt das problem entweder bei PHP oder bei MySQL, aber wenn ich in PHP den string in eine textdatei dumpe wird diese korrekt als UTF8 geschrieben.

    hat hier jemand eine helfende idee?

    thx in advance,

    ---loki



  • Die Kollation deiner Datenbanspalte ist auf utf8 gestellt?
    SET NAMES 'utf8' hast du als SQL Query nach dem Herstellen der Verbindung zum Daemon ausgeführt?



  • erstes ja, zweites nein.

    habe jetzt mal direkt nach dem mysql_connect folgendes gemacht:

    mysql_query("SET NAMES 'utf8'", $resource);
    

    interessanterweise wird jetzt gar nichts mehr in die datenbank geschrieben, aber weder PHP noch MySQL loggen irgendwelche fehler...



  • Dann kann man dir ohne Quellcode schlecht helfen, poste doch einmal den relevanten Code.



  • ich habe mal den code reduziert:

    formular.htm:

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>Beispiel</title>
      </head>
      <body>
        <h1>Enter some text</h1>
        <form action="insert.php" method="get" accept-charset="utf-8">
          <input type="text" name="text" />
          <input type="submit" value="Insert" />
        </form>
      </body>
    </html>
    

    insert.php:

    <?php
    
    $text = $_GET["text"];
    
    $resource = mysql_connect("localhost", "root", "loki");
    
    if(!$resource)
    {
        die("db connect error: " . mysql_error());
    }
    
    mysql_query("SET NAMES 'utf8'", $resource);
    
    mysql_select_db("test", $resource);
    
    mysql_query("INSERT INTO people (name) VALUES ('" . $text . "')", $resource);
    
    mysql_close($resource);
    
    ?>
    

    so sieht die tabelle in SQL aus:

    CREATE TABLE  `test`.`people` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(4096) CHARACTER SET latin1 DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    


  • ok, ich sehe schon, scheinbar ist die spalte das problem. wusste gar nicht dass jede spalte eine eigene collation haben kann. probiere das mal umzustellen.



  • ok, problem geloest, die spalte war tatsaechlich auf latin1... auch wenn ich keine ahnung habe wie es dazu gekommen ist.

    habe hier dummerweise gedacht dass die tabellen-collation automatisch fuer alle spalten gilt.

    danke fuer die hilfe 🙂


Anmelden zum Antworten