Umlauteproblem bei Formulardaten -> MS SQL

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

  • Umlauteproblem bei Formulardaten -> MS SQL

    Hallo zusammen,

    ich hoffe ich habe das richtige Unterforum erwischt, sollte dies nicht der Fall sein wäre ich für ein Verschieben dankbar.

    Ich habe folgendes Problem bei einer Projektumsetzung:

    1) Umgebung
    - PHP 5.2.10
    - MS SQL Datenbank
    - ODBC Anbindung

    2) Vorhaben
    Es existiert bereitseine MS SQL-Datenbank welche Benutzerdaten beinhaltet. Nun soll mittels PHP neue Benutzer angelegt, sowie bestehende Benutzer verändert werden können. Grundprinzip des ganzen läuft soweit.

    3) Problem
    - Nach dem ersten Auslesen von Benutzerdaten fiel mir auf, das Personen die neu angelegt werden ohne Umlaute eingetragen werden. Bspw. wurde aus 'Hans Müller' in der Datenbank 'Hans Mller'.
    - Um dieses Problem zu umgehen habe ich im umgebenden HTML-Bereich den charset auf UTF-8 gestellt was soweit auch funktionierte - alle Personen wurden ordnungsgemäß mit Umlauten eingetragen.
    - Nun wurden aber die Umlaute mit UTF-8 vom Brwoser bei des Ausgabe nicht korrekt dargestellt, sondern lieferten nur Hyroglyphen. Dies wäre anfürsich nicht so schlimm, ich könnte ja notfalls die Seiten, welche Inhalte aus der Datenbank anzeigen, einfach auf charset ISO-8859-1 stellen. Jedoch stellt sich das ganze als Problem dar, wenn bereits erstellte Datensätze geändert werden sollen: Hier werden Daten aus der DB gelesen und in Formularfelder voreingetragen in denen man beliebige Änderungen vornehmen kann. Da aber das speichern nur in UTF-8 funktioniert, läd es mir den Namen 'Hans Müller' als 'Hans M[]ller' in das Formularfeld.


    Wie kann ich diesem ganzen Charset-Chaos entkommen, ohne am Ende eine zusammengefrickelte Lösung zu haben?

    Freue mich auf eine Antwort
    Hannes

  • #2
    verwende überall die selbe codierung!

    1) Sind die Daten in der DB alle im selben Encoding?
    2) Prüfe ob die Verbindung zur Datenbank, auch hier über alle selbes Encoding?
    3) sind die "html-seiten" ebenfalls im selben Encoding?

    Danach sollte es klappen. Irgendwo scheinst du allerdings noch den Wurm drin zu haben.

    Kommentar


    • #3
      Ok, ich werde die Schritte durchgehen. Leider habe ich jedoch keinen direkten Zugriff auf den Rechner mit der Originalen DB, sondern nur eine lokale Testdatenbank auf einem SQL Server 2005. Kann ich das encoding eines Datensatzes aus der ferne per SQL-Statement auslesen? (Die Testdatenbank mit fiktiven Daten scheint Latin1_General_CI_AS zu sein).

      Kann ich bei einer ODBC-Verbindung das encoding einstellen? (Für JDBC geht dies ja über die Connection URL)

      Die HTML-Seiten in denen der PHP-Code eingebettet ist würde ich ja gerne im selben encoding haben, momentan wechselt es zwischen UTF-8 für Datenbankeingaben und ISO-8859-1 für die Anzeige von Datensätzen.

      Kommentar


      • #4
        hm Latin1 General passt eigentlich ganz gut zu 8859-1 (Western europe ) ,

        persönlich würde ich das php auf 8859-1 stellen, die Datenbank auf UTF-8 (funzt bei mir sowohl für Ausgabe als auch Eingabe, läuft nämlich über das gleiche Script) ..- jedenfalls hab ich da bisher keine Probleme bei mir festgestellt - was dir dann die "kleine" Arbeit überlässt, die in der Zwischenzeit fehlerhaft eingetragenen Daten händisch zu ändern .. je nachdem wie viele das sind, ist das eigentlich ne überschaubare Arbeit. wenn abgesichert ist, dass nicht dauernd neue dazukommen

        da ich aber mit ner MySQL zusammenarbeite , weiß ich leider nicht, wie du deine ODBC Connection entsprechend umstellst ..
        Zuletzt geändert von eagle275; 01.09.2010, 20:48.
        [font=Verdana]
        Wer LESEN kann, ist klar im Vorteil!
        [/font]

        Kommentar


        • #5
          Zitat von eagle275 Beitrag anzeigen
          hm Latin1 General passt eigentlich ganz gut zu 8859-1
          Das liegt vermutlich daran, dass Latin-1 und ISO 8859-1 genau dasselbe ist.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            recht hast du - ich hatte das anfangs auch in meinem Post stehen, fand aber dann die Info nicht mehr soo wichtig und hab sie rausgenommen ... es hilft ihm ja wenig wenn die beiden dasselbe sind - und trotzdem in seinem Browser die Umlaute nicht korrekt dargestellt werden
            [font=Verdana]
            Wer LESEN kann, ist klar im Vorteil!
            [/font]

            Kommentar


            • #7
              Also bisher umfasst die Datenbank ca. 4000 Datensätze. Neu eingetragen sind vielleicht bisher 100 Stück, das wäre noch händisch machbar. Jedoch verstehe ich immer noch nicht wieso es mir keine Umlaute einträgt bei ISO 8859-1.

              Ich hab das ganze nochmal lokal getestet, mit PHP 5.3.1, da funktioniert alles mit ISO-8859-1, ohne wenn und aber. Vielleicht wäre ein Update von PHP 5.2.10 auf 5.3.1 auf dem Server die einfachste Lösung ?!?

              Kommentar


              • #8
                du solltest unbedingt mal testen, in welchem Zeichenformat deine Verbindung zur Datenbank läuft ...
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9
                  Gerne, wenn mir jemand sagt oder nen Link gibt wie das bei einer ODBC-Verbindung rauszufinden ist. Irgendwelche Ansätze?

                  lg Hannes

                  Kommentar


                  • #10
                    auf welchem System soll dein PHP laufen ? auch windows ?

                    hier eine Antwort aus PHP.net Manual User comments :

                    After extensive research trying to get PHP on Linux communicating with SQL Server 2005 and 2008 including support for all Unicode, MAX and XML data types I could not find any open source solutions...yes, I spent a lot of time trying to get FreeTDS to work to no avail.

                    I found one free solution that runs on Windows which is to use the "SQL Server Driver for PHP" provided by Microsoft (Microsoft Drivers for PHP for SQL Server). The driver relies on the Microsoft Native Client ODBC drivers for SQL Server 2008 (part of the "Microsoft SQL Server 2008 Native Client" which is downloadable from Microsoft) which is why this solution will not work on anything except Windows.

                    I did find a solution that works for PHP on Linux but it's not free...use the standard PHP::ODBC lib (free) and the Easysoft ODBC driver for SQL Server (not free, but reasonable by Enterprise standards). You can check out the ODBC driver by going here Easysoft Data Access and looking for "Easysoft ODBC-SQL Server Driver"


                    - vielleicht hilft dir ja der mittlere Abschnitt - nachdem ich einige Texte zu ODBC und encoding gelesen habe, scheint das direkt davon abzuhängen, welche Optionen man beim Installieren des ODBC-Treibers wählt - ....
                    hier noch mehr Infos zum native SQL driver
                    For more information and extension download please see
                    http://www.codeplex.com/SQLSRVPHP
                    They have also blog on http://blogs.msdn.com/sqlphp/
                    Zuletzt geändert von eagle275; 02.09.2010, 22:11.
                    [font=Verdana]
                    Wer LESEN kann, ist klar im Vorteil!
                    [/font]

                    Kommentar


                    • #11
                      Danke für die ganzen Infos.

                      PHP läuft auf ner Windows-Maschine mit IIS - da ich aber selbst keinen Zugriff habe werde ich mal den Admin bitten diese Möglichkeit zu testen.

                      Melde mich in wie weit das funktioniert hat.

                      Kommentar


                      • #12
                        So, so langsam aber sicher kann ich weiter eingrenzen.
                        Da ich mir fast sicher war das es nicht an der Datenbank selbst liegt habe ich kurz einen einfachen Eingabe-/Ausgabetest gemacht ohne DB-Verbindung mit folgenden zwei Dateien:

                        Testinput.php
                        HTML-Code:
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                        <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
                        <head>
                        <title>Umlauttest</title>
                        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
                        <link href="css/style.css" media="screen" rel="stylesheet" type="text/css"/>			
                        </head>
                        <body>
                        	<div id="wrapper">
                        		<form method="post" action="testoutput.php">
                        			<table>
                        				<tr>
                        					<td>
                        						<input type="text" name="fName" maxlength="50" />
                        					</td>
                        					<td>
                        						<input type="submit" value="testen..." name="submit" />
                        					</td>
                        				</tr>			
                        			</table>		
                        		</form>	
                        	</div>
                        </body>
                        </html>
                        Testoutput.php
                        HTML-Code:
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                        <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
                        <head>
                        <title>Umlauttest</title>
                        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
                        <link href="css/style.css" media="screen" rel="stylesheet" type="text/css"/>			
                        </head>
                        <body>
                        	<div id="wrapper">
                        		<?php		
                        				if ($_POST['fName'] != "")
                        					{								
                        						$Name = $_POST['fName'];
                        						
                        						echo $Name;
                        					}				
                        		?>
                        	</div>
                        </body>
                        </html>
                        Als Ergebnis kam folgendes bei raus:

                        - Beim lokalen System (XAMPP mit PHP 5.3.1) wird bei der Eingabe "Müller" auch "Müller" ausgegeben.
                        - Auf dem Server (mittlerweile mit PHP 5.3.3) wird "Mller" ausgegeben.

                        Überseh ich grade irgendwas offentsichtliches, oder gibt's hier wirklich ein Problem?

                        lg Hannes

                        Kommentar


                        • #13
                          ein minimaler :kannst du es mal ohne den xml-namespace beim html-element versuchen?

                          bei mir sieht das so aus..

                          HTML-Code:
                          <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
                          <html>
                          <head>
                          <title>Titel</title>
                          <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>
                          und es klappt ...(PHP 5.3.0) wobei es wohl nicht die PHP-version ist .. eher noch Einstellungen in der verwendeten PHP-Ini
                          Zuletzt geändert von eagle275; 03.09.2010, 16:59.
                          [font=Verdana]
                          Wer LESEN kann, ist klar im Vorteil!
                          [/font]

                          Kommentar


                          • #14
                            Puh, kann also nur noch an der INI liegen, da es auch ohne xml-namespace nicht funktioniert.

                            Code:
                            _SERVER["HTTP_ACCEPT_CHARSET"]	ISO-8859-1,utf-8;q=0.7,*;q=0.7
                            Dieser Teil ist jedoch bei der lokalen Testumgebung wie auch auf dem Server gleich. Ich verzweifle noch

                            edit: die aktuelle INI des Server hätte ich hier, hilft es vielleicht weiter da weiter zu schauen? (defaul_charset = "iso-8859-1" und mssql.charset = "iso-8859-1" sind momentan auskommentiert)
                            Zuletzt geändert von Hannes_L; 03.09.2010, 17:11.

                            Kommentar


                            • #15
                              poste ruhig mal - ich hab da zwar nicht so viel ahnung von .. aber lesen ja noch andere
                              [font=Verdana]
                              Wer LESEN kann, ist klar im Vorteil!
                              [/font]

                              Kommentar

                              Lädt...
                              X