Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP MySqli und Umlaute

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP MySqli und Umlaute

    Hallo Zusammen,

    ich weißt, dass das Thema Umlaute schon oft diskutiert wurde. Leider bin ich mit meinem Problem trotzdem nicht weitergekommen...

    Ich habe eine kleine Datenbank aus der ich verschiedene Datensätze auslese und anzeigen lasse. Auf die Datenbank greife ich von zwei Rechnern zu auf denen ich lokale Server (MAMP) laufen hab. Leider sind die Versionen von MAMP auf den Rechnern unterschiedlich.

    Während ich mir auf meinem Rechner (php 5.3.6) die Datenbank über den Browser wunderbar anzeigen lassen kann, funktioniert das über den anderen Rechner (php 5.4.4) dahingehend nicht, dass alle Wörter, die Umlaute enthalten nicht angezeigt werden. Es werden keine Fehlermeldungen angezeigt.

    Hier hab ich mal den Code:

    PHP-Code:
    <?php
    //Verbindung zu Datenbank wird hergestellt

    require_once "db_verbindung.php";

    //Dateipfad der aktuellen php-datei wird ermittelt und variablen zugewiesen
    $host htmlspecialchars($_SERVER["HTTP_HOST"]);
    $uri rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
    $img_pencil "<img src='img/pencil.png' width='20' height='20' alt='bearbeiten' titel='bearbeiten' />";
    $img_delete "<img src='img/delete.png' width='20' height='20' alt='löschen' titel='löschen' />";

    //Das Array mit den erlaubten Sortierkriterien wird erstellt
    $ar_sort = array("bezeichnung""geschoss""raum""ort""beschreibung");

    //Es wird überprüft ob ein Sortierkriterium übergeben wurde, ob es ein String ist und ob es im oben definierten Array enthalten ist
    if(isset($_GET["sort_krit"]) /*&& is_string($_GET["sort_krit"])*//* && $ar_sort[$sort_krit]*/) {
        
    $sort_krit $_GET["sort_krit"];
        
    } else {
        
    $sort_krit "bezeichnung";
    }

    ?>
    <!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=-iso-8859-1" />
         <title>Datenbank anzeigen</title>
         <link rel="stylesheet" type="text/css" href="suchen.css">        
    </head>
    <body>

    <table id="Hintergrund" align="center">
    <tr><td height="50px"></td></tr>
    <tr align="center"><td align="center">

    <ul id="Navigation">
      <li><a href="startseite.php">Startseite</a></li>
      <li><span>Datenbank anzeigen</span></li>
      <li><a href="suchmaske.php">Suchen</a></li>
      <li><a href="neuer_eintrag.php">Neuer Gegenstand</a></li>
      <li><a href="tabellen_verwalten.php">Tabelle verwalten</a></li>
    </ul>

    </td></tr>
    <tr><td height="20px"></td></tr>

    <tr align="center">
    <td align="center">

    <?php

    if($stmt $mysqli->prepare("SELECT gegenstand_id, bezeichnung, geschoss, raum, ort, beschreibung FROM tbl_gegenstaende, tbl_geschoss, tbl_raum WHERE tbl_gegenstaende.geschoss_id = tbl_geschoss.geschoss_id AND tbl_gegenstaende.raum_id = tbl_raum.raum_id ORDER BY " $sort_krit)) {
        
    $stmt->execute();
        
    $stmt->bind_result($gegenstand_id$bezeichnung$geschoss$raum$ort$beschreibung);
        echo 
    "<table id='tbl_erg' align='center'>\n
        <tr>\n
        <th>Bezeichnung <a class='sortlink' href='db_anzeigen.php?sort_krit=bezeichnung ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=bezeichnung DESC'>&dArr; </a>  </th>\n
        <th width='100px'>Geschoss <a class='sortlink' href='db_anzeigen.php?sort_krit=geschoss ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=geschoss DESC'>&dArr; </a>  </th>\n
        <th>Raum <a class='sortlink' href='db_anzeigen.php?sort_krit=raum ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=raum DESC'>&dArr; </a>  </th>\n
        <th>Ort <a class='sortlink' href='db_anzeigen.php?sort_krit=ort ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=ort DESC'>&dArr; </a>  </th>\n
        <th>Beschreibung <a class='sortlink' href='db_anzeigen.php?sort_krit=beschreibung ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=beschreibung DESC'>&dArr; </a>  </th>\n
        <th colspan='2'>Bearbeitung</th>\n
        </tr>"
    ;
        while(
    $stmt->fetch()) {
            echo 
    "<tr>\n\t<td>"
            
    htmlspecialchars($bezeichnung)
            . 
    "</td>\n\t<td>"
            
    htmlspecialchars($geschoss)
            . 
    "</td>\n\t<td>"
            
    htmlspecialchars($raum
            . 
    "</td>\n\t<td>"
            
    htmlspecialchars($ort)
            . 
    "</td>\n\t<td>"
            
    htmlspecialchars($beschreibung)
            . 
    "</td>\n\t<td width='50px'>"
            
    "<a href='gegenstand_bearbeiten.php?gegenstand_id=" . (int)$gegenstand_id "'>"$img_pencil "</a> " 
            
    "</td>\n\t<td width='50px'>"
            
    "<a href='gegenstand_loeschen.php?gegenstand_id=" . (int)$gegenstand_id "'>"$img_delete "</a> "
            
    "</td>\n</tr>\n";
         }
         echo 
    "</table>";
         
    $stmt->close();
         
    } else {
        echo 
    "Die Datenbankabfrage konnte nicht durchgeführt werden. Bitte laden Sie die Seite erneut.";
    }

    $mysqli->close();
    ?> 

    <tr><td height="50px"></td></tr>
    </table>
    </body>
    </html>
    Ich liefere gerne noch weitere Infos nach!

    Bin für jeden Ansatz dankbar!

    Danke und Gruß

  • #2
    Eins
    PHP-Code:
    require_once "db_verbindung.php"
    Hast du dort PHP gezwungen, ein bestimmtes Charset zu verwenden?
    Wenn nein, teste:

    PHP-Code:
     mysqli_set_charset("UTF8"$connection); 
    Zwei
    Default Charset in PHP.ini gesetzt?
    Wenn nein:
    default_charset = "utf-8"
    Drei
    Überprüfe ob der Content-Type, den du im Browser vom Webserver erhälst, dem erwarteten entspricht.


    (In den Beispielen gehe ich davon aus, dass Du UTF8 verwendest. Falls nicht, entsprechend anpassen.)

    Kommentar


    • #3
      Hallo,

      zunächst danke für die schnelle Rückmeldung!!!

      zu Eins:

      Hab hier kein Charset definiert:

      PHP-Code:
      <?php
      $mysqli 
      = new mysqli("localhost""root""root""db_haushalt");
      if (
      $mysqli->connect_error) {
        echo 
      "Fehler bei der Verbindung: " mysqli_connect_error();
        exit();
      }
      ?>
      Wo soll ich diese Zeile einfügen? und was soll "$connection" enthalten. Ich hab mit dieser Funktion auch schon herumprobiert, z.B. direkt bei der Datenbankabfrage, hat aber net funktioniert...

      zu Zwei:

      Das hab ich auch schon getestet, aktuell hab ich allerdiengs das Charset "iso-8859-1" als default in der php.ini stehen.
      Hierzu noch ne Frage: Ist das normal, dass wenn ich die php-info aufrufe bei Default_charset sowohl bei "local value" und "Master value" "no value" steht, obwohl ich die Definition in der php.ini gemacht hab?

      zu Drei:

      hier schaue ich gerade nach...

      Danke und Gruß

      Kommentar


      • #4
        Eins
        PHP-Code:
        <?php 
        $mysqli 
        = new mysqli("localhost""root""root""db_haushalt"); 
        if (
        $mysqli->connect_error) { 
          echo 
        "Fehler bei der Verbindung: " mysqli_connect_error(); 
          exit(); 


        if (!
        mysqli_set_charset($mysqli"utf8")) {
            
        printf("Error loading character set utf8: %s\n"mysqli_error($mysqli));
        } else {
            
        printf("Current character set: %s\n"mysqli_character_set_name($mysqli));
        }
        ?>
        Zwei
        default_charset = "utf-8"
        Das sollte in deine php.ini.
        Bitte google wie du sie findest bei deinem MAMP Stack.

        Überprüfe ob deine beiden MAMP Stacks das gleiche Default_Charset in der php.ini haben.

        Drei
        Es ist nicht normal, nur wenn es auskommentiert ist (Erkennst du daran, dass ein Semikolon davor steht ";")

        Deine info.php sollte das Folgende ausgeben:
        PHP-Code:
        Content-Type    text/htmlcharset=utf-8
        ...
        default_charset    utf-8    utf-

        INFO:
        Wenn deine DB als Charset latin1/iso-8859-1 hat, musst so die Tables der DB aus der du die Daten holst, entweder auf UTF8 umstellen oder scriptseitig so behandeln wie die Daten vorliegen. Sprich wenn iso-8859-1 dann auch im Script iso-8859-1. Schaue dir deine DB an.
        Ich tippe darauf, dass deine php.ini der zwei MAMP Stacks ein unterschiedliches Charset haben.
        Vergleiche beide php.ini der zwei MAMP Stacks.

        Kommentar


        • #5
          Zu Eins:

          default_charset habe ich in der php.ini geändert.
          Ohne deinen Code werden die Umlaute im Browser des Rechners mit php 5.3.6 durch ein Fragezeichen dargestellt. Also hier hat die Anzeige vorher auch schon funktioniert.

          Mit deinem Code wird dann an besagtem Rechner alles korrekt dargestellt und er gibt als aktuelles charset "utf-8" an.
          Das er ohne deinen Code Fragezeichen für Umlaute schreibt und mit deinem Code nicht verstehe ich nicht so ganz, da In deinem Code ja kein charset definiert wird oder so...

          An dem Rechner mit php 5.4.4 werden wörter die umlaute enthalten immernoch nicht angezeigt.

          Zu Zwei:

          siehe "zu Eins"

          Zu Drei:

          Die php-info gibt jetzt an beiden Rechnern jeweils "utf-8" beim defautlt_charset an. Beim Content-Type wird allerdings "iso-8859-1" angegeben (also im Quelltext der aufgerufenen Seite).

          In der Datenbank habe ich tatsächlich die Koalition, wie es dort heißt, "latin1_german1_ci" ausgewählt. Sollte ich hier dann "utf8_unicode_ci" einstellen?

          Danke!

          Kommentar


          • #6
            Gut gemacht.

            Stand:
            5.3.6 -> funktioniert jetzt ohne Fragezeichen.
            5.4.4 -> keine Ausgabe

            An dem Rechner mit php 5.4.4 werden wörter die umlaute enthalten immernoch nicht angezeigt.
            Werden NUR die Wörter mit Umlauten nicht angezeigt oder NUR der Umlaut selbst oder ALLE 5 Variablen (bezeichnung, geschoss, raum..)?

            PHP-Code:
               <meta http-equiv="Content-Type" content="text/html; charset=-iso-8859-1" /> 
            Dort ist ein Schreibfehler im charset. (Minuszeichen vor iso-8859-1)
            Ändere in UTF8, da wir jetzt alles auf UTF8 umstellen:
            PHP-Code:
            <meta http-equiv="content-type" content="text/html; charset=UTF-8"
            Teste folgende Änderung bei 5.4.4 im Script:
            PHP-Code:
            <?php 
            //Verbindung zu Datenbank wird hergestellt 

            require_once "db_verbindung.php"

            //Dateipfad der aktuellen php-datei wird ermittelt und variablen zugewiesen 
            $host htmlspecialchars($_SERVER["HTTP_HOST"]); 
            $uri rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\"); 
            $img_pencil "<img src='img/pencil.png' width='20' height='20' alt='bearbeiten' titel='bearbeiten' />"
            $img_delete "<img src='img/delete.png' width='20' height='20' alt='löschen' titel='löschen' />"

            //Das Array mit den erlaubten Sortierkriterien wird erstellt 
            $ar_sort = array("bezeichnung""geschoss""raum""ort""beschreibung"); 

            //Es wird überprüft ob ein Sortierkriterium übergeben wurde, ob es ein String ist und ob es im oben definierten Array enthalten ist 
            if(isset($_GET["sort_krit"]) /*&& is_string($_GET["sort_krit"])*//* && $ar_sort[$sort_krit]*/) { 
                
            $sort_krit $_GET["sort_krit"]; 
                 
            } else { 
                
            $sort_krit "bezeichnung"


            ?> 
            <!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=-iso-8859-1" /> 
                 <title>Datenbank anzeigen</title> 
                 <link rel="stylesheet" type="text/css" href="suchen.css">         
            </head> 
            <body> 

            <table id="Hintergrund" align="center"> 
            <tr><td height="50px"></td></tr> 
            <tr align="center"><td align="center"> 

            <ul id="Navigation"> 
              <li><a href="startseite.php">Startseite</a></li> 
              <li><span>Datenbank anzeigen</span></li> 
              <li><a href="suchmaske.php">Suchen</a></li> 
              <li><a href="neuer_eintrag.php">Neuer Gegenstand</a></li> 
              <li><a href="tabellen_verwalten.php">Tabelle verwalten</a></li> 
            </ul> 

            </td></tr> 
            <tr><td height="20px"></td></tr> 

            <tr align="center"> 
            <td align="center"> 

            <?php 

            if($stmt $mysqli->prepare("SELECT gegenstand_id, bezeichnung FROM tbl_gegenstaende, tbl_geschoss, tbl_raum WHERE tbl_gegenstaende.geschoss_id = tbl_geschoss.geschoss_id AND tbl_gegenstaende.raum_id = tbl_raum.raum_id ORDER BY " $sort_krit)) { 
                
            $stmt->execute(); 
                
            $stmt->bind_result($gegenstand_id$bezeichnung); 
                echo 
            "<table id='tbl_erg' align='center'>\n 
                <tr>\n 
                <th>Bezeichnung <a class='sortlink' href='db_anzeigen.php?sort_krit=bezeichnung ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=bezeichnung DESC'>&dArr; </a>  </th>\n 
                <th width='100px'>Geschoss <a class='sortlink' href='db_anzeigen.php?sort_krit=geschoss ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=geschoss DESC'>&dArr; </a>  </th>\n 
                <th>Raum <a class='sortlink' href='db_anzeigen.php?sort_krit=raum ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=raum DESC'>&dArr; </a>  </th>\n 
                <th>Ort <a class='sortlink' href='db_anzeigen.php?sort_krit=ort ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=ort DESC'>&dArr; </a>  </th>\n 
                <th>Beschreibung <a class='sortlink' href='db_anzeigen.php?sort_krit=beschreibung ASC'>&uArr; </a> <a class='sortlink' href='db_anzeigen.php?sort_krit=beschreibung DESC'>&dArr; </a>  </th>\n 
                <th colspan='2'>Bearbeitung</th>\n 
                </tr>"


            /* fetch values */
                
            while ($stmt->fetch()) {
                    
            printf("%s %s\n"$gegenstand_id$bezeichnung);
                }
            exit();
            ?>
            Werden in diesem Script die Wörter mit Umlaute angezeigt?

            In der Datenbank habe ich tatsächlich die Koalition, wie es dort heißt, "latin1_german1_ci" ausgewählt. Sollte ich hier dann "utf8_unicode_ci" einstellen?
            Teste, dass ist doch das tolle am Programmieren, man kann Dinge verändern ohne viel Aufwand und sie ggf. rückgängig machen.
            Es ist sinnvoll, da wir auf jeder Ebene mit dem selben Charset arbeiten möchten.

            Habe Spaß am testen!

            Kommentar


            • #7
              ja, das ist das tolle am programmieren! aber nur wenns am ende funktioniert!

              ich muss jetzt leider mal weg...

              hab allerdings was anderes festgestellt. Ich greife mit beiden Rechnern über Dropbox auf die relevanten Daten zu. Und an dem Rechner, an dem es noch nicht funktioniert stimmt etwas mit der synchronisation net...

              Ich teste nachher weiter und melde mich dann wieder!

              Aber soviel vorab: Es wird immer das gesamte Wort, das einen Umlaut enthält, nicht angezeigt. Das ist ja das seltsame. Deshalb vermute ich, dass es irgendwas mit der Datenbank zu tun hat...

              Später wird weiter getestet!

              Danke Dir auf jeden Fall für deine Hilfe!!!

              Kommentar


              • #8
                So, hab festgestellt, dass ich die Dateien nicht richtig synchronisiert habe.

                Nachdem ich das korrigiert hab, hab ich herausgefunden, dass dein Code:

                PHP-Code:
                <?php 
                $mysqli 
                = new mysqli("localhost""root""root""db_haushalt"); 
                if (
                $mysqli->connect_error) { 
                  echo 
                "Fehler bei der Verbindung: " mysqli_connect_error(); 
                  exit(); 


                if (!
                mysqli_set_charset($mysqli"utf8")) {
                    
                printf("Error loading character set utf8: %s\n"mysqli_error($mysqli));
                } else {
                    
                printf("Current character set: %s\n"mysqli_character_set_name($mysqli));
                }
                ?>
                das Problem behoben hat. Auf beiden Rechnern wird dann alles korrekt angezeigt.

                Nur frage ich mich, warum? Sobald ich die zweite If-Klausel entferne, fehlen auf dem einen Rechner wieder alle Wörter die einen Umlaut enthalten. Auf dem anderen werden Fragezeichen anstatt der Umlaute dargestellt. Wenn die zweite If-Klausel im Code steht, gibt er im Browser "Current character set: utf8" aus. Das bedeutet doch, dass das charset des Objekts "$mysqli" richtigerweise auf "utf8" eingesetllt ist. Aber ich verstehe einfach nicht warums ohne die zweite If-Klausel nicht funktioniert, da hier doch nirgends das charset festgelegt wird?!

                Warum wollen wir eigentlich alles auf UTF-8 umstellen?

                Danke!

                Kommentar


                • #9
                  Das zweite if kannst du schon entfernen, aber der Befehl des if muss trotzdem bleiben:
                  PHP-Code:
                  mysqli_set_charset($mysqli"utf8"); 
                  Du musst der Datenbank ja sagen, in welchem Zeichensatz die Verbindung sein soll.

                  Warum wollen wir eigentlich alles auf UTF-8 umstellen?
                  Warum sollten wir nicht? Damit gibts keine Probleme mehr mit irgendwelchen anderen Zeichen. Du kannst fast alle Zeichen fast aller Sprachen und hunderte andere Symbole darstellen, ohne irgendwelche Basteleien mit Entitäten oder sowas.
                  Beispiele: ←↓→↑Øı↑¥Ŧ€Ł±⅞⅝⅜¤£✂✉
                  Der Winter kommt, dann kann man wieder bauen
                  http://de.wikipedia.org/wiki/Liste_d...odebl%C3%B6cke
                  Windows Server gehören NICHT ins Internet!

                  Dildo? Dildo!

                  Kommentar


                  • #10
                    Ok, dann hab ich da was Grundsätzliches nicht verstanden. Ich dachte bei der zweiten If-Klausel wird nur überprüft, ob das Charset des Objekts "utf8" ist. Dass da ein Befehl im Bezug auf die Verbindung ausgeführt wird, wusste ich nicht.

                    Jetzt funktionierts auf jeden Fall!!

                    Danke für die Hilfe!!

                    Kommentar


                    • #11
                      Es wird der Befehl ausgeführt und direkt danach die Rückgabe durch das if geprüft. Damit spart man sich eine Variable.

                      Man hätte es auch so schreiben können:
                      PHP-Code:
                      $charset_erfolg mysqli_set_charset($mysqli"utf8");
                      if (
                      $charset_erfolg)
                      ...
                      else
                      ... 
                      Windows Server gehören NICHT ins Internet!

                      Dildo? Dildo!

                      Kommentar

                      Lädt...
                      X