PHP 5.6 Umlaut Problem

Da PHP 5.5 nicht mehr von der PHP Community unterstützt wird, war eine Umstellung einiger eigener Webprojekte auf PHP 5.6 notwendig. Ohne weitere Anpassungen vorzunehmen, lief PHP 5.6 bereits nahezu reibungslos. Nur die Darstellung von Umlauten, welche aus einer MySQL 5.5 Datenbank stammen, war fehlerhaft: Statt ä,ö oder ü wurden kryptische Zeichen angezeigt. Nach einer längeren Recherche im Internet bin ich auf eine Lösung gestoßen, welche in meinem Fall funktioniert hat.

<!DOCTYPE HTML>
<html>
    <head>
      <title>PHP&MySQL Umlaute</title>
      <meta charset="UTF-8">
    </head>
    <body>
        <?php 
            $verbindung = mysqli_connect('127.0.0.1', 'user1', '1234', 'datenbank1') or die("Verbindung zur Datenbank konnte nicht hergestellt werden.");
            
            //Behebt Umlautproblem
            mysqli_query($verbindung, "SET NAMES 'utf8'");
            
            //Nun liefern alle Abfragen die Umlaute richtig zurück, bis die Verbindung zur Datenbank geschlossen wird.
            $abfrage="SELECT * FROM myTable";
            $ergebnis=mysqli_query($verbindung, $abfrage);
            while($zeile = $ergebnis->fetch_assoc())
            {
                echo $zeile['spalte1'] . '<br />';
            }
            mysqli_close($verbindung);
        ?>
    <body/>
</html>

Die Ursache für das Problem war, dass das default_charset in der Konfigurationsdatei php.ini in PHP 5.6 abgeändert wurde: von undefiniert auf UTF-8. Ich habe zuerst versucht, die MySQL Datenbank mit globalen Optionen so einzustellen, dass ich die Ausgabe immer in UTF-8 bekomme. Das hat aber leider nicht geklappt. Die einzige Lösung, die bei mir funktioniert hat, ist die oben gezeigte: Direkt nach dem Verbindungsaufbau zur Datenbank wird eine Abfrage an die Datenbank gesendet, welche die Verbindung auf UTF-8 konfiguriert. Solange die Verbindung besteht, liefern nun alle Abfragen die Ergebnisse in UTF-8 zurück und können fortan durch PHP richtig ausgegeben werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.