der hans: Anfängerfehler ausbaden - Datensätze wieder in Rohformat

Hallo@all,

habe leider einen dummen Anfängerfehler gemacht und zwar habe ich alle meine Datensätze für die Datenbank vorher mit htmlentities() behandelt.

d.h. sie stehen nun nicht mehr in der Rohform in der Datenbank und das ist ja mehr als schlecht wie ich dann jetzt rausfand.

Ich hab gedacht ich schreib irgendwie nen Script, des die ganzen Datensätze ändert.
Aber wie mach ich das??
Wie ändere ich alle Datensätze?? Vllt sogar die Datensätze einer ganzen DB??
Wie mach ich htmlentities() rückgangig?? hab sogar immer noch den 2. Parameter ENT_QUOTES immer angegeben so dumm wie ich bin/war.

Hat jemand ne Idee??

grüßele aus franken

  1. Hi,

    habe leider einen dummen Anfängerfehler gemacht und zwar habe ich alle meine Datensätze für die Datenbank vorher mit htmlentities() behandelt.

    prima! Aus nichts lernt man so gut, wie aus Fehlern. Weisheit ist, aus den Fehlern _anderer_ zu lernen ;-)

    Wie mach ich htmlentities() rückgangig??

    Das kann jeder Browser ganz hervorragend.

    hab sogar immer noch den 2. Parameter ENT_QUOTES immer angegeben so dumm wie ich bin/war.

    Na, dann sollten die Werte ja in einem value-Attribut eines Eingabefeldes gut untergebracht sein.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. echo $begrüßung;

    habe leider einen dummen Anfängerfehler gemacht und zwar habe ich alle meine Datensätze für die Datenbank vorher mit htmlentities() behandelt.
    Ich hab gedacht ich schreib irgendwie nen Script, des die ganzen Datensätze ändert.
    Aber wie mach ich das??

    Als erstes eine Kopie der Daten anlegen, nicht dass sie durch deine Versuche noch mehr ruiniert werden.
    Dann wird wohl nicht viel mehr übrig bleiben, als ein ganz normales Auslesen mittels PHP-Script, für jedes relevante Feld die Gegenmethode zu htmlentities() anwenden, und INSERT-Statements generieren (mysql_real_escape_string() nicht vergessen!). Die kannst du entweder gleich in eine zweite Tabelle einlesen oder in einer Datei sammeln, um sie komplett einzuladen (beispielsweise phpMyAdmin-Import - Zeichenkodierungsangabe beachten!)
    Wenn es viele Daten sind, kommt eventuell das Script an Laufzeitbegrenzungen. Wenn du sie nicht ausschalten kannst, müsstest du dir überlegen, wie du sie in Häppchen aufteilen kannst.

    Wenn die Anzahl der Sonderzeichen begrenzt ist, ginge auch noch ein Export der gesamten Tabelle und dann mit einem Texteditor die Entities durch die eigentlichen Zeichen ersetzen (Maskierungen beachten!)

    Wie mach ich htmlentities() rückgangig?? hab sogar immer noch den 2. Parameter ENT_QUOTES immer angegeben so dumm wie ich bin/war.

    Das Handbuch führt dazu auf der htmlentities()-Seite html_entity_decode() auf.

    Beachtenswert ist noch, wenn der MySQL-Server in einer Version größer/gleich 4.1 vorliegt, welche Zeichenkodierung für die Client-Kommunikation eingestellt ist. Am besten mit einem SET NAMES die gewünschte und bei html_entity_decode() verwendete Kodierung explizit festlegen.

    echo "$verabschiedung $name";

    1. Hi@all,

      DANKE ERTSMAL FÜR DIE ANTWORTEN!!!

      Also ich habe da noch so meine Probleme.
      Mein Ansatz.

      $select="SELECT * FROM tabelle1";
      $take=mysql_query($select);
      while ($row->mysql_fetch_object($take)) {
        $spalte1_alt=$row->spalte1;
        $spalte1=html_entity_decode($row->spalte1);
        $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
        $update=mysql_query($aendern);
        }

      Geht das so ordentlich??????????????
      Für jede Tabelle einzeln??????

      Das mit den "Zeichenkodierung für die Client-Kommunikation" peil ich net :-(

      Danke für Hilfe

      grüßele aus franken

      1. hi,

        $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';

        Zitat dedlfix:

        und INSERT-Statements generieren (mysql_real_escape_string() nicht vergessen!).

        gruß,
        wahsaga

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

          $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';

          Zitat dedlfix:

          und INSERT-Statements generieren (mysql_real_escape_string() nicht vergessen!).

          gruß,
          wahsaga

          Hi,

          oh sorry des hab ich natürlich ganz vergessen:

          $select="SELECT * FROM tabelle1";
          $select=mysql_real_escape_string($select);
          $take=mysql_query($select);
          while ($row->mysql_fetch_object($take)) {
            $spalte1_alt=$row->spalte1;
            $spalte1=html_entity_decode($row->spalte1);
            $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
            $aendern=mysql_real_escape_string($aendern);
            $update=mysql_query($aendern);
            }

          So in etwa???

          Und funktioniert das dann auch??

          Geht das irgendwie für die ganze Datenbank??
          Das mit den "Zeichenkodierung für die Client-Kommunikation" peil ich net :-(

          danke nochmal
          und wiedermal a grüßele

          1. Moin!

            Zwei Fragen:

            1. Warum nutzt du hier Objekte?

            while ($row->mysql_fetch_object($take)) {

            Nimm doch einfach die Arrayversion. Ich glaube kaum, dass du schon objektorientiert programmieren kannst.

            2. Hast du die Dokumentation zu mysql_real_escape_string() schon mal gelesen und dort genannte Beispiele verstanden?

            $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
              $aendern=mysql_real_escape_string($aendern);
              $update=mysql_query($aendern);

            Das hier sieht jedenfalls nicht so aus.

            So in etwa???

            Nein, alles falsch!

            Und funktioniert das dann auch??

            Sicher nicht!

            Geht das irgendwie für die ganze Datenbank??

            Nein, nicht automatisch.

            Das mit den "Zeichenkodierung für die Client-Kommunikation" peil ich net :-(

            Jedes Schriftzeichen muß irgendwie in Bytes codiert sein. Welche Codiervorschrift benutzt wird, kann variieren, muß aber festgelegt werden, damit es nicht zur Verwirrung kommt.

            Und? Welche Zeichencodierung benutzt du?

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo,

              ICH MELDE MICH NOCHMAL AUS MEINEM ERDLOCH IN DEM ICH MICH VERGRABEN HAB UM MICH ZU SCHÄMEN!!! fragt sich wie lange ich mich noch schämen muss...

              Sorry aber ich bin zu ****

              Also dann in etwa so??

              $select="SELECT * FROM tabelle1";
              $select=mysql_escape_string($select);
              $take=mysql_query($select);
              while ($row->mysql_fetch_object($take)) {
                $spalte1_alt=$row->spalte1;
                $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,UTF-8);
                $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
                $aendern=mysql_escape_string($aendern);
                $update=mysql_query($aendern);
                }

              grießele

              1. hi,

                ICH MELDE MICH NOCHMAL AUS MEINEM ERDLOCH IN DEM ICH MICH VERGRABEN HAB UM MICH ZU SCHÄMEN!!! fragt sich wie lange ich mich noch schämen muss...

                So lange, bis du die Funktion zu einem sinnvollen Zeitpunkt einsetzt.

                $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,UTF-8);
                  $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
                  $aendern=mysql_escape_string($aendern);

                Lass dir jetzt $aendern zur Kontrolle ausgeben - hältst du das für eine sinnvolle (My)SQL-Anweisung?

                Falls fälschlicherweise Ja - dann teste diese Query per Copy&Paste im phpMyAdmin o.ä., und schau dir die Fehlermeldung an.

                Und dann wirf nochmal einen Blick ins Handbuch, wann und worauf die Funktion dort angewendet wird.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Oh mann ich bin so entäuscht von mir...

                  $select="SELECT * FROM tabelle1";
                  $take=mysql_query($select);
                  while ($row->mysql_fetch_object($take)) {
                    $spalte1_alt=$row->spalte1;
                    $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,UTF-8);
                    $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='".mysql_escape_string($aendern)."';
                    $update=mysql_query($aendern);
                    }

                  Jetzt?
                  Hab ich was zwecks SQL-Injection vergessen?

                  *bitte-nicht-hoff-langsam-an-sich-selber-zweifel*

                  grüße

                  1. hi,

                    $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='".mysql_escape_string($aendern)."';

                    Du hast an zwei Stellen Daten in die Query eingesetzt, von denen du (nicht sicher) weißt, was sie enthalten, möglicherweise "schädliches" - wieso behandelst du nur eine davon?

                    Und was enthält eigentlich $aendern im ersten Schleifendurchlauf?
                    Und was im zweiten, dritten, ...?

                    gruß,
                    wahsaga

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

                      $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='".mysql_escape_string($aendern)."';

                      Und was enthält eigentlich $aendern im ersten Schleifendurchlauf?
                      Und was im zweiten, dritten, ...?

                      Aber wenigstens wird DAS korrekt escaped. ;)

                      - Sven Rautenberg

                      --
                      "Love your nation - respect the others."
                    2. Hi,

                      ich bleib wohl lieber in meinem erdloch...

                      $select="SELECT * FROM tabelle1";
                      $take=mysql_query($select);
                      while ($row->mysql_fetch_object($take)) {
                        $spalte1_alt=$row->spalte1;
                        $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,UTF-8);
                        $aendern="UPDATE tabelle1 SET spalte1='".mysql_real_escape_string($spalte1_alt)."' WHERE spalte1='".mysql_escape_string($spalte1)."';
                        $update=mysql_query($aendern);
                        }

                      So?

                      gruß

                      1. hi,

                        ich bleib wohl lieber in meinem erdloch...

                        Ja - und wenn du nur immer wieder auf's neue irgendwelchen Code postest und "so?" fragst, anstatt mal auf Rückfragen einzugehen - dann sollte auf das Erdloch auch noch ein Deckel, und darauf ein schwerer Stein ...

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. echo $begrüßung;

        $select="SELECT * FROM tabelle1";
        $take=mysql_query($select);
        while ($row->mysql_fetch_object($take)) {
          $spalte1_alt=$row->spalte1;
          $spalte1=html_entity_decode($row->spalte1);
          $aendern="UPDATE tabelle1 SET spalte1='$spalte1' WHERE spalte1='$spalte1_alt';
          $update=mysql_query($aendern);
          }

        Geht das so ordentlich??????????????
        Für jede Tabelle einzeln??????

        Die Anzahl der Fragezeichen stimmt nicht mit der Anzahl der Fragen überein.

        Im Prinzip sollte das so gehen, wobei du die Maskierung der Daten unterschlagen hast. Was passiert den, wenn in $spalte1 ein ' drin steht? Das gibt einen SQL-Syntax-Fehler. Da du außerdem auch noch die Fehlerzutände komplett ignoriert hast, werden dir diese Fehler auch nicht auffallen.
        Die mysql_*-Funktionen geben aus Rückgabewert false zurück, wenn etwas nicht geklappt hat. Nachfolgende Funktionen mögen diesen Wert überhaupt nicht und beschweren sich zu Recht darüber. Was sollen sie auch beispielsweise anstellen, wenn schon der Verbindungsaufbau nicht geklappt hat? Wie sollen sie Daten abholen, wenn die Query versagte?

        Das mit den "Zeichenkodierung für die Client-Kommunikation" peil ich net :-(

        MySQL (ab Version 4.1) kann aufgrund seiner Konfiguration annehmen, dass die Daten, die vom Client kommen, UTF-8-kodiert sind. Wenn nun aber Daten in ISO-8859-1-Kodierung (latin1) kommen - bzw. allgemein mit einer anderen als der eingestellten Kodierung - kommt es zu Datenverlust, weil ein beispielsweise ein ISO-8859-1-Zeichen mit einem Bytewert größer als 127 keine gültige UTF-8-Zeichensequenz darstellt.
        Wenn ich annehme, jemand redet portugiesisch und versuche sein Gelaber mit einem portugiesischen Wörterbuch zu dekodieren, er stattdessen aber spanisch redet, funktioniert das mit der Übersetzung mehr oder weniger nicht. Deshalb müssen beide Seiten einer Kommunikation im Klaren darüber sein, welche gemeinsame Kodierung zu verwenden ist.

        Hast du nur einen MySQL-Server mit einer Version bis einschließlich 4.0 wirst du ISO-8859-1/latin1 als Kodierung haben. Dann brauchst du dir normalerweise keine Gedanken zu machen. Ab Version 4.1 kommt es darauf an, wie der Server konfiguriert ist. SET NAMES latin1  dürfte dann das Statement sein, das, einmalig nach dem Verbindungsaufbau gesendet, für Klarheit sorgt, da du bei Verwendung von html_entity_decode keine Angaben zum Charset gemacht hast und damit ISO-8859-1 genommen wird.

        echo "$verabschiedung $name";

  3. Hallo,

    hab's jetzt dann so probiert (lokal in meiner Testumgebung!!!):

    $select="SELECT * FROM tabelle1";
    $take=mysql_query($select);
    while ($row->mysql_fetch_object($take)) {
      $spalte1_alt=$row->spalte1;
      $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,ISO8859-1);
      $aendern="UPDATE tabelle1 SET spalte1='".mysql_real_escape_string($spalte1)."' WHERE spalte1='".mysql_escape_string($spalte1_alt)."';
      $update=mysql_query($aendern);
      }

    Leider beanstandete er dann aus mir unbekannten Gründen meinen angegebenen Zeichensatz bei html_entity_decode()
    Soweit so gut
    Hab ich den Parameter also Testweise weggelassen.
    Und es klappte,
    LEIDER nicht so wie ich mir das dachte:
    einige Zeichen wurden entfernt, andere blieben aber als html-code stehen, verstehe das wer will.

    Erschwerend kommt hinzu, dass ich noch einen schwerwiegenden fehler auszubaden habe - nl2br();

    in der Datenabank stehen alle Datensätze schon mit <br />

    Was nu?

    Sorry, dass ich nerve, aber ich möchte diesen Fehler so schnell, wie möglich beseitigen, dass sich die Fehlerhaften Datensätze nicht vermehren...

    grüßle aus franken

    1. echo $begrüßung;

      $spalte1=html_entity_decode($row->spalte1,ENT_QUOTES,ISO8859-1);
      Leider beanstandete er dann aus mir unbekannten Gründen meinen angegebenen Zeichensatz bei html_entity_decode()

      ENT_QUOTES ist eine vordefinierte Konstante, ISO8859-1 ist das nicht. Stattdessen wird versucht eine Konstante namens ISO8859 zu finden. PHP findet nichts und denkt sich: "Der wollte sicherlich nur einen String notieren und hat die Anführungszeichen vergessen. Denk ich mir das mal als String." Das anschließende -1 (minus eins) wird versucht mit dem String zu verrechnen. Der String fängt nicht mit einer Zahl an, also kommt bei der Typumwandlung 0 raus. 0-1 ergibt -1, und das ist kein gültiger Wert aus der Liste der "Supported charsets". Diese Meldung wirst du gesehen haben. Den Teil aus dem Anfang meiner Erklärung sieht man, wenn man das error_reporting auf E_ALL stellt und damit wichtige Hinweismeldungen nicht mehr unterdrückt werden.

      Wenn du von Fehlermeldungen spricht ist es meist hilfreich, den genauen Wortlaut nicht für dich zu behalten. Sonst behalten wir unsere Kommentare dazu auch für uns :-)

      Hab ich den Parameter also Testweise weggelassen.

      iso-8859-1 ist sowieso der Standard-Wert und kann damit entfallen.

      einige Zeichen wurden entfernt, andere blieben aber als html-code stehen, verstehe das wer will.

      Beispiele bitte.

      $aendern="UPDATE tabelle1 SET spalte1='".mysql_real_escape_string($spalte1)."' WHERE spalte1='".mysql_escape_string($spalte1_alt)."';

      Achte darauf, bei mysql_real_escape_string das real_ zu verwenden. Die Variante ohne real_ sollte nicht verwendet werden.

      Erschwerend kommt hinzu, dass ich noch einen schwerwiegenden fehler auszubaden habe - nl2br();
      in der Datenabank stehen alle Datensätze schon mit <br />

      Genauer gesagt wurde durch das nl2br() vor einen Zeilenumbruch ein <br /> eingefügt. Der Zeilenumbruch selbst blieb erhalten, falls er nicht auf dem Wege in die Datenbank verloren ging. Einfacherweise wäre also das <br /> durch nichts zu ersetzen. Nimmt man an, dass der Zeilenumbruch verloren ging, könnte man zuerst alle <br />\n durch \n ersetzen und anschließend die übrig gebliebenen <br /> ohne \n durch \n ersetzen.

      Sorry, dass ich nerve, aber ich möchte diesen Fehler so schnell, wie möglich beseitigen, dass sich die Fehlerhaften Datensätze nicht vermehren...

      Solche Aussagen haben auf die Beantwortung deiner Fragen höchstens negative Auswirkungen. "Wir" sind im Allgemeinen ziemlich fix beim Beantworten, aber dieses Forum ist keine Express-Hotline. In welcher Zeit du dein Problem gelöst bekommst, ist "uns" egal. Du kannst aber davon ausgehen, dass wir dir ansonsten nach besten Kräften helfen.

      echo "$verabschiedung $name";

      1. Hi,

        also gut das mit dem ISO ist klar, wenn das Standard ist kann ich's weglassen - das kapier sogar ich.

        Also wegen dem Fehler tut mir leid, aber ich habe diesen nicht mehr hinbekommen ^^ bin mir aber sicher, dass er so in etwa das von dir vermutete enthalten hat!

        Hier ein Beispiel eines mit dem von mit genannten Scripts geänderten Wertes:
        ----
        Diese l&auml;stige Werbung im G&auml;stebuch.<br />
        Was mit dem Häkchen, das man entfernen muss, damit der Gästebucheintrag angenommen wird?
        ----

        Ok hab beides schonmal wo gelesen, dann bin ich wohl durcheinander gekommen mit dem real. Aber es steht ja auch in den Handbüchern & Co explizit drin, dass man mysl_real_escape_string() verwenden soll.

        Wel die Zeilenumbrüche definitiv nicht verloren gegangen sind auf dem Weg in die DB müsste ja Folgendes reichen?
        $spalte1=str_replace("<br />", "", $spalte1);
        Vor oder nach html_entity_decode sollte ja egal sein!?

        Also meine Äußerung, dass ich das Problem so schnell wie möglich behoben habe möchte, SOLLTE KEINESWEGS EINE ART DRUCKMACHE SEIN.

        ICH BIN EUCH BIS HIER HIN SCHONMAL SEHR DANKBAR.

        SO EINEM SCHWEREN SCHÜLER WIE MIR TROTZDEM NOCH ZU HELFEN

        grüßele aus franken