Brombeermilchtrinker: utf-Codierung / Verwendung von mysqli

Beitrag lesen

Hi dedlfix,

Also muß ich _was_ noch zusätzlich tun, was bisher nicht aufgezählt worden ist?
Eigentlich nichts mehr, denn du erwähntest bereits, dass du bei jedem TEXT- und VARCHAR-Feld eine Kollationsangabe (die beinhaltet ja die Kodierung) gesetzt hättest.

Ja, das mache ich.

Ich nehme weiter an, daß ich Namen, Ort und Geburtsjahr aus einem Formular übernehme und weiterverarbeite. (Stichwort:kontextbezogene Behandlung)

Wenn du in ein SQL-Statement selbst Daten einfügst, dann musst du dabei beachten, dass du diese Daten gemäß den Regeln des DBMS behandelst. Wenn du Prepared Statements (P.S.) und Platzhalter für die Daten verwendest, machst du das nicht, weil sich die Client-API des DBMS darum kümmert.

Ich nehme an, was Du mir damit sagen willst ist, daß bei der Prozedur mit den prepared Statements keine SQL Injection passieren kann, weil sich das System automatisch um das Escapen kümmert? Das habe ich schon verstanden. Ich hab das mit der kontextbezogenen Behandlung schon auf die Ausgaben bezogen. Oder war Deine Antwort anders gemeint?

Alle SQL-Statements, nicht nur diese vier, werden gleich behandelt, was den Weg zum DMBS hin betrifft.

Was willst Du mir _damit_ sagen?

  1. Alle Datensätze der Tabelle ausgeben mit mysqli:
       echo "<p>".htmlspecialchars(stripslashes($id))." ==> ".htmlspecialchars(stripslashes($name))." aus ".htmlspecialchars(stripslashes($ort))." ist ".htmlspecialchars(stripslashes($geburtsjahr))."geboren.</p>\n";

Wenn du hier stripslashes() verwendest, weil du sonst ungewollte \ in der Ausgabe hast, dann hast du ein Problem mit den Magic Quotes, das du aber an ganz anderer Stelle lösen musst.

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??

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

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_!

Wenn bei dir die Magic Quotes eingeschaltet sind, bekommst du nun fehlerhafte Daten in dein DBMS, weil der \ als ganz normales Zeichen angesehen wird. Sorge dafür, dass die Magic Quotes generell deaktiviert oder einmalig am Script-Anfang deren Auswirkungen rückgängig gemacht werden.

Dedlfix, Du verwirrst mich immer mehr und mehr. :-(
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?

Anmerkung: Hier habe ich das "$db->set_charset("utf8");" _absichtlich_ weggelassen, weil es ja nur der Ausgabebefehl ist, ohne Daten in einer WHERE Klausel. Ist das eh OK so?

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.

2B) Ausgabe von Datensätzen unter einer Bedingung mit mysqli:
$sql = 'SELECT id, name, ort, geburtsjahr FROM tabelle1 WHERE ort='.$\_POST['ortsuche'].' ORDER BY id';
$ergebnis = $db->prepare( $sql );

Integriere den Parameter so in dein Statement, wie du das bereits bei 1) getan hast. Du verwendest P.S., also brauchst du keine Daten händisch in das Statement einzubauen.

Wie meinst Du das? BITTE schreib mir doch die Zeile so hin, wie es richtig wäre.

Zwischenfrage: Ist der WHERE-Teil mit den Anführungszeichen und dem Verkettungsoperatoren richtig so?

Nein, du hast dabei gleich zwei Fehler gemacht. Das Quotieren von Strings geht mit ' oder ", Backticks sind für Bezeichner vorgesehen. Und wenn du händisch Daten in ein Statement einfügst, ist dabei immer der Kontextwechsel zu beachten und zu behandeln. Diese beiden Fehler lösen sich aber in Luft auf, wenn du P.S. richtig verwendest.

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

So, aber das war das Ende meiner Weisheit. Wie man 3) einen bestehenden Datensatz ändern und 4) einen bestehenden Datensatz löschen kann (_mit mysqli_), weiß ich nichts und finde dazu auch nichts im Netz.

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. Und ich finde auch nach 4 Stunden nicht _eine_ Seite im Netz, wo das hergezeigt wird. Ich finde weiterhin nur Seiten, wo man Beispielcodes für das Erstellen von Datensätzen oder für das Anzeigen aller Datensätze einer Tabelle sieht.

Kannst Du mir bitte konkreter helfen, das irgendwie verständlicher erklären und mir ETWAS mehr php-Code zeigen? BITTE! Oder gibts wo eine Seite, wo das anschaulich erklärt wird?

Mir vergeht langsam die Lust an der Sache. :-(

Der Brombeermilchtrinker

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