Jochen Gebauer: "//////////"-ERROR anstatt Text

Hi,

ich möchte längeren Text (wie z.B. diesen hier) über eine Textbox "erfassen" und in eine MySQL-Tabelle schreiben - klappt auch alles prima aber manchmal speichert sich nicht der ganze Text ab sondern es folgen auf die ersten Worte "//////////" solche Slashs. Weiß jemand an was das liegen könnte? - Vielleicht ist es kein MYSQL sondern ein PHP oder HTML-FORM Problem?

Danke schon mal für die Hilfe!

Jochen

  1. Moin Jochen,

    ich möchte längeren Text (wie z.B. diesen hier) über eine Textbox "erfassen" und in eine MySQL-Tabelle schreiben - klappt auch alles prima aber manchmal speichert sich nicht der ganze Text ab sondern es folgen auf die ersten Worte "//////////" solche Slashs. Weiß jemand an was das liegen könnte? - Vielleicht ist es kein MYSQL sondern ein PHP oder HTML-FORM Problem?

    Glasgoogle läßt grüßen. Wie ist das Feld in der MySql angelegt?
    Longtext? Varchar?

    regds
    Mike©

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. Hi Mike,

      es ist ein Longtext.

      Danke, dass Du Dich der Sache annimmst...

      Jochen

      Moin Jochen,

      ich möchte längeren Text (wie z.B. diesen hier) über eine Textbox "erfassen" und in eine MySQL-Tabelle schreiben - klappt auch alles prima aber manchmal speichert sich nicht der ganze Text ab sondern es folgen auf die ersten Worte "//////////" solche Slashs. Weiß jemand an was das liegen könnte? - Vielleicht ist es kein MYSQL sondern ein PHP oder HTML-FORM Problem?

      Glasgoogle läßt grüßen. Wie ist das Feld in der MySql angelegt?
      Longtext? Varchar?

      regds
      Mike©

      1. Moin Jochen,

        Danke, dass Du Dich der Sache annimmst...

        nichts zu Danken. Ich habe mich noch nicht der Sache angenommen ;-)

        Was bedeutet "manchmal", ist das reproduzierbar?
        Wie behandelst Du Sonderzeichen? (stripshlashes) usw...

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. ich hab noch kein Muster feststellen können bei diesen Fehlern. Sie scheinen allerdings nicht Textlängenabhängig zu sein. Sonderzeichen behandle ich irgendwie gar nicht - hab keine Ahnung wie man Einfluss auf die Sonderzeichen nehmen kann, die andere angeben... (sorry für die Unwissenheit)

          Jochen

          1. Moin Jochen,

            »» ich hab noch kein Muster feststellen können bei diesen Fehlern. Sie scheinen allerdings nicht Textlängenabhängig zu sein. Sonderzeichen behandle ich irgendwie gar nicht - hab keine Ahnung wie man Einfluss auf die Sonderzeichen nehmen kann, die andere angeben... (sorry für die Unwissenheit)

            Ich haue mich gleich in die Kiste, aber hast Du einen Link zu der Page , damit man das testen kann?

            regds
            Mike©

            PS: Der Einwand von Tobias sollte geprüft werden! Magic-Quotes

            --
            Freunde kommen und gehen. Feinde sammeln sich an.
            1. hier der Link zu der Untersuchung:

              http://www.psy.de/sapjeg21

              Danke noch mal!

              Jochen

              1. Hallo Jochen,

                http://www.psy.de/sapjeg21

                Wenn ich in eines der Text-Felder z.B. »foo"bar« eingebe, steht auf der nächsten Seite im Quellcode:
                  <input type="hidden" name="cogsup_se" value="foo"bar">

                • und hier ist dann nach »foo\« der Wert des value-Attributes zu Ende (auf der nächsten Seite steht dann
                    <input type="hidden" name="cogsup_se" value="foo\">
                  im Code). Die vielen \ kommen daher, weil magic_quotes »'«, »"«, »\«, und NULL mit einem \ maskiert - und bei mehreren Schritten werden es eben immer mehr.

                Du musst also den Link aus meinem Posting lesen, sowie htmlentities() bzw. htmlspecialchars() auf das, was du in die hidden-Felder als value schreibst, anwenden.

                Grüße aus Nürnberg
                Tobias

                1. Hallo Tobias,

                  ich hab zwar überhaupt keine Ahnung was ich nun machen soll, aber das was Du schreibst hört sich verdammt plausibel an!!! Also werd ich all die Literaturtips mal durchlesen und hoffe es dann auf die Reihe zu bekommen. Vielen, vielen Dank für Deine Hilfe!

                  Jochen

                  P.s. darf ich Dir ne E-Mail schrieben, wenn ich gar nicht mehr weiter weiß?

                  1. Hallo Jochen,

                    ich hab zwar überhaupt keine Ahnung was ich nun machen soll, aber das was Du schreibst hört sich verdammt plausibel an!!!

                    :-)

                    P.s. darf ich Dir ne E-Mail schrieben, wenn ich gar nicht mehr weiter weiß?

                    bleib lieber hier im Forum - dann haben die die (irgendwann) das gleiche Problem haben auch was davon (falls dieser Thread schon im Archiv sein sollte, kannst du ja einen neuen aufmachen).

                    Grüße aus Nürnberg
                    Tobias

                    1. Hallo Tobias,

                      wie bekomme ich den Zugriff auf die php.ini? Den Befehl, den ich direkt aus der PHP-Datei ausführen kann kann ich leider ja nicht verwenden, weil es bei mir ja um "POST" geht.

                      Wenn ich die PHP.ini verändert habe - muss ich dann noch die Zeichen umwandeln?

                      Sorry für die Unwissenheit,

                      viele Grüße aus Cardiff (Wales),

                      Jochen

                      1. Hallo Jochen,

                        wie bekomme ich den Zugriff auf die php.ini?

                        wenn du nicht deinen eigenen Server hast: garnicht.

                        Den Befehl, den ich direkt aus der PHP-Datei ausführen kann kann ich leider ja nicht verwenden, weil es bei mir ja um "POST" geht.

                        ähh... von was redest du?

                        Grüße aus Nürnberg
                        Tobias

                        1. Ich kann die .php Datei-Veränderungsvariante ja nicht nutzen, da ich magic_quotes_gpc ändern muss - stimmt doch!? - D.h. mir bleibt jetzt nur noch die .htaccess (was die "httpd.conf" ist weiss ich gar nicht) um magic_quotes_gpc auszuschalten. Nur dumm, dass ich leider auch nicht weiss, wie man die .htaccess editiert...

                          Wenn ich diese . htaccess dann editiert habe, brauch ich dann noch "htmlentities"?

                          1. Hallo Jochen,

                            Ich kann die .php Datei-Veränderungsvariante ja nicht nutzen, da ich magic_quotes_gpc ändern muss - stimmt doch!?

                            nicht unbedingt - es reicht auch wenn du die Daten mit stripslashes() behandelst.

                            • D.h. mir bleibt jetzt nur noch die .htaccess (was die "httpd.conf" ist weiss ich gar nicht)

                            die httpd.conf ist die Konfigurationsdatei des Apachen.

                            um magic_quotes_gpc auszuschalten. Nur dumm, dass ich leider auch nicht weiss, wie man die .htaccess editiert...

                            das steht doch auch auf http://php-faq.de/q/q-magic-quotes.html: mit
                              php_flag magic_quotes_gpc off
                            .

                            Wenn ich diese . htaccess dann editiert habe, brauch ich dann noch "htmlentities"?

                            ja. Mit stripslashes() bekommst du zwar die \ weg - in deinem Code stünde dann aber immer noch:
                              <input type="hidden" name="cogsup_se" value="foo"bar">
                            und das »bar« würde itrotzdem noch abgeschnitten werden. Mit htmlentites() wird daraus dann:
                              <input type="hidden" name="cogsup_se" value="foo&quot;bar">

                            • und dann kommt auf der nächsten Seite »foo"bar« an.

                            Grüße aus Nürnberg
                            Tobias

                            1. Hi Tobias,

                              gute Nachrichten - ich glaube, dass ich das mit dem .htaccess gechecket habe und ne .htaccess Datei setzen kann (muss ja nur die eine Zeile "php_flag magic_quotes_gpc     off" rein, oder?).

                              Auch zum Setzten des "htmlentities" Befehls hab ich da so ne "Theorie"... stimmt es, dass ich bei der Variablenübergabe von "$cogsup_st" anstatt wie bisher:

                              <input type="hidden" name="cogsup_st" value="<?php echo $cogsup_st;?>">

                              nun:

                              <input type="hidden" name="cogsup_st" value="<?php echo htmlentities ($cogsup_st);?>">

                              angeben muss? Ist dann das Problem gelöst? Warum muss ich denn magic_quotes_gpc überhaupt auf "off" setzen, wenn ich durch "htmlentities" sowieso die kritischen Zeichen ersetze? und würdest Du eher "htmlentities" oder "htmlspecialchars" als Befehl verwenden? Fragen über Fragen - aber ich Danke Dir ich komme der Lösung näher!!!

                              Jochen

                              1. Hallo Jochen,

                                gute Nachrichten - ich glaube, dass ich das mit dem .htaccess gechecket habe und ne .htaccess Datei setzen kann (muss ja nur die eine Zeile "php_flag magic_quotes_gpc     off" rein, oder?).

                                ja - du musst dann aber wirklich wissen was du tust und _immer_ darauf achten, dass du die Daten die von außen kommen entsprechend behandelst.

                                <input type="hidden" name="cogsup_st" value="<?php echo htmlentities ($cogsup_st);?>">
                                angeben muss?

                                ja.

                                Ist dann das Problem gelöst? Warum muss ich denn magic_quotes_gpc überhaupt auf "off" setzen, wenn ich durch "htmlentities" sowieso die kritischen Zeichen ersetze?

                                magic_quotes und htmlentites() sind zwei verschiedene Paar Schuhe. magic_quotes_gpc sorgt dafür, dass Daten die von außen kommen "entschärft" werden und z.B. keinen Schaden anrichten können, wenn sie ungeprüft in ein Query für eine Datenbankabfrage eingebaut werden - es ist also ein Selbstschutz für unerfahrene Programierer. htmlentities() dagegen maskiert einfach die HTML-eigenen Zeichen.

                                und würdest Du eher "htmlentities" oder "htmlspecialchars" als Befehl verwenden?

                                dass musst du wissen, htmlspecialchars() wandelt nur die HTML-eigenen Zeichen in Entities um -  htmlentities() dagegen wandelt auch Sonderzeichen in Entities um. Ich verwende zwar zur Zeit meist htmlentities, werde aber wohl auf htmlspecialchars() umsteigen, da ich nur die Sonderzeichen maskiert haben will (frag mich nicht, warum ich dann htmlentities() eingebaut habe :-)).

                                Grüße aus Nürnberg
                                Tobias

                        2. Hab grad mal die Daten gecheckt - Du hattest 100% recht!!! Überall wo die Vpn so was wie "should't" geschrieben haben ergibt sich "should//////////////////////////////////////////////////..." (bestimmt bis zu 1000 Zeichen...). Ist mir in Deutschland deswegen nie begegnet das Problem, da da niemand diese "'" Dinger da benutzt...

                          Grüße, Jochen

                          1. hi,

                            Ist mir in Deutschland deswegen nie begegnet das Problem, da da niemand diese "'" Dinger da benutzt...

                            etwas ahnung von dem, was man tut, sollte man aber nichts desto trotz haben ... und da fehlt bei dir noch 'ne menge.

                            gruß,
                            wahsaga

                            --
                            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                            1. Hallo wahsaga,

                              Ist mir in Deutschland deswegen nie begegnet das Problem, da da niemand diese "'" Dinger da benutzt...

                              etwas ahnung von dem, was man tut, sollte man aber nichts desto trotz haben ... und da fehlt bei dir noch 'ne menge.

                              ich schätze deine _konstruktiven_ beiträge! diesen hier würde ich aber als abschätzig bezeichnen.

                              Grüsse
                              Siramon,
                                   ja der Penner aus Nr. 14

                              1. hi,

                                ich schätze deine _konstruktiven_ beiträge! diesen hier würde ich aber als abschätzig bezeichnen.

                                ich eher als realistisch.

                                gruß,
                                wahsaga

                                --
                                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    2. Ich gebe den Text (d.h. die Variable) mit Hidden-Fields über mehrere PHP-Seiten weiter (und sammle dort noch ein paar Vars auf), bis ich dann am Ende alles in die Tabelle schreibe - vielleicht ist das ein Problem?

      Jochen

      1. Moin Jochen,

        Ich gebe den Text (d.h. die Variable) mit Hidden-Fields über mehrere PHP-Seiten weiter (und sammle dort noch ein paar Vars auf), bis ich dann am Ende alles in die Tabelle schreibe - vielleicht ist das ein Problem?

        ich würde mir in diesem Fall den String vor der Speicherung auf der Page ausgeben lassen, um zu sehen wie er den aussieht und ob er mit dem gespeicherten überein stimmt.

        Die Fehlersuche bzw Debugging und / oder logisches Vorgehen bei der Fehlersuche ist meist das Problem.

        Fehlerquelle eingrenzen ( von innen nach außen ) Viele Ausgaben zur Kontrolle machen.

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. Hello Mike,

          ich würde mir in diesem Fall den String vor der Speicherung auf der Page ausgeben lassen, um zu sehen wie er den aussieht und ob er mit dem gespeicherten überein stimmt.

          Das ist kein guter Tipp von Dir, sondern nur ein mangelhafter. ;-)
           Bei der Ausgabe der Zeichenkette im Browser, bzw in einem <input>- oder <textarea>-Feld eines HTML-Forumlares kommen schon die nächsten Probleme. Die addieren sich dann ggf. mit den schon vorhandenen. Wie soll ein "Laie" da nch durchsteigen? Siehe [http://forum.de.selfhtml.org/?t=99238&m=606129]

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
      2. Hallo Jochen,

        Ich gebe den Text (d.h. die Variable) mit Hidden-Fields über mehrere PHP-Seiten weiter

        ich tippe mal auf http://php-faq.de/q/q-magic-quotes.html.

        Grüße aus Nürnberg
        Tobias

        1. Hallo Tobias,

          was bei mir passiert ist, dass der Text meiner "Versuchspersonen" (ich bin Psychologe und führe Online-Studien durch...) einfach abgeschnitten wird und dann einige (bis zu mehreren 100) solche Slashs erscheinen. Ich glaube, dass das nichts mit dem von Dir beschriebenen Problem zu tun hat.

          Danke, dass Du Dir gedanken über mein Problem machst!

          Jochen

          1. Hello,

            was bei mir passiert ist, dass der Text meiner "Versuchspersonen" (ich bin Psychologe und führe Online-Studien durch...) einfach abgeschnitten wird und dann einige (bis zu mehreren 100) solche Slashs erscheinen. Ich glaube, dass das nichts mit dem von Dir beschriebenen Problem zu tun hat.

            Ja, da hast Du an mindestens zwei Stellen schwere Versäumnisse in Deinen Scripten.

            1. Wenn get_magic_Quotes_gpc() === true; dann werden von PHP die Daten automatisch maskiert,
               damit z.B. Psychologen ihren Job machen können, dafür _einfache_ Formulare einsetzen können,
               ohne gleich Webprogrammierer werden zu  müssen. Du hast aber schon ein komplexes System gebaut.
               Da musst Du dann die Daten erst wieder demaskieren mit stripslashes()

            2. Wenn die Daten dann wieder ausgegeben werden an den HTML-Browser, müssen sie vorher codiert
               werden. Das macht man z.B. mittels htmlentities(). Alle Quotations, Umlaute  und
               HTML-eigenen Zeichen werden dann codiert. Dann werden (vermutlich) auch keine Texte mehr
               "abgeschnitten".

            3. Wenn die Daten in die Datenbankl geschrieben werden sollen, und vorher ordnungsgemäß
               von Dir durch demaskierung ins Roh-Format zurückversetzt wurden, dann musst Du sie für
               die Datenbank erst wieder datanbankgerecht maskieren. Dafür eignet sich aber in den
               seltensten Fällen addslashes(), dass von PHP intern unter (1) benutzt wird, sondern
               Du benötigst die zur textschnittstelle der Datenbank passende Maskierungsfunktion.
               Für MySQL heißt die mysql_[real_]escape_string(). Die Maskierungen werden nicht mit
               abgespeichert. Wenn man die Daten wiederholt, sind sie also wieder raw.

            Dann gibts auch keine Probleme mehr mit Tabulatorzeichen, Zeilenendezeichen, NUL-Zeichen
               usw.

            http://de3.php.net/manual/de/function.get-magic-quotes-gpc.php
            http://de3.php.net/manual/de/function.stripslashes.php
            http://de3.php.net/manual/de/function.addslashes.php
            http://de3.php.net/manual/de/function.htmlentities.php
            http://de3.php.net/manual/de/function.htmlspecialchars.php
            http://de3.php.net/manual/de/function.htmlspecialchars.php
            http://de3.php.net/manual/de/function.mysql-real-escape-string.php

            Tipp 1:
            Das entfernen der Maskierungen kann man am besten gleich in der Section "Datenübernahme" seines Scriptes rekursiv auf den gesamten betroffenen Parameterkanal (GET, POST, COOKIE) anwenden:

            #------------------------------------------------------------------------------
            function strip($_data)
            {
              if (!get_magic_quotes_gpc())  ## nur anwenden, wenn PHP maskiert hat
              {
                return $_data;              ## Sonst Array unverändert zurückgeben
              }

            if (is_array($_data))         ## ist der Wert ein Zeiger auf ein Unterarray?
              {
                foreach($_data as $key => $val)  ## Dann für dieses ebenfalls die Funktion
                {
                  $_data[$key] = strip($val);    ## benutzen
                }
              }
              else
              {
                $_data = stripslashes($_data);   ## Wenn der Wert ein Skalar ist,
              }                                  ## Demaskierung durchführen

            return $_data;                     ## und zurück zur nächst höheren Ebene
            }
            #------------------------------------------------------------------------------

            $_POST = strip($_POST);

            Tipp 2:
            Wenn die Daten, die man aus der Datenbank wiederholt, in einem normalen HTML-text ausgegeben werden sollen, also nicht in einer <textarea>, dann muss man die Zeilenumbrüche (wenn man sie anzeigen will), durch Einfügen von <br /> hervorrufen.

            $HTMLout = nl2br(htmlentities(wordwrap($data,$colwidth,"\r\n")));

            wobei das "\r\n" auf jeden Fall noch weiteren Diskussionsbedarf enthält.
            Das würde hier aber zu weit führen. In PERL dürfte man das so nicht übernehmen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau