Hanjo: float variable fommt nur mit vorkommastellen in MySQL-Table

Moin auch,

hier komme ich wieder mal nicht weiter:

$versD = 99.99 ;

$Insert = "INSERT into B_BESTELL (porto) VALUES ('".$versD."')"
if ($insresult = mysql_query("$insert")) .. usw.

In der MySQL-Datei ist das Feld 'Porto' definiert als float(5,2)

Trotzdem steht dort nur die 99 drin.

Wer nimmt mir die Tomaten von den Augen ?

Gruß von der Ostsee

Hanjo

  1. Halihallo Hanjo

    $Insert = "INSERT into B_BESTELL (porto) VALUES ('".$versD."')"

    a) Zeile ist nicht durch ';' abgeschlossen.
    b) Warum alles in doublequotes und die Variable $versD doch mit
       String-Concat eingefügt?
    c) Warum ist porto klein geschrieben, obwohl du es unten gross
       schreibst? - OK, Feldnamen sind caseinsensitiv.

    => $Insert = "INSERT INTO B_BESTELL (Porto) VALUES ('$versD')";

    if ($insresult = mysql_query("$insert")) .. usw.

    $insert ist vorher gross geschrieben und hier _spielt es eine Rolle_.

    Versuche $insert normal auszugeben und es auf syntaktische
    Korrektheit zu überprüfen (ist es wirklich das SQL-Statement, dass
    du dir ausgedacht hast?)
    Eine Fehlerüberprüfung durch mysql_error schaded _nie_. => Baue diese
    Fehlerbehandlung ein!

    In der MySQL-Datei ist das Feld 'Porto' definiert als float(5,2)

    Das ist OK, wenn es denn so definiert ist.

    Trotzdem steht dort nur die 99 drin.

    Wie liest du es denn aus? - phpMyAdmin, PHP selber, weitere...?

    Wer nimmt mir die Tomaten von den Augen ?

    Erstmal Fehler beseitigen, denn es sollte funktionieren. Bis auf die
    zahlreichen Tippfehler, die ggf. sogar die Ursache sind, kann ich
    kein Problem ausmachen.

    Viele Grüsse

    Philipp

    1. Halihallo Hanjo

      => $Insert = "INSERT INTO B_BESTELL (Porto) VALUES ('$versD')";

      Moin auch,

      die Tippfehler sind lediglich beim Übertragen hierher eingeflossen, entschuldigung.
      Das Script läuft im Prinzip.
      Nur eben dieses Detail nicht.

      Jetzt heißt der Insert-Befehl (original) nach Deinem obigen Hinweis
      $insert = "INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'".$kdnr."','".$inarray_['Anzahl']."','".$inarray_['Comments']."','".$datum."','".$remote_url."','$versD')";

      aber das bringt keine Änderung.
      Muß man da noch eine Typ-Konversion machen ?

      Wie liest du es denn aus? - phpMyAdmin, PHP selber, weitere...?

      Mit MySQL-Front, sowie einem selbstgeschriebnen Windows-Programm.

      Gruß von der Ostsee

      Hanjo

      1. Halihallo Hanjo

        die Tippfehler sind lediglich beim Übertragen hierher eingeflossen, entschuldigung.

        Copy&Paste funktioniert nicht nur zuverlässiger, sondern auch
        schneller :-)

        Jetzt heißt der Insert-Befehl (original) nach Deinem obigen Hinweis
        $insert = "INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'".$kdnr."','".$inarray_['Anzahl']."','".$inarray_['Comments']."','".$datum."','".$remote_url."','$versD')";

        Lass dir $insert per echo/print ausgeben. Ist 99.99 dort zu sehen,
        oder ist es bereits hier auf 99?

        Gibt dir mysql_error nun einen Fehler aus, oder nicht? -> wird Query
        ausgeführt, oder Fehler?

        Muß man da noch eine Typ-Konversion machen ?

        Nein, das übernimmt MySQL für dich.

        Wie liest du es denn aus? - phpMyAdmin, PHP selber, weitere...?
        Mit MySQL-Front, sowie einem selbstgeschriebnen Windows-Programm.

        Na hoffentlich arbeiten diese Programme rechtens.

        Überprüfe bitte nochmals genau, ob Porto _wirklich_ FLOAT(5,2) ist,
        oder ob du dies nur "glaubst".

        mysql> SHOW COLUMNS FROM B_Bestell

        Viele Grüsse

        Philipp

        1. Moin auch,

          wünsche, wohl geruht gehabt zu haben ;-)

          Jetzt heißt der Insert-Befehl (original) nach Deinem obigen Hinweis
          $insert = "INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'".$kdnr."','".$inarray_['Anzahl']."','".$inarray_['Comments']."','".$datum."','".$remote_url."','$versD')";

          Lass dir $insert per echo/print ausgeben. Ist 99.99 dort zu sehen,
          oder ist es bereits hier auf 99?

          Der Test ergibt:
          INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'44','7','Terst 10','20040106074304','217.227.210.80','99,99')

          also wird die 99,99 als String weitergegeben.

          Gibt dir mysql_error nun einen Fehler aus, oder nicht? -> wird Query
          ausgeführt, oder Fehler?

          Wird ausgeführt, keine Fehlermeldung.

          Überprüfe bitte nochmals genau, ob Porto _wirklich_ FLOAT(5,2) ist,
          oder ob du dies nur "glaubst".

          mysql> SHOW COLUMNS FROM B_Bestell

          float(5,2)

          sagt er...

          Gruß von der Ostsee

          Hanjo

          1. Halihallo Hanjo

            Der Test ergibt:
            INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'44','7','Terst 10','20040106074304','217.227.210.80','99,99')

            also wird die 99,99 als String weitergegeben.

            99,99 wird als 99 interpretiert, da die Zahl für MySQL dort aufhört,
            wo das erste "nicht-Zahl-Zeichen" kommt (in diesem Fall: ','). Eine
            Zahl wird (wie üblich) mit Punkt (.) als Dezimaltrennzeichen
            geschrieben.
            Damit wird es wohl funktionieren.

            Viele Grüsse

            Philipp

            1. 99,99 wird als 99 interpretiert, da die Zahl für MySQL dort aufhört,
              wo das erste "nicht-Zahl-Zeichen" kommt (in diesem Fall: ','). Eine
              Zahl wird (wie üblich) mit Punkt (.) als Dezimaltrennzeichen
              geschrieben.
              Damit wird es wohl funktionieren.

              Moin auch,

              gut, danke.
              Aber wie erreiche ich das ?
              Ich gebe oben:
              $versD = 99.99;

              Also mit '.'

              Dann
               $insert = "INSERT INTO B_Bestell (Artikel,Kunde,Anzahl,Bemerkung, eingegeben,inip, Porto) VALUES (1,'".$kdnr."','".$inarray_['Anzahl']."','".$inarray_['Comments']."','".$datum."','".$remote_url."','$versD')";

              Und da macht er selber einfach die '99,99' draus.

              Und wie verhindere ich das ?

              Kann es evtl. an dieser Funktion liegen:
              ---------
              function rech_betr($betr)
              {
              if !(strstr($betr,"."))
              $betr .= ".0";

              $plen = strlen($betr);

              $betr2 = str_pad($betr,$plen + 1,"0");
              $varray = array ("." => ",");

              $betr3 = strtr($betr2,$varray);

              return $betr3;

              }
              --------
              Die wird weiter oben mit rech_betr($versD) aufgerufen.
              Sie soll für die nötigen Nachkommastellen sorgen, falls die nicht da sind, damit immer ein 'richtiger' Euro-Betrag rauskommt. Also z.B 2.00 oder 2.50 usw.

              Gruß

              Hanjo

              1. Kann es evtl. an dieser Funktion liegen:

                function rech_betr($betr)

                »


                Die wird weiter oben mit rech_betr($versD) aufgerufen.

                Der Versuch mit diesem Konstrukt:
                $VersandD = $versD;
                echo rech_betr($VersandD)

                half allerdings auch nicht.

                Ratlos

                Hanjo

              2. Halihallo Hanjo

                Und da macht er selber einfach die '99,99' draus.

                Natürlich, einfach so... Klar...

                Und wie verhindere ich das ?
                Kann es evtl. an dieser Funktion liegen:

                100% sogar. Hast du wenigstens _einmal_ in der Dokumentation
                nachgesehen? - Oder muss man dir alles auf dem Silbertablett
                vorhalten, dass du es siehst. Lies die Dokumentation zum Befehl strtr
                und beantworte bzw. löse deine Frage und Problem selber. Du kannst es
                nähmlich.

                Die wird weiter oben mit rech_betr($versD) aufgerufen.
                Sie soll für die nötigen Nachkommastellen sorgen, falls die nicht da sind, damit immer ein 'richtiger' Euro-Betrag rauskommt. Also z.B 2.00 oder 2.50 usw.

                Eben nicht 2.00 oder 2.50, sondern 2,00 oder 2,50. Die wichtigste
                Eigenschaft eines Wissenschaftlers ist es, genau zu beobachten. Ein
                Programmierer ist ein Wissenschaftler (definiere ich jetzt einfach
                mal).

                Viele Grüsse

                Philipp

                1. Halihallo Hanjo

                  Und da macht er selber einfach die '99,99' draus.

                  Natürlich, einfach so... Klar...

                  Und wie verhindere ich das ?
                  Kann es evtl. an dieser Funktion liegen:

                  100% sogar.

                  Moin Philipp,

                  'zuweilen schläft selbst Homer'.
                  Nein, es liegt 100 % _nicht_ ann der Funktion (ausprobiert!!)

                  Es liegt an der dazwischenliegenden Zeile, die ich standardmäßig vor dem Öffnen einer Datenbank aufrufe:
                  setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');

                  Laß ich die weg, dann funktionierts.

                  Auch _mit_ der Funktion...

                  Gruß von der Ostsee
                  (und vom 'Wissenschaftler' ;-))

                  Hanjo

                  1. Halihallo Hanjo

                    Es liegt an der dazwischenliegenden Zeile, die ich standardmäßig vor dem Öffnen einer Datenbank aufrufe:
                    setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');

                    Nun ja, die locale zu ändern hat darauf natürlich bösen Einfluss,
                    zumal du nur die locale von PHP, nicht jedoch die locale der
                    Datenbank änderst => Die Datenbank erwartet noch immer eine Zahl,
                    die nach "Standard-Englisher-Syntax" geschrieben steht.

                    (und vom 'Wissenschaftler' ;-))

                    Siehst'e, du kannst es :-)

                    Viele Grüsse

                    Philipp