Martin1958: Frage zu varchar

Guten Tag,

ich habe eine Frage zu dem varchar feld der Datenbank mysql.

Wenn ich eine Zahlenfolge wie diese hier abspeichere: 0160123456 dann wird beim speichern die 1. null gelöscht. Wie ich bereits gelesen habe liegt das daran, dass ich die Funktion quote_smart nutze. Diese Funktion sieht wie folgt aus:

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;
}

Irgendwann hat mir wer geraten diese "so tolle" funktion zu nutzen. Das doofe ist jetzt das wenn ich in ein varchar feld 0160123456 eingebe diese eingabe als zahl erkannt wird und die anführungszeichen '' nicht benutzt werden. Wieso wird bei einer zahl immer die 1. Null weg gestrichen? bzw. kann man das irgendwie in der konfiguration von mysql abstellen?

--
lg martin
  1. hi,

    Irgendwann hat mir wer geraten diese "so tolle" funktion zu nutzen.

    Sehe darin keinen besonders großen Sinn.

    gruß,
    wahsaga

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

    Wenn ich eine Zahlenfolge wie diese hier abspeichere: 0160123456 dann wird beim speichern die 1. null gelöscht. Wie ich bereits gelesen habe liegt das daran, dass ich die Funktion quote_smart nutze. Diese Funktion sieht wie folgt aus:

    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;
    }

    Diese Funktion ist Müll.

    Irgendwann hat mir wer geraten diese "so tolle" funktion zu nutzen.

    Einer aus diesem Forum? Ich hoffe nicht.

    Egal, wer es war: Er hat dir Unsinn erzählt. Die in der Funktion vorgenommene Ausnahmebehandlung für numerische Inhalte ist das Problem. Sie ist erstens nicht notwendig (auch Nummern dürfen im SQL-String in Anführungszeichen stehen, das stört MySQL gar nicht - es muß die Nummern sowieso wieder aus dem SQL-String rausparsen), und zweitens ist man auf der sicheren Seite, wenn man sowieso alle variablen SQL-Inhalte durch mysql_real_escape_string durchschleust.

    Deine wahnsinnige Funktion reduziert sich also auf:
    function quote_smart($value) {
      return "'".mysql_real_escape_string($value)."'";
    }

    Allerdings hat das gewisse Nachteile: Erstens gehören die Anführungszeichen zum statischen SQL-Statement, nicht zum Value.

    Zweitens erfordert mysql_real_escape_string() eine bestehende MySQL-Verbindung, denn deren aktuelle Zeichencodierung fließt mit in das Ergebnis ein.

    Und drittens ist es einfach blödsinnig, einen Funktionsaufruf zu schreiben, der einfach nur eine andere Funktion aufruft, aber sonst nichts tut.

    Wieso wird bei einer zahl immer die 1. Null weg gestrichen? bzw. kann man das irgendwie in der konfiguration von mysql abstellen?

    Du hast diese Funktion in deinen Code integriert. Du solltest eigentlich wissen, was sie tut, und daher auch wissen, wie man das abstellt.

    Mein Ratschlag: Wirf die Funktion ganz raus. Das erfordert dann noch einmalig ein wenig Umbauarbeiten an den betroffenen SQL-Strings, aber das war's dann auch.

    Alternativ nutze die mysqli-Funktionen - die haben Prepared Statements etc., bei denen man sich lokales Escaping sparen kann.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Danke für deine Antwort, habe in diesem Forum leider noch nicht nach antworten gesucht...

      werde jetzt allgemein alle Daten in die datenbank so einfügen:

      ....
      website = '%s'
      ......",

      mysql_real_escape_string($_POST[website]),
      .....

      damit ich auf der sicheren Seite bin...

      --
      lg martin
      1. damit ich auf der sicheren Seite bin...

        Und was lernen wir aus dieser kleinen, durchaus auch ein wenig Mitleid erregenden Geschichte? - Richtig, Funktionen entweder selbst bauen und en detail verstehen oder diese aus dokumentierten Bibliotheken oder Modulen entnehmen und der Dokumentation vertrauen.

      2. Hello,

        werde jetzt allgemein alle Daten in die datenbank so einfügen:

        ....
        website = '%s'
        ......",

        Das ist nicht ganz richtig.

        Der Wert NULL darf nicht in Häkchen stehen!

        mysql_real_escape_string($_POST[website],$con),
                                                 --------

        damit ich auf der sicheren Seite bin...

        Und das ist auch noch nicht alles, denn wenn   magic_quotes_gpc() == true
        dann hast Du manche Zeichen nun doppelt escaped.
        Man muss also vorher die POST-Variablen noch wieder davon befreien, oder aber die Funktion ausschalten in der ini oder der .htaccess oder der Host-Einrichtung

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

        Tom

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

    2. echo $begrüßung;

      Zweitens erfordert mysql_real_escape_string() eine bestehende MySQL-Verbindung, denn deren aktuelle Zeichencodierung fließt mit in das Ergebnis ein.

      Weil du das gerade so erwähnst: Wusstest du, dass das Setzen der aktuellen Verbindungskodierung mittels Absetzen eines SET NAMES-Statements keinen Einfluss auf die von mysql_real_escape_string() verwendete Kodierung hat? In der Tat lässt sich dieses Problem nur mit mysqli lösen, indem man die Funktion mysqli_set_charset() verwendet. Siehe http://dev.mysql.com/doc/refman/5.0/en/mysql-set-character-set.html.

      Andererseits ist das für die hierzulande verbreiteten Kodierungen ISO-8859-x und UTF-8 kein wirkliches Problem, denn für diese gibt es keinen Unterschied zwischen mysql_real_escape_string() und mysql_escape_string(). Die betroffenen Zeichen NUL, \n, \r, , ', " und Control-Z sind in diesen Kodierungen eineindeutigen Bytewerten zugeordnet. Ich fand nur in einer der asiatischen Kodierungen dass zumindest eins der Bytes dieser Zeichen auch in einem Multi-Byte-Zeichen auftauchte. Und in dem Fall muss man dann die Zeichenkodierung berücksichtigen, denn dann darf dieses Byte nicht maskiert werden.

      echo "$verabschiedung $name";

  3. Hi,

    Irgendwann hat mir wer geraten diese "so tolle" funktion zu nutzen.

    siehe wahsagas Antwort.

    Wieso wird bei einer zahl immer die 1. Null weg gestrichen?

    Das wurde hier vermutlich nicht viel öfter als 0000000000000005 mal gefragt. Vermutlich ist es beinahe 000000000000100% der Leute klar, warum das passiert.

    bzw. kann man das irgendwie in der konfiguration von mysql abstellen?

    Du kannst Zahlenspalten als Zerofill markieren. Hier möchtest Du aber eher auf die o.g. "so tolle" Funktion verzichten; sie ist dämlich.

    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
    1. echo $begrüßung;

      Das wurde hier vermutlich nicht viel öfter als 0000000000000005 mal gefragt. Vermutlich ist es beinahe 000000000000100% der Leute klar, warum das passiert.

      Sollte es deinem aufmerksamen Auge entgangen sein, dass es sich bei der Zahl des OP höchstwahrscheinlich um eine Telefonnummer handelt, bei der das Weglassen der führenden Null ein anderes Ergebnis erzeugt als bei deinen beiden Beispielen?

      echo "$verabschiedung $name";

      1. Hallo!

        Das wurde hier vermutlich nicht viel öfter als 0000000000000005 mal gefragt. Vermutlich ist es beinahe 000000000000100% der Leute klar, warum das passiert.

        Sollte es deinem aufmerksamen Auge entgangen sein, dass es sich bei der Zahl des OP höchstwahrscheinlich um eine Telefonnummer handelt, bei der das Weglassen der führenden Null ein anderes Ergebnis erzeugt als bei deinen beiden Beispielen?

        Er könnte die Telefonnummer aber auch so abspeichern: +49160123456. Dann würde er keine Probleme bekommen ;-)

        ciao, ww

        --
        Ein japanisch-deutsches Gedicht
        sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
        1. echo $begrüßung;

          Er könnte die Telefonnummer aber auch so abspeichern: +49160123456. Dann würde er keine Probleme bekommen ;-)

          Irrtum, denn is_numeric('+49160123456') ergibt true.

          echo "$verabschiedung $name";

          1. Er könnte die Telefonnummer aber auch so abspeichern: +49160123456. Dann würde er keine Probleme bekommen ;-)

            Irrtum, denn is_numeric('+49160123456') ergibt true.

            Mal am Rande: Telefonnummern sind alphanumerisch zu speichern, Strassennamen zusammen mit Strassennummern in einem Feld und zumindest bestimmte Titel sollten in den Nachnamen "eingemurkst" werden. Richtig, oder?

            1. echo $begrüßung;

              Er könnte die Telefonnummer aber auch so abspeichern: +49160123456. Dann würde er keine Probleme bekommen ;-)
              Irrtum, denn is_numeric('+49160123456') ergibt true.
              Mal am Rande: Telefonnummern sind alphanumerisch zu speichern, [...] Richtig, oder?

              Ja, aber die quote_smart-Funktion interessierte sich nicht für den Feldtyp in der Tabelle. Sie schaut nur nach, ob der übergebene Wert irgendwie nach Zahl aussieht, bzw. das darin aufgerufene is_numeric() macht das. Woraufhin es einen Quasi-Typecast macht, bei dem einige der Zeichen verlorengehen.

              echo "$verabschiedung $name";

              1. Er könnte die Telefonnummer aber auch so abspeichern: +49160123456. Dann würde er keine Probleme bekommen ;-)
                Irrtum, denn is_numeric('+49160123456') ergibt true.
                Mal am Rande: Telefonnummern sind alphanumerisch zu speichern, [...] Richtig, oder?

                Ja, aber die quote_smart-Funktion interessierte sich nicht für den Feldtyp in der Tabelle. Sie schaut nur nach, ob der übergebene Wert irgendwie nach Zahl aussieht, bzw. das darin aufgerufene is_numeric() macht das. Woraufhin es einen Quasi-Typecast macht, bei dem einige der Zeichen verlorengehen.

                Wissen Wir doch alles. Aber Du mal am Rande, Du schuldest Uns noch die Erklaerung ob und inwiefern Du bei PHP mitmischt. Mach mal einen smart quote.   :-

                1. echo $begrüßung;

                  Wissen Wir doch alles. Aber Du mal am Rande, Du schuldest Uns noch die Erklaerung ob und inwiefern Du bei PHP mitmischt. Mach mal einen smart quote.   :-

                  Eine Schuld kann ich nicht erkennen. Ich habe nur deine Frage damals ignoriert, und ich werde auch jetzt nicht weiter darauf eingehen.

                  echo "$verabschiedung $name";

                  1. Wissen Wir doch alles. Aber Du mal am Rande, Du schuldest Uns noch die Erklaerung ob und inwiefern Du bei PHP mitmischt. Mach mal einen smart quote.   :-

                    Eine Schuld kann ich nicht erkennen. Ich habe nur deine Frage damals ignoriert, und ich werde auch jetzt nicht weiter darauf eingehen.

                    Schon klar, aber eine Mittaeterschaft ist gegeben, gell? Yo, denk ich auch, sollen andere das Urteil sprechen. Und moege es milde ausfallen!

      2. Hi,

        Das wurde hier vermutlich nicht viel öfter als 0000000000000005 mal gefragt. Vermutlich ist es beinahe 000000000000100% der Leute klar, warum das passiert.
        Sollte es deinem aufmerksamen Auge entgangen sein, dass es sich bei der Zahl des OP höchstwahrscheinlich um eine Telefonnummer handelt, bei der das Weglassen der führenden Null ein anderes Ergebnis erzeugt als bei deinen beiden Beispielen?

        nein, woraus schließt Du das? Und warum sollte das einen Unterschied bezüglich der Frage machen, auf die ich geantwortet habe?

        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
        1. echo $begrüßung;

          Das wurde hier vermutlich nicht viel öfter als 0000000000000005 mal gefragt. Vermutlich ist es beinahe 000000000000100% der Leute klar, warum das passiert.
          Sollte es deinem aufmerksamen Auge entgangen sein, dass es sich bei der Zahl des OP höchstwahrscheinlich um eine Telefonnummer handelt, bei der das Weglassen der führenden Null ein anderes Ergebnis erzeugt als bei deinen beiden Beispielen?
          nein, woraus schließt Du das?

          Ich schließe das aus der nach einer Vorwahl aussehenden 0160, gepaart mit dem Wunsch, die führende Null zu erhalten.

          Und warum sollte das einen Unterschied bezüglich der Frage machen, auf die ich geantwortet habe?

          In deine Antwort brachtest du ein Auffüllen auf eine konstante Länge hinein. Damit fügst du unter Umständen Information hinzu. Der OP wollte ja nur, das von der bestehenden Information nichts verloren geht.

          echo "$verabschiedung $name";

  4. ich habe eine Frage zu dem varchar feld der Datenbank mysql.

    VARCHAR ist ein Stringtyp.

    Wenn ich eine Zahlenfolge wie diese hier abspeichere: 0160123456 dann wird beim speichern die 1. null gelöscht.

    Ja, weil die unten stehende Funktion verhindert, dass Anführungszeichen um den Wert geschrieben werden, sodass er als numerisch interpretiert wird und damit alle führenden Nullen im Nirvana verschwinden.

    Verwende mysql_real_escape_string() ohne das Gedöns drumherum. Welchen Typ die einzutragenden Daten haben und ob sie innerhalb eines SQL-Statements gequotet werden müssen oder nicht, entscheidet der Spaltentyp, den du in MySQL festgelegt hast, nicht irgendeine PHP-Funktion.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.