flowh: utf-Codierung / Verwendung von mysqli

Beitrag lesen

Hallo.

Ich verstehe Dich einfach nicht!!! Wenn man über das Formular zB beim Namen Hans eingibt und davor und danach ein Anführungszeichen schreibt, dann landet das als "Hans" in der DB. Aber nicht, weil ich mich darum gekümmert habe, sondern weil das durch das mysqli und den prepared Statements automatisch passiert, oder??

Wenn du "Hans" (mit den Anführungszeichen) in dein Formular eingibst, dann sollte in der Datenbank auch "Hans" (mit den Anführunszeichen) gespeichert werden, und nicht "Hans" oder irgendetwas anderes. Du willst ja genau das, was eingegeben wird, auch in der Datenbank haben.

Dass die " um Hans herum escaped werden (d.h. ein \ davor gesetzt wird), liegt an dem PHP-"Feature" Magic Quotes. Die Prepared Statements sorgen nur u.a. dafür, dass die Daten, die du an die Datenbank schickst, auch genauso in der Datenbank ankommen.

Hier geht es jetzt rein um die _Ausgabe_. Natürlich will ich die Stripslashes loswerden davor! Aber deswegen hab ich doch mit nichts Probleme??!

Es ist nur unnötig kompliziert, erst PHP alle " escapen zu lassen und dann ständig aufzupassen und dran zu denken, dass das so ist, und dann auch evtl wieder rückgängig zu machen.
Einfacher ist es, die Magic Quotes gleich ganz auszuschalten, oder ihre Wirkung zu Scriptbeginn global rückgängig zu machen (siehe dazu dedlfix' Link).

Magic Quotes waren gedacht, um SQL-Injection-Probleme zu lösen. Doch dieses Feature wirkt auf alle Eingabedaten, nicht nur auf die, die in ein SQL-Statement eingebaut werden und auch auf die, die aufgrund von P.S. aus Prinzip kein SQL-Injection-Problem haben.

Hier geht es doch um keine Eingabedaten, hier gebe ich was _aus_!

Mit Eingabedaten ist gemeint: $_GET, $_POST, etc...

Mir wurde doch letztens extra erklärt, wenn ich diese moderne Form (also das mysqli) nehme, dann brauche ich keine Angst vor SQL Injections haben und mich auch nicht davor schützen, weil das das System automatisch macht. Und jetzt muß ich mich _doch_ plötzlich wieder um Dinge wie Magic Quotes kümmern? Dachte, das betrifft mich nur, wenn ich die althergebrachten Methoden verwende?

Sofern du Prepared Statements verwendest, brauchst du dich nicht mehr um SQL-Injection kümmern, unabhängig davon, ob Magic Quotes aktiviert sind oder nicht.

Bei jeglicher Kommunikation mit dem DBMS sollte die Verbindungskodierung ausgehandelt werden, ansonsten wird ein System-Default-Wert verwendet. MySQL kodiert die Felddaten in die Verbindungskodierung um, wenn diese eine andere als die Feldkodierung ist. Das willst du nicht, wenn dein Default-Wert Latin1 ist, denn du willst ja mit UTF-8 weiterarbeiten. Außerdem gehen die Zeichen verloren, die nicht in Latin1 enthalten sind.

Aha. Bin zwar jetzt schon so verwirrt, daß ich gar nichts mehr verstehe, aber ich gebe es wieder dazu, lasse das also IMMER dabei.

Immer, wenn du mit dem DBMS kommunizierst, werden dabei irgendwelche Daten übertragen. Und damit alle Beteiligten wissen, wie diese Daten kodiert (utf-8, etc..) sind,  musst du das halt angeben, ist doch logisch :-)

Tja, wenn ich nur wüßte, wie?

So wie dus weiter oben auch gemacht hast. SQL String mit $stmt = $db->prepare($sql) vorbereiten, dann die Parameter mit $stmt->bind_param() einfügen. Das funktioniert auch bei WHERE. ("... WHERE foo=?")

Das Prinzip ist auch bei diesen beiden Statements kein anderes als bei Nummer 1.

Super. Weil GENAU DAS war es ja, was ich wissen wollte, weil ich es eben NICHT kann.

Du kannst es doch: SQL String vorbereiten, Parameter dranbinden, ausführen, wie oben auch schon.

Ob das SQL jetzt aus "UPDATE bla SET foo=? WHERE baz=?" oder "DELETE FROM bla WHERE baz=?" oder "SELECT foo FROM bla WHERE baz=?" oder "INSERT INTO bla (foo) VALUES (?)" besteht, ist egal. Du musst halt nur immer die passenden Parameter dranbinden.

Servus,
Flo

0 57

Sonderzeichen bei Mail mit Inhalt aus Formular

Brombeermilchtrinker
  • php
  1. 0

    Ursprungsproblem gelöst / nun anderes Codierungsproblem

    Brombeermilchtrinker
    1. 0
      Markus**
      1. 0
        Brombeermilchtrinker
    2. 0
      Sven Rautenberg
      1. 0
        Brombeermilchtrinker
        1. 1
          Sven Rautenberg
          1. 0
            Brombeermilchtrinker
        2. 0
          Jens Holzkämper
    3. 0
      dedlfix
      1. 0
        Brombeermilchtrinker
        1. 0
          dedlfix
          1. 0
            Brombeermilchtrinker
            1. 0
              dedlfix
              1. 0
                Sven Rautenberg
              2. 0
                Brombeermilchtrinker
                1. 0
                  dedlfix
                  1. 0
                    Brombeermilchtrinker
                    1. 0
                      Jens Holzkämper
                    2. 0
                      Vinzenz Mai
                      1. 0
                        Brombeermilchtrinker
                        1. 0
                          Vinzenz Mai
                          1. 0
                            Brombeermilchtrinker
                            1. 0
                              Brombeermilchtrinker
                              1. 0
                                Harlequin
                                1. 0
                                  Sven Rautenberg
                                2. 0
                                  Brombeermilchtrinker
                                  1. 0
                                    Jens Holzkämper
                                    1. 0
                                      Brombeermilchtrinker
                                      1. 0
                                        Jens Holzkämper
  2. 0
    Markus**
  3. 0

    Mail Codierung - Problem noch immer nicht gelöst

    Brombeermilchtrinker
    1. 0
      dedlfix
      1. 0
        Brombeermilchtrinker
        1. 0
          dedlfix
          1. 0
            Brombeermilchtrinker
            1. 0
              dedlfix
              1. 0
                at
              2. 0
                Brombeermilchtrinker
                1. 0
                  Harlequin
                  1. 0
                    Brombeermilchtrinker
                2. 0
                  dedlfix
                  1. 0
                    Brombeermilchtrinker
                    1. 0
                      dedlfix
                      1. 0

                        utf-Codierung / Verwendung von mysqli

                        Brombeermilchtrinker
                        1. 0
                          flowh
                        2. 0
                          dedlfix
                          1. 0
                            Brombeermilchtrinker
                            1. 0
                              Harlequin
                              1. 0
                                Brombeermilchtrinker
                              2. 0
                                dedlfix
                                1. 0
                                  Harlequin
                                  1. 0
                                    Brombeermilchtrinker
                            2. 0
                              flowh
                              1. 0
                                Brombeermilchtrinker
                            3. 0
                              dedlfix
                              1. 0
                                Brombeermilchtrinker