dedlfix: utf-Codierung / Verwendung von mysqli

Beitrag lesen

echo $begrüßung;

Der Aufbewahrungsort gehört selbstverständlich mit in die Liste der zu beachtenden Dinge. Es nützt dir ja nichts, wenn du zwar einen Kubikmeter problemlos transportieren kannst, aber nur eine Streichholzschachtel zum Aufbewahren breithältst.
Das heißt? 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. Es fehlte nur in deiner ursprünglichen Auflistung der zu beachtenden Dinge.

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.

Die wichtigsten SQL-Anweisungen sind SELECT, INSERT, UPDATE und DELETE. Alles andere ist praktisch systemabhängig.
OK, also die 4 wichtigsten Aktionen sind: 1) Einen neuen Datensatz hinzufügen, 2) Datensätze ausgeben. 3) Einen bestehenden Datensatz ändern und 4) einen bestehenden Datensatz löschen.

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

Ich bleibe jetzt bei oben stehenden fiktiven Angaben und zeige Dir mal, wie ich 1) und 2) mit mysqli löse:

  1. Einen neuen Datensatz hinzufügen mit mysqli:

Passt, kein direkter Einwand meinerseits.

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

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.

htmlspecialchars() bleibt, weil das für das Einfügen in den HTML-Kontext benötigt wird.

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.

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.

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.

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.

echo "$verabschiedung $name";

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