Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit Sonderzeichen PHP -> MySQL -> HTML

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem mit Sonderzeichen PHP -> MySQL -> HTML

    Hi,

    bastel gerade an einem Weblog. Die Daten gebe ich in einem Formular ein und speichere sie dann in MySQL.
    Anschließend gebe ich sie dann in HTML aus oder(!) möchte sie editieren. Dazu werden sie dann in einem Formular ausgegeben.

    Problem:
    - Wenn ich Daten speicher mache ich das über htmlentities(), dabei kann ich schon mal keine Links einfügen
    - Die Daten, die ich über htmlentities speicher werden zwar als HTML hübsch ausgegeben, wenn ich aber alles zum editieren öffne, sind dort die
    ... und die werden nach dem speichern ja automatisch wieder mit htmlentities() gespeichert, sodass ich beim Editieren immer die
    's wegmachen müsste, damit mein Script diese nicht automatisch umwandeln kann.

    Lösungsansatz:
    - Hatte schon versucht auf htmlentities ganz zu verzichten. Dann könnte ich so ordentlich HTML-Code posten, was mir nichts ausmacht. Problem dann: Sonderzeichen (genauer: dt. Sonderzeichen, wie zB: ä,ö,ü,ß...) werden von MySQL als "?" dargestellt.

    Herzlichen Dank,
    Malte

  • #2
    Du musst unterscheiden zwischen Darstellung und Datenhaltung. Die Datenhaltung enthält die reinen unformatierten Daten. Die werden nur bei der Ausgabe verschönert.

    Was MySQL darstellt ist ja egal, solange die Oberfläche funktioniert, mit der gearbeitet wird. Du könntest dir ja eventuell Gedanken über den von MySQL verwendeten Zeichensatz machen, der sich konfigurieren lässt. Funktioniert denn ohne htmlentities die Ausgabe im Browser?

    Kommentar


    • #3
      Den MySQL Zeichensatz habe ich auch schon verändert; erstauf latin1_general und jetzt auch mal auf german - hilft alles nix.
      Ohne htmlentities gibt er für Umlaute ein ? aus (das als solches schon mysql so gespeichert wird)... wenn ich es als ü speicher wird es richtig ausgegeben...

      ohne htmlentities kann ich das natürlich alles schoen selber machen... alle Zeilenumbrüche etc... aber meiner Meinung nach muss ich zuviel selber machen... denn wenn ich meinentwegen

      Code:
      <html>
      <body>
      Hier gibts eine Überraschung
      </body></html>
      schreibe, wird das ja auch korrekt vom Browser angezeigt (also nicht "?berraschung" oder "&Uuml;berraschun", sondern "Überraschung"). Muss ja irgendwie an MySQL liegen, bzw. an der Übetragung zwischen dem Script und MySQL, oder?

      Kommentar


      • #4
        Mit welchem Medium guckst du denn in die Datenbank (Browser, Konsole, ...)?
        Welchen Zeichensatz nutzt du bei der Eintragung von Daten über den Browser?
        Welchen String liefert PHP (mach ein echo und siehe HTML-Quelltext) bei Feldern mit Sonderzeichen?

        aöü sind in den latin1-Kodierungen vorhanden.

        Kommentar


        • #5
          - Medium: phpmyadmin
          - Zeichensatz beim Eintrag: ... hmmm keinen speziellen? sollte ich einen angeben?
          - wenn ich htmlentities mache steht im source &...uml; | ohne htmlentities steht nur das "?" dort, das, wie gesagt auch schon in der Tabelle so gespeichert wurde.

          und wenn die Umlaute da schon alle drinne sind, muss an meiner dummheit liegen, (bzw. vllt. am SQL-statement??)...
          Habe es einfach mal getestet... das SQL Statement, das an MySQL übergeben wird, sieht folgendermaßen aus (habe mir es einfach per echo ausgeben lassen, bevor es gespeichert wird):
          Code:
          INSERT INTO WEBLOG SET TITLE='Testwürstchen',CONT='Hier steht der Text... ich bin ein Nasenbär (ein Zeilenumbruch) und Ende',DATETIME=NOW()
          und wenn das statement richtig ist (also umlaute so dargestellt werden...) müsste es doch eigentlich gehen...
          selbst im source wird der umlaut als "ü" angezeigt, nicht als "&uuml;"...

          Kommentar


          • #6
            Zitat von Saraneus
            Welchen String liefert PHP (mach ein echo und siehe HTML-Quelltext) bei Feldern mit Sonderzeichen?
            Damit meine ich, dass du ausgeben sollst, was der Browser übergeben hat, wenn du das Eintragungsformular abgeschickt hast, z.B. mit print_r($_POST).

            Insert-Statements sehen so aus:

            Code:
            INSERT INTO tabelle (spalte1, spalte2, spalteN) VALUES('inhalt_fuer_spalte1', 'inhalt_fuer_spalte2', 'inhalt_fuer_spalteN')
            Dein Statement würde nur in MySQL funktionieren, entspricht aber nicht dem Standard.

            Kommentar


            • #7
              browserübergabe:

              Code:
              Array ( [TITLE] => Neuer Eintragswürtschen [CONT] => Hallo du Würstchen mit ü [ACTION] => create )
              Danke @ statement (scheiss Markt+Technik MySQL-Buch -> da steht's so drinne )

              Kommentar


              • #8
                Amüsanter Arrayinhalt

                Jetzt steht fest, der Browser überträgt die Sonderzeichen korrekt. Hast du Zugriff auf eine Konsole, in der du per mysql-Client den Inhalt der Datenbank einsehen kannst? phpMyAdmin ist auch nur eine HTML-Site, deshalb gibt's da denselben Effekt wie auf deiner Website.

                Ich vermute, die Daten werden richtig gespeichert. Dann lies mal per PHP aus und mach ein print_r() mit dem von mysql_fetch_row zurückgeliefertem Ergebnis. Bitte wieder hier posten.

                Zitat von malte_w
                Danke @ statement (scheibenkleister Markt+Technik MySQL-Buch -> da steht's so drinne )
                Sicher beim Insert? Denn für Update wäre deine Syntax die richtige.

                Kommentar


                • #9
                  Code:
                  Array
                  (
                      [0] => 1
                      [1] => ?berraschungsw?rstchen
                      [2] => Hier kommt das ?berraschungsw?rstchen
                      [3] => 2005-12-07 13:22:12
                      [4] => 0
                  )
                  Das ist direkt aus dem source kopiert .

                  und eben habe ich mal über kommandozeile die abfrage gemacht und da zeigt er mich auch die ?-Zeichen an, anstatt der Umlaute


                  PS: danke für deine mühe

                  Kommentar


                  • #10
                    na ja das zeigt ja schon das sie im Code (also nichts mit MySQL) nicht richtig sind.
                    Code:
                    Array
                    (
                        [0] => 1
                        [1] => ?berraschungsw?rstchen
                        [2] => Hier kommt das ?berraschungsw?rstchen
                        [3] => 2005-12-07 13:22:12
                        [4] => 0
                    )
                    daher muss es an PHP liegen..

                    oder ist das die abfrage von MySQL ?! fals ja sry
                    :arrow: [URL="http://tiny.cc/0xlvv"]Wie man Fragen richtig stellt[/URL]

                    Kommentar


                    • #11
                      Dann geht definitiv beim Speichern was schief. Welchen Zeichensatz benutzt dein MySQL im Moment?

                      Versuch mal ein (zB in phpMyAdmin)
                      Code:
                      ALTER TABLE weblog DEFAULT CHARACTER SET latin1

                      Kommentar


                      • #12
                        So, mittlerweile halt ich ja schon zwei Poster mit meinem Kram auf .

                        Also, habe eben mal ALLES auf UTF8 zurückgestellt (in MySQL) und jetzt speichert er den String bis zum ersten Vorkommen eines Umlauts, also z.B. wird bei Nasenbär nur Nasenb gespeichert (und ausgegeben).

                        Und wenn ich dein Statement an SQL sende steht das auf latin1_swedish und er macht dasselbe wie oben (vor dem Umlaut abschneiden).

                        Kann das damit zusammenhängen, dass er eine Art SQL Injection (wenn man das so nennt) macht ->
                        Code:
                        INSERT INTO .... VALUES('Nasenb&auml;r','');
                        und dann schon bei dem ersten Semikoln aufhört?

                        Ich glaub ich schmeiss mein Rechner gleich ausm Fenster

                        Kommentar


                        • #13
                          Zitat von malte_w
                          Also, habe eben mal ALLES auf UTF8 zurückgestellt (in MySQL) und jetzt speichert er den String bis zum ersten Vorkommen eines Umlauts, also z.B. wird bei Nasenbär nur Nasenb gespeichert (und ausgegeben).
                          Mit utf8 eintragen:
                          Code:
                          $inhalt = "aöü";
                          mysql_query("INSERT INTO tabelle (feld) VALUE('".utf8_encode($inhalt)."')");
                          Mit utf8 auslesen:
                          Code:
                          $q = mysql_query("SELECT feld FROM tabelle");
                          list($feld) = mysql_fetch_row($q);
                          $inhalt = utf8_decode($feld);
                          Probier das mal.

                          Und wenn ich dein Statement an SQL sende steht das auf latin1_swedish und er macht dasselbe wie oben (vor dem Umlaut abschneiden).
                          Du kannst an das Statement noch ein COLLATE latin1_german1_ci dranhängen.

                          Kann das damit zusammenhängen, dass er eine Art SQL Injection (wenn man das so nennt) macht
                          Nein, in diesem Fall nicht. Um sicherzugehen, solltest du generell mysql_escape verwenden.

                          Kommentar


                          • #14
                            WOW - Funktioniert!!! Herzlichen Dank!!


                            Habe eben alles ausprobiert - und wüsst ich, du wärst ne Frau, ich würd dich küssen




                            War hier echt voll am Abdrehen...

                            Kommentar


                            • #15
                              Wie hats nun geklappt?

                              Wüsst ich, du wärst ne Frau, würd ich mich küssen lassen

                              Kommentar

                              Lädt...
                              X