Sebastian: \" aus POST-Übergabe ohne \ in MySQL schreiben

Hallo ihr Lieben,

stehe mal wieder auf dem Schlauch! Nachdem ich vor kurzem freundlicherweise "belehrt" wurde, dass man per Formular übergebene Werte 1:1 in MySQL schreiben (ohne strip_tags) und erst bei der Ausgabe bearbeiten sollte, stehe ich nun vor einem neuen Problem:

Während Sonder-Anführungszeichen wie «» oder „“ per POST unverändert übergeben werden, wird "" jeweils mit einem \ maskiert.

  1. wie elimiert man dieses \ ?
  2. soll man es vor dem Eintrag in MySQL elimieren oder erst bei der Ausgabe?

Für Tipps und Tricks wie immer dankbar, grüßt -
Sebastian

  1. Hi!

    stehe mal wieder auf dem Schlauch! Nachdem ich vor kurzem freundlicherweise "belehrt" wurde, dass man per Formular übergebene Werte 1:1 in MySQL schreiben (ohne strip_tags) und erst bei der Ausgabe bearbeiten sollte, stehe ich nun vor einem neuen Problem:

    Während Sonder-Anführungszeichen wie «» oder „“ per POST unverändert übergeben werden, wird "" jeweils mit einem \ maskiert.

    1. wie elimiert man dieses \ ?
    2. soll man es vor dem Eintrag in MySQL elimieren oder erst bei der Ausgabe?

    Hierfür ist die PHP-Einstellung Magic Quotes verantwortlich. Du kannst den Backslash entfernen, indem du die Funktion stripslashes auf den String loslässt.

    Dies sollte vor dem Eintragen in die DB geschehen.

    Grüße,
    Fabian St.

    1. hi,

      Hierfür ist die PHP-Einstellung Magic Quotes verantwortlich. Du kannst den Backslash entfernen, indem du die Funktion stripslashes auf den String loslässt.

      Dies sollte vor dem Eintragen in die DB geschehen.

      und anschließend sollte eine behandlung der einzufügenden daten mittels mysql_real_escape_string() erfolgen.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hi!

        und anschließend sollte eine behandlung der einzufügenden daten mittels mysql_real_escape_string() erfolgen.

        Da ich dies bereits in seinem letzten Thread mehrfach erwähnt habe, dachte ich, dass ich mir das hier jetzt spare ;-)

        Grüße,
        Fabian St.

        1. Hallo zusammen,

          Da ich dies bereits in seinem letzten Thread mehrfach erwähnt habe, dachte ich, dass ich mir das hier jetzt spare ;-)

          das habe ich ja inzwischen auch eingefügt und es funktioniert wunderbar. Nur mit stripslashes() funktioniert es seltsamerweise nicht so, wie ich mir das wünsche. Es wird dann einfach nur ein \ eingetragen - der Rest verschwindet!?
          Wie kombiniere ich die beiden Methoden stripslashes() und mysql_real_escape_string() in einen Schritt?

          Viele Grüße -
          Sebastian

          1. echo $begrüßung;

            Wie kombiniere ich die beiden Methoden stripslashes() und mysql_real_escape_string() in einen Schritt?

            Das ist nicht sinnvoll. Aus Gründen, die du in dem bereits von Fabian geposteten Link nachlesen kannst, verändert PHP die Benutzereingaben, wenn man es ihm nicht in der Konfiguration abgewöhnt. Wenn das nicht geht (unveränderbare Providereinstellung) sollte man stripslashes_deep() aus dem Beispiel 2 auf $_GET, $_POST, etc. anwenden. (Vorher noch mit get_magic_quotes_gpc() prüfen, ob die Magic Quotes wirklich angeschaltet sind.)

            echo "$verabschiedung $name";

            1. echo $begrüßung;

              Ich vergaß zu erwähnen, dass das stripslashes_deep am Scriptanfang am besten aufgehoben ist.

              echo "$verabschiedung $name";

    2. Hallo und vielen Dank erstmal für die bisherigen Tipps.
      Ich musste die Formularlogik ein bisschen umstricken, aber jetzt geht alles blendend.

      Nun gibt es aber noch ein weiteres Problem im späteren Verlauf.
      nachdem der Benutzer in vier Schritten ziemlich viel Dinge eingegeben hat, die alle – mit stripslashes() und mysql_real_escape_string() behandelt – in die DB geschrieben wurden, bite ich ihm (leider) die Möglichkeit, diese Daten nochmals anzuschauen und ggf. zu korrigieren.

      Hierzu leite ich ihn auf eine Seite, die wie die ursprüngliche Eingabeseite aussieht, nur dass alle <input>'s bereits mit seinen Eingaben vorbelegt sind, nämlich so:
      <input name="feld1" value="<?php echo $abfrage['feld1'] ?>">

      Hat er nun ursprünglich in ein Feld z.B. "Max und Moritz" eingegeben, steht auf dieser Korrekturseite nun
      <input name="feld1" value=""Max und Moritz"">
                                  ^^^^^^^^^^^^^^^^
                                  Das hier wird nun logischerweise ignoriert und das Eingabefeld ist leer.

      Die Umkehrfunktion von stripslashes(), nämlich addslashes() funktioniert natürlich nicht, da dann zwar etwas im <input> zu sehen ist, aber nur das \ vor dem ersten ".

      Gibt es irgendeinuen workaround für dieses lästige Phänomen?

      Heute sehr intensiv fragend und ebenso intensiv dankbar seiend grüßt -
      Sebastian

      1. Huhu Sebastian

        nachdem der Benutzer [...] biete ich ihm (leider) die Möglichkeit, diese Daten nochmals anzuschauen und ggf. zu korrigieren.

        Hierzu leite ich ihn auf eine Seite, die wie die ursprüngliche Eingabeseite aussieht, nur dass alle <input>'s bereits mit seinen Eingaben vorbelegt sind

        Du bist also im HTML-Kontext, dann musst Du die Benutzereingaben aus der Datenbank in korrektes HTML umwandeln.

        htmlentities() sollte Dein Problem beheben.
        http://de2.php.net/manual/de/function.htmlentities.php

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
      2. Hi!

        Nun gibt es aber noch ein weiteres Problem im späteren Verlauf.
        nachdem der Benutzer in vier Schritten ziemlich viel Dinge eingegeben hat, die alle – mit stripslashes() und mysql_real_escape_string() behandelt – in die DB geschrieben wurden, bite ich ihm (leider) die Möglichkeit, diese Daten nochmals anzuschauen und ggf. zu korrigieren.

        Hierzu leite ich ihn auf eine Seite, die wie die ursprüngliche Eingabeseite aussieht, nur dass alle <input>'s bereits mit seinen Eingaben vorbelegt sind, nämlich so:
        <input name="feld1" value="<?php echo $abfrage['feld1'] ?>">

        Hat er nun ursprünglich in ein Feld z.B. "Max und Moritz" eingegeben, steht auf dieser Korrekturseite nun
        <input name="feld1" value=""Max und Moritz"">
                                    ^^^^^^^^^^^^^^^^
                                    Das hier wird nun logischerweise ignoriert und das Eingabefeld ist leer.

        Hier müsstest du die Daten dann wieder mit htmlentities() behandeln, sodass Sonderzeichen entsprechend durch ihre Entities ersetzt werden. Zum Eintragen in die Datenbank ist dann wiederum html_entity_decode() anzuwenden, welche eine Art Umkehrfunktion zu der vorherigen ist. Und natürlich ist auch hier dann das mysql_real_escape_string() nicht zu vergessen!

        Wenn du dich wie oben beschrieben an die Vorgehensweise hälst, solltest du keine Probleme kriegen. Um mir die unnötige Tipparbeit mit dem ständigen htmlentities() zu sparen, verwende ich gerne eine erweiterte Version, die eine ganzes Array rekursiv durchläuft:

          
        function array_htmlentities($item) {  
            if(is_array($item)) {  
                foreach($item as $key => $value) {  
             $item[$key] = array_htmlentities($value);  
         }  
            } else {  
                $item = htmlentities($item);  
            }  
          
            return $item;  
        }  
        
        

        Grüße,
        Fabian St.

        1. Hallo Fabian,

          Hier müsstest du die Daten dann wieder mit htmlentities() behandeln, sodass Sonderzeichen entsprechend durch ihre Entities ersetzt werden. Zum Eintragen in die Datenbank ist dann wiederum html_entity_decode() anzuwenden,

          nein, ist es nicht - die Daten werden bereits vom Browser wieder als "Klartext" an den Server geschickt, wenn also im Quelltext
          <input name="foo" value="&amp;" />
          steht, steht in $_POST['foo'] dann '&' - und nicht '&amp;'.

          Grüße aus Nürnberg
          Tobias

          1. Hi Tobias!

            Hier müsstest du die Daten dann wieder mit htmlentities() behandeln, sodass Sonderzeichen entsprechend durch ihre Entities ersetzt werden. Zum Eintragen in die Datenbank ist dann wiederum html_entity_decode() anzuwenden,
            nein, ist es nicht - die Daten werden bereits vom Browser wieder als "Klartext" an den Server geschickt, wenn also im Quelltext
            <input name="foo" value="&amp;" />
            steht, steht in $_POST['foo'] dann '&' - und nicht '&amp;'.

            Tatsächlich - warum bin ich dann auf die Idee mit html_entity_decode() gekommen? Ich kann mich vage daran erinnern, vor einiger Zeit das Problem gehabt zu haben, dass genau dies nicht geschah, aber bei meinen jetzigen Tests funktionierte alles - wie erwartet - ohne Probleme. Anscheinend habe ich damals noch irgendwas übersehen.

            Auf alle Fälle Danke für diesen Hinweis!

            Grüße,
            Fabian St.

      3. echo $begrüßung;

        Ganz allgemein gilt: Daten, die von irgendwoher kommen, sollten erst einmal in ihre Rohform umgewandelt werden, und das möglichst gleich zu Anfang.

        [*]

        Daten die ausgegeben werden, sind dem Ausgabemedium (Datenbanken zählen dazu) entsprechend zu behandeln, und das möglichst kurz vor der Ausgabe.

        Es ist nicht relevant, wie eine spätere Ausgabe aussehen soll. Einige Umwandlungsverfahren sind nicht ohne Verlust umkehrbar, so dass man dann später Probleme bekommen kann, wenn ein weiteres Ausgabemedium hinzukommt.

        echo "$verabschiedung $name";

        [*] an der Stelle stehen Prüfung der Eingabedaten und Verarbeitung. Da das aber nicht die Ein- und Ausgabebehandlung betrifft, habe ich es dort oben nicht hingeschrieben.

      4. Vielen Dank an alle!

        Jetzt funktioniert alles super und ich habe mal wieder dazugelernt :-)

        Liebe Grüße -
        Sebastian

  2. Hallo Sebastian,

    1. wie elimiert man dieses \ ?

    php-faq: 16.13. Wieso wird aus " plötzlich " und wie geht das wieder weg?

    1. soll man es vor dem Eintrag in MySQL elimieren oder erst bei der Ausgabe?

    Vor dem Eintragen. Die Daten werden so gespeichert, wie du (bzw. der User) sie eingegeben hast - und den Backslash hast du ja nicht eingegeben.

    Grüße aus Nürnberg
    Tobias