Selber Zahl von PHP und MySQL unterschieldich gehandhabt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Selber Zahl von PHP und MySQL unterschieldich gehandhabt

    Hallo,

    folgendes Szenario:

    Ich lese Produktdaten aus einem XML-Produktkatalog aus, und fülle diese in eine MySQL-Tabelle. Alle Produkte haben insgesamt 6 verschiedene Preise, daher habe ich eine eigene Tabelle "Preise" erstellt, auf die jedes Produkt verweist. Bei jedem neuen Produkt, das ich auslese, prüfe ich erst ob der Preis des Produkts schon in der Tabelle "Preise" vorhanden ist. Falls dies der Fall ist, kriegt das Produkt als priceID die ID des Preises, falls nicht, wird erst ein neuer Preiseintrag erstellt, und mit mysql_insert_ind() die priceID des neu erstellten Preises dem Produkt zugeordnet. In der Tabelle Preise hat das Feld "price" den Datentypen float(4,2), also zwei Nachkommastellen.

    Wenn nun im XML-Katalog ein Produkt mit dem Preis 0.90 auftaucht, wird erst geprüft ob die Tabelle "Preise" bereits einen solchen Eintrag enthält. Und genau hier ist mein Problem, denn auch wenn 0.90 bereits existiert, findet das PHP-Script keinen Eintrag, und füllt sozusagen einen zweiten Preis mit "0.90" ein.

    Ich dachte erst, daß PHP intern aus der 0.90 eine 0.9 sodaß die Werte im Script und Datenbank nicht mehr die selben sind. Aber auch nach dem Ändern des Wertes in der DB wurde keine Üebreinstimmung der Werte festgestellt.

    Sogar wenn ich in phpMyAdmin den direkten SQL-Befehl
    "select * from prices where price = '0.90' bzw. '0.9'" eingebe, werden keine Übereinstimmungen gefunden....das ist doch wirklich sehr komisch.

    Ich danke schon mal für jede Hilfe

    Nachtrag:
    Wenn ich den obigen SQL-Befehl mit 'concat' benutze scheint das einwandfrei zu funktionieren:
    select * from prices where CONCAT(price) = '0.90'
    Komisch, kann mir jemand das mal erläutern, und warum funktioniert nur bei Zahlen zwischen 0 und 1 ????????
    Zuletzt geändert von Nube2021; 23.12.2004, 05:39.

  • #2
    warum, bitte, setzt du zahlen in anführungszeichen?
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      völlig irrelevant ob mit oder ohne Anführungszeichen.

      Ich habe nochmal ein wenig mit diesem SQL-Query rumprobiert:

      select * from prices where price='0.90'

      In der Form scheint der Query für den Zahlenbereich 0.51 bis 0.99 nicht zu funktionieren. Bei allen anderen (0.00 - 0.50) funktioniert das wunderbar.

      Man muß, wie oben schon erwähnt, das CONCAT hinzufügen:

      select * from prices where CONCAT(price) ='0.90'

      Hmm, soweit die Praxis, nun will ich aber gerne wissen was das alles soll, warum werden 0.51 - 0.99 nur in Verbindung mit CONCAT angezeigt???

      Kommentar


      • #4
        völlig irrelevant ob mit oder ohne Anführungszeichen.
        wenn du nur dumm antworten kannst, kriegst du von mir auch nur ein RTFM.

        http://dev.mysql.com/doc/mysql/en/Pr...ith_float.html
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          Original geschrieben von Nube2021
          völlig irrelevant ob mit oder ohne Anführungszeichen.

          Ich habe nochmal ein wenig mit diesem SQL-Query rumprobiert:

          select * from prices where price='0.90'

          In der Form scheint der Query für den Zahlenbereich 0.51 bis 0.99 nicht zu funktionieren. Bei allen anderen (0.00 - 0.50) funktioniert das wunderbar.

          Man muß, wie oben schon erwähnt, das CONCAT hinzufügen:

          select * from prices where CONCAT(price) ='0.90'

          Hmm, soweit die Praxis, nun will ich aber gerne wissen was das alles soll, warum werden 0.51 - 0.99 nur in Verbindung mit CONCAT angezeigt???
          so ein unfug aber auch

          warum konvertierst du (per concat) eine Zahl in String, um mit einer Zahl in ' eingeschlossen zu vergleichen. Wenn du selbst nicht weißt, was du machst und die Tipps ignorierst, kann man dir echt nicht helfen.

          where price=0.9

          so einfach ist das. Wenn du eine Zahl hast, dann vergleiche auch mit einer Zahl und nicht mit einem String

          Kommentar


          • #6
            Hmmnnn ... ich weiss nicht ... vielleicht ist float auch einfach kaputt ... der Datentyp wird sicherlich nur von ein paar Millionen Anwendern verwendet ... klar das sowas dann so gut wie nie auffällt ... vielleicht traut sich auch keiner den Fehler zu melden ... !
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              so bitte schön, damit ihr auch mal ein wenig Praxis erlebt habe ich mal ein Testaccount erstellt:

              habe ich entfernt

              User: testuser
              Pass: testuser

              gebt dann einfach folgendes ein:

              SELECT * FROM `test` WHERE testfeld= '0.90'
              oder
              SELECT * FROM `test` WHERE testfeld= 0.90
              oder
              SELECT * FROM `test` WHERE CONCAT(testfeld)= 0.90

              und zimzalabim es funktioniert doch tatsächlich nur der dritte Query...hmmm....ich denke schon daß das einen logischen Grund hat, aber anscheinend kennt Ihr den genauswenig wie ich.
              Zuletzt geändert von Nube2021; 23.12.2004, 14:31.

              Kommentar


              • #8
                Scheint nicht zu funktionieren ... ich denke mal AbsoluteURI ist auf localhost gesetzt ... blöd das ... !

                Im übrigen: http://dev.mysql.com/doc/mysql/en/Pr...ith_float.html
                Zuletzt geändert von goth; 23.12.2004, 13:23.
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  noch nie Probleme mit AbsoluteURI bei Zugriffen von außen gehabt, aber extra für Dich habe ich es jetzt weg gelassen. Bitte nochmal probieren und selbst überzeugen.

                  Ich habe schon in der Doku gelesen, daß direkte Vergleiche von float-Zahlen nicht ganz so problemlos sind, wie man sich das vorstellt, aber davon habt ihr in Euren obigen Antworten GAR nix erwähnt....

                  Kommentar


                  • #10
                    Wenn Du das gelesen hast ... warum fragst Du dann?! ... in der Doku steht alles wissenswerte drin ... und wenn dann noch Fragen kommen gehe ich von einer Fehlervermutung aus ... und deren Absurdität prangere ich an ... !

                    Ich brauche keinen Zugang auf deinen phpMyAdmin ... weil zum einen das Problem grundsätzlich bekannt ist ... es zum anderen kein Problem darstellen würde eben selbst eine Testtabelle zu erstelllen ... ich wollte Dir nur den Hinweis geben das Dein Link nicht funktioniert ... !
                    carpe noctem

                    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                    Kommentar


                    • #11
                      Hi,

                      vielleicht hilft das weiter:
                      http://dev.mysql.com/doc/mysql/de/No_matching_rows.html
                      Grüsse,
                      Sebastian


                      Profil Flex Freelancer
                      Twitter twitter.com/flashhilfe
                      Web Flash und Flex Community

                      Kommentar


                      • #12
                        mann,

                        schau doch mal in den von mir oben geposteten link. bzw. goth hat ihn ja auch nochmal gepostet.
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Original geschrieben von asp2php
                          son ein unfug aber auch
                          warum konvertierst du (per concat) eine Zahl in String, um mit einer Zahl in ' eingeschlossen zu vergleichen. Wenn du selbst nicht weißt, was du machst und die Tipps ignorierst, kann man dir echt nicht helfen.

                          where price=0.9

                          so einfach ist das. Wenn du eine Zahl hast, dann vergleiche auch mit einer Zahl und nicht mit einem String
                          Na mein Freund, so einfach scheint das wohl doch nicht zu sein.
                          Das sagt mir, daß du in Deiner MySQL-Karriere wohl noch nie zwei Float-Zahlen miteinander verglichen hast...uh uh uh, und das bei 5625 Beiträgenn.

                          Ich habe auch keine Tipps ignoriert, und wollte auch nicht unfreundlich sein, doch für mein Problem war es wirklich völlig irrelevant ob ich die Zahl in Anführungstriche setze oder nicht. Das ist es auch sonst wenn man Zahlen miteinander vergleicht, denn wenn die Zahl existiert wird sie immer in beiden Fällen gefunden.


                          Nun zu Dir Goth
                          Original geschrieben von goth
                          vielleicht ist float auch einfach kaputt
                          naja, kaputt nicht unbedingt, aber die Zahl, die in der Tabelle steht, stimmt meist nicht ganz genau mit der Zahl, die im Speicher steht

                          der Datentyp wird sicherlich nur von ein paar Millionen Anwendern verwendet ... klar das sowas dann so gut wie nie auffällt
                          Wundert mich auch, daß Dir das noch nie aufgefallen ist.

                          vielleicht traut sich auch keiner den Fehler zu melden
                          Doch, ich jetzt!!!

                          Also für Euch beide:
                          Wenn jemand dumme Fragen stellt, dann bin ich auch ranzig in meinen Antworten. Doch ich gehe vorher 1000% sicher, daß ich es wirklich besser weiß, denn ansonsten wird es wirklich peinlich.

                          @derHund
                          Danke für den hilfreichen Link. Im Nachhinein mußt du doch auch, bei rein nüchternet Betrachtung, eingestehen, daß dein erster Tipp wirklich irrelevant für die Lösung meines Problems war.

                          Kommentar


                          • #14
                            Hm, bei dem von mir geposteten Link steht übrigens:
                            ------------
                            Wenn Sie FLOAT- oder DOUBLE-Spalten mit Zahlen vergleichen, die Dezimalstellen haben, können Sie nicht = benutzen! Das Problem tritt in den meisten Computersprachen auf, weil Fließkommawerte keine exakten Werte sind: mysql> SELECT * FROM tabelle WHERE float_spalte=3.5;
                            mysql> SELECT * FROM tabelle WHERE float_spalte between 3.45 und 3.55;

                            In den meisten Fällen kann dies durch Umwandlung von FLOAT in DOUBLE behoben werden!
                            ------------
                            Grüsse,
                            Sebastian


                            Profil Flex Freelancer
                            Twitter twitter.com/flashhilfe
                            Web Flash und Flex Community

                            Kommentar


                            • #15
                              @nubbe

                              mhh weiss jetzt garnicht wo da jetzt ein Problem ist.

                              wenn du float benutzt haste doch bestimmt auch die Erklärungen zu den Spaltentypen bei mysql.com gelesen.
                              Steht jedenfalls alles da, so das (denke) ich das sogar verstehe.
                              mfg
                              marc75

                              <Platz für anderes>

                              Kommentar

                              Lädt...
                              X