Uwe82: mysql textfeld als 'text' deklariert?

Guten Abend,

ich habe ein komsiches Problem und zwar habe ich in meiner MySQL datendank ein feld in dem text gespeichert werden soll auch als 'text'-spalte deklariert.

Wenn ich nun folgendes rein schreiben will:

5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555

kommt nur das hier in der Datenbank an:

99999999999999999999999999999999999999999999999999999999999999999

Ich kann mir diesen Fehler nicht erklären und finde auch keine infos über dieses Problem. ich hoffe das mit jemand von euch weiter helfen kann und sagen kann was da vor sich geht.

--
lg uwe82
  1. Was mit weiter zu diesem Problem aufgefallen ist, das er die 5en nur umwandelt wenn es mehr als 65 sind! außerdem muss die Zeichenkette am Anfang des Strings stehen damit sie in 9en umgewandelt werden sobald man an die 65 zeichen einen buchstaben dranhängt wandelt er sie nicht um!

    ich habe hier: http://dev.mysql.com/doc/refman/5.1/de/blob.html

    mysql parameter wie max_allowed_packet gefunden, kann das damit zu tun haben? wie gesagt der wandelt das ganze nur um wenn es mehr als 65 5en sind.

    --
    lg uwe
  2. hi,

    Ich kann mir diesen Fehler nicht erklären

    Und du glaubst, mit so wenig Info könnten wir das vielleicht?

    und finde auch keine infos über dieses Problem.

    Wir auch nicht - nicht mal in deinem Posting.

    ich hoffe das mit jemand von euch weiter helfen kann und sagen kann was da vor sich geht.

    Liefere uns bitte ein Mindestmaß an brauchbarer Information - dann können wir weitersehen.
    Tipps für Fragende

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. php-version: php5
      mysql-version: mysql5
      zeichensatz: utf-8

      ein string aus mehr als 65 5en wird zu 65 9en in eine datenbank geschrieben. (Feldername: text deklaration: text)

      Wenn ich an die 5en auch nur einen buchstaben schreibe, dann passiert das ganze nicht!

      mehr weiß ich nicht... ich weiß nicht wieso er den string der nur aus mehr als 65 5en bestehen darf zu 65 9en umwandelt.

      --
      lg uwe82
      1. hi,

        php-version: php5
        mysql-version: mysql5
        zeichensatz: utf-8

        Und deinen Code, den raten wir jetzt?

        ich weiß nicht wieso er den string der nur aus mehr als 65 5en bestehen darf zu 65 9en umwandelt.

        Dann teste erst mal, ob das unabhängig von deinen Scripten auch passiert, wenn du es bspw. über phpMyAdmin machst.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. also mit phpmyadmin geht es!

          hier der code zum eintragen:

          $queryInsert = sprintf("INSERT INTO

          $MYSQL['table']['news']."
          (uid, posteruid, news, timestamp)

          VALUES
          (%s, %s, %s, %s)",

          quote_smart($_POST['uid']),
          quote_smart($Global['uid']),
          quote_smart($_POST['text']),
          quote_smart($time));

          $insert = mysql_query($queryInsert);

          function quote_smart($value)
          {
           // In Anführungszeichen setzen, sofern keine Zahl oder ein numerischer String vorliegt
           if(!is_numeric($value))
           {
            $value = "'" . mysql_real_escape_string($value) . "'";
           }

          return $value;
          }

          --
          lg uwe
          1. hi,

            hier der code zum eintragen:

            Mache Kontrollausgaben.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. ich hab den fehler... und zwar: wenn ich die funktion quote_smart() weg lasse und direkt '%s' schreibe dann trägt er es richtig ein.

              is_numeric kommt wohl mit dem wert nicht klar und lässt die '' weg. ohne die '' gehts nicht.

              --
              lg uwe82
              1. Moin!

                ich hab den fehler... und zwar: wenn ich die funktion quote_smart() weg lasse und direkt '%s' schreibe dann trägt er es richtig ein.

                is_numeric kommt wohl mit dem wert nicht klar und lässt die '' weg. ohne die '' gehts nicht.

                Deine quote_smart-Funktion ist sowieso grob fehlerhaft.

                In SQL dürfen auch Zahlenwerte in Stringbegrenzern stehen. Sie sollten es sogar, denn es bringt absolut keine Vorteile, es nicht zu tun. Der SQL-Befehl ist sowieso ein String, jede Zahl darin befindet sich in Stringdarstellung und muß von der Datenbank sowieso ggf. geparst und in eine passendere interne Darstellung gebracht werden (Integer, Float, etc.).

                Deshalb:
                Faustregel 1: Werte immer in Anführungszeichen packen.
                Faustregel 2: Werte immer escapen (mit mysql_real_escape_string() - nicht mehr, aber auch nicht weniger).

                Wenn du deine quote_smart-Funktion jetzt einfach wegläßt, fehlt dir das Escaping - und das wäre richtig böse!

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. echo $begrüßung;

                  Deine quote_smart-Funktion ist sowieso grob fehlerhaft.

                  Nicht dass ich gegen ordentliches Escaping und generelles (inklusive Zahlen) Quoting argumentieren möchte, aber was konkret sind denn sicherheitstechnische Fehler seiner quote_smart()-Implementation? Welche Werte, die is_numeric() als True wertet sind denn für SQL-Statements gefährlich?

                  echo "$verabschiedung $name";

                  1. Welche Werte, die is_numeric() als True wertet sind denn für SQL-Statements gefährlich?

                    13, 23, 42 und 666, je nach Glaubensgemeinschaft ;-)

                    Aber davon abgesehen: "NULL" ist nicht gleich NULL. Pauschal alles in Anführungszeichen zu setzen ist daher nicht unbedingt ratsam.

              2. is_numeric kommt wohl mit dem wert nicht klar und lässt die '' weg. ohne die '' gehts nicht.

                Nein, is_numeric() macht genau das, was Du möchtest: Es erkennt eine Ziffernkette (das ist der Unterschied zu is_int(), is_numeric() erkennt auch als Text dargestellte Zahlen), woraufhin die Anführungszeichen weggelassen werden und statt eines Textes eine Zahl im SQL-Befehl auftaucht. Für MySQL ist diese Zahl zu groß, so dass es stattdessen den maximal möglichen Wert in die Datenbank schreibt.

                PS: Ein Ersetzen von is_numeric() durch is_int() bringt nichts, da aus Formulardaten ausschließlich Textvariablen entspringen, keine Zahlvariablen.

                1. echo $begrüßung;

                  PS: Ein Ersetzen von is_numeric() durch is_int() bringt nichts, da aus Formulardaten ausschließlich Textvariablen entspringen, keine Zahlvariablen.

                  Hier könnte aber intval() von Vorteil sein. Das Argument kann auch ein String sein, das Ergebnis ist immer ein Integer-Wert (zur Not kommt 0 raus). So man einen solchen erwartet, empfiehlt sich die Verwendung dieser Funktion. is_numeric() ergibt nämlich auch bei Zahlen mit Dezimalpunkt (2.718), solchen in Exponentialdarstellung 3.14E10 und hexadezimaler Notation (0xFF) ein true. Allerdings sind alle drei Schreibweisen für MySQL gültige Zahlen (siehe Literal Values).

                  echo "$verabschiedung $name";

      2. Ich verbessere mich es dürfen 81 5en sein die zu 65 9en umgewandelt werden

        --
        lg uwe82