Vivienne: PHP: Suche in MySQL

0 54

PHP: Suche in MySQL

Vivienne
  • php
  1. 0
    Klawischnigg
    1. 0
      Vivienne
      1. 0

        Merkwürdiges Ergebnis

        Vivienne
        1. 1
          robertroth
          • mysql
          • php
          1. 0
            Vivienne
            1. 0
              Klawischnigg
              1. 0
                Vivienne
                1. 0
                  robertroth
                  1. 0
                    Vivienne
                    1. 0
                      Klawischnigg
                      1. 0
                        Vivienne
                        1. 0
                          Klawischnigg
                          1. 0
                            Vivienne
                        2. 0
                          robertroth
                          1. 0
                            Vivienne
                            1. 1
                              TS
                              1. 0
                                Vivienne
                                1. 0
                                  Klawischnigg
                                2. 1
                                  TS
                                  1. 0
                                    Vivienne
                                    1. 0
                                      Klawischnigg
                                      1. 0
                                        Vivienne
                        3. 0
                          Klawischnigg
                          1. 0
                            Vivienne
                            1. 0
                              Klawischnigg
                              1. 0
                                Vivienne
                                1. 0
                                  TS
                                  1. 0
                                    Klawischnigg
                                    1. 0
                                      TS
                                      1. 0
                                        Klawischnigg
                                  2. 0
                                    Vivienne
                                2. 0
                                  Klawischnigg
                                  1. 0
                                    Vivienne
                                    1. 0

                                      Erledigt - Ich bin bescheurt :/

                                      Vivienne
                                      1. 1

                                        Sortierung ist noch falsch

                                        robertroth
                                        1. 0
                                          Vivienne
                                          1. 0
                                            robertroth
                                            1. 0
                                              Vivienne
                                    2. 0
                                      Klawischnigg
                2. 0
                  Klawischnigg
                  1. 0
                    robertroth
                    1. 0
                      Klawischnigg
                      1. 1
                        robertroth
              2. 0
                dedlfix
                1. 0
                  Klawischnigg
                  1. 0
                    dedlfix
                  2. 0
                    Tabellenkalk
                    1. 0
                      TS
                    2. 0
                      Klawischnigg
            2. 0
              robertroth
              1. 0
                Vivienne
        2. 2
          Klawischnigg
      2. 0
        Klawischnigg

Guten Abend,

kann ich mit PHP aus einer MySQL Datenbank alle Preise auslesen, die bis zu meinem Wert gehen, den ich in ein Suchfeld eingetragen habe?

WHERE preis=? ORDER by id DESC

Damit erhalte ich alle Einträge die genau auf meinen Preis passen. Wie müsste ich meine Abfrage abändern?

  1. Hi there,

    kann ich mit PHP aus einer MySQL Datenbank alle Preise auslesen, die bis zu meinem Wert gehen, den ich in ein Suchfeld eingetragen habe?

    Ja, auch wenn weder die Frage noch die Beantwortung ursächlich etwas mit PHP zu tun haben...

    ... where preis <= ? ORDER by id DESC
    

    Damit erhältst Du alle Einträge die kleiner oder gleich der gesuchte Preis sind.

    Prinzipiell: An Deiner Stelle würde ich mich erst mit Operatoren in der Abfragesprache SQL befassen, ehe ich da weitermachte, wo Du schon herumdokterst...

    1. Guten Abend,

      ... where preis <= ? ORDER by id DESC
      

      Damit erhältst Du alle Einträge die kleiner oder gleich der gesuchte Preis sind. Prinzipiell: An Deiner Stelle würde ich mich erst mit Operatoren in der Abfragesprache SQL befassen, ehe ich da weitermachte, wo Du schon herumdokterst...

      Danke dir. Warum sollte ich mich mit Operatoren in SQL befassen? Ich benötige diese Abfrage für ein kleines Haushaltsbuch.

      1. Guten Abend,

        ... where preis <= ? ORDER by id DESC
        

        wenn ich nach 0,75 suche, erhalte ich alle Einträge inkl. 0,75. Passt wenn ich nach 2,00 suche, erhalte ich Einträge die im Betrag 199,00 stehen haben. Passt nicht

        2,00 ist doch 100% kleiner wie 199,00. Will mich MySQL oder PHP etwas verarschen?

        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ... where preis <= ? ORDER by id DESC
          

          wenn ich nach 0,75 suche, erhalte ich alle Einträge inkl. 0,75. Passt wenn ich nach 2,00 suche, erhalte ich Einträge die im Betrag 199,00 stehen haben. Passt nicht

          2,00 ist doch 100% kleiner wie 199,00. Will mich MySQL oder PHP etwas verarschen?

          Wie sieht das Create-Statement der Tabelle aus, bzw. wie ist der Spaltentyp von preis?

          Du scheinst ja PDO zu benutzen? Wie sehen denn die Statements genau aus?
          Hast Du die Beträge im Statement auch mit Komma geschrieben?

          Spirituelle Grüße
          Euer Robert
          robert.r@online.de

          --
          Möge der wahre Forumsgeist ewig leben!
          1. Guten Abend,

            ich hoffe ich bekomme den Beitrag noch geschrieben. Hier geht gerade die Welt unter :/

            Wie sieht das Create-Statement der Tabelle aus, bzw. wie ist der Spaltentyp von preis?

            Die Tabelle habe ich nicht angelegt. Wenn ich im phpMyAdmin auf Struktur gehe sehe ich bei Typ varchar(100). Der Preis steht z.B. 0,75 oder auch 199,00 in den einzelnen Feldern.

            Du scheinst ja PDO zu benutzen? Wie sehen denn die Statements genau aus?

            Du meinst diesen Code?

            if ($Preis) {
            $PreisAbfrage = $mysqli->prepare($select . "WHERE preis <=? ORDER by preis DESC" );
            $PreisAbfrage->bind_param("s", $Preis);
            }
            

            Hast Du die Beträge im Statement auch mit Komma geschrieben?

            Ich gebe den Betrag genau so ein wie er auch in der Datenbank steht also z.B. 0,75 oder auch 2,00

            1. Hi there,

              Die Tabelle habe ich nicht angelegt. Wenn ich im phpMyAdmin auf Struktur gehe sehe ich bei Typ varchar(100). [...]

              Here we are. Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

              1. Guten Abend,

                Here we are. Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

                ändern kann ich schon nur ich möchte ungern alle Einträge neu hinzufügen bzw. ich weiß nicht was passiert wenn ich dort etwas ändere? Laufen dann die restlichen Scripte noch?

                1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                  Here we are. Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

                  ändern kann ich schon nur ich möchte ungern alle Einträge neu hinzufügen bzw. ich weiß nicht was passiert wenn ich dort etwas ändere? Laufen dann die restlichen Scripte noch?

                  Nein, nicht richtig. Die Preise müssen vor der Eingabe in die Tabelle "sanitized" werden. PHP hat dafür spezielle Filterfunktionen. siehe "Filter" im PHPhandbuch.

                  Zum ändern der Tabelle, Hilfsspalte im richtigen Typ (decimal) anlegen, per Update-Statement und Ersetzungsfunktion die Werte rüberschieben. Kontrollieren. Wenn alles passt, Char-Spalte löschen, Hilfsspalte umbenennen.

                  Spirituelle Grüße
                  Euer Robert
                  robert.r@online.de

                  --
                  Möge der wahre Forumsgeist ewig leben!
                  1. Guten Abend,

                    Nein, nicht richtig. Die Preise müssen vor der Eingabe in die Tabelle "sanitized" werden. PHP hat dafür spezielle Filterfunktionen. siehe "Filter" im PHPhandbuch.

                    Zum ändern der Tabelle, Hilfsspalte im richtigen Typ (decimal) anlegen, per Update-Statement und Ersetzungsfunktion die Werte rüberschieben. Kontrollieren. Wenn alles passt, Char-Spalte löschen, Hilfsspalte umbenennen.

                    viel zu kompliziert für mich. Das ist bestimmt nicht der Sinn der Sache uns eine Aufgabe zu geben wo man erstmal sämtliche Daten umschreiben / umkobieren muss. Da gibt es 100% noch eine andere Funktion die auch mit solchen Daten arbeiten kann.

                    1. Hi there,

                      viel zu kompliziert für mich. Das ist bestimmt nicht der Sinn der Sache uns eine Aufgabe zu geben wo man erstmal sämtliche Daten umschreiben / umkobieren muss. Da gibt es 100% noch eine

                      andere Funktion die auch mit solchen Daten arbeiten kann.

                      Ja, das findet man hier

                      Die Funktion, Deiner Wahl heisst val() - wieder sind wir bei Operatoren und Datentypen gelandet, lustig nicht...?

                      1. Guten Abend,

                        Die Funktion, Deiner Wahl heisst val() - wieder sind wir bei Operatoren und Datentypen gelandet, lustig nicht...?

                        ich habe gerade die Information bekommen ich soll mir mal cast(AS UNSIGNED) anschauen und auf keinen Fall darf ich Daten umkopieren oder ändern.

                        Bearbeitet

                        WHERE CAST(preis AS UNSIGNED) <=? ORDER by preis DESC
                        

                        damit erhalte ich jetzt Preise die zwischen 0 und 3,97 liegen. Als Eingabe habe ich 3 geschrieben. Warum sind dann die 3,97 noch da?

                        1. Guten Abend,

                          Die Funktion, Deiner Wahl heisst val() - wieder sind wir bei Operatoren und Datentypen gelandet, lustig nicht...?

                          ich habe gerade die Information bekommen ich soll mir mal cast(AS UNSIGNED) anschauen und auf keinen Fall darf ich Daten umkopieren oder ändern.

                          "Anschauen" ist einmal ein guter Anfang. Aber was heisst "darf"??? Stehst Du in einem pädagogischen Abhängigkeitsverhältnis???

                          1. Guten Abend,

                            "Anschauen" ist einmal ein guter Anfang. Aber was heisst "darf"??? Stehst Du in einem pädagogischen Abhängigkeitsverhältnis???

                            ich habe meinen Beitrag darüber bearbeitet: http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646356#m1646356

                            Was heißt "darf"? Das sind Übergungsaufgaben und die dürfen nicht einfach so geändert werden.

                        2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                          Die Funktion, Deiner Wahl heisst val() - wieder sind wir bei Operatoren und Datentypen gelandet, lustig nicht...?

                          ich habe gerade die Information bekommen ich soll mir mal cast(AS UNSIGNED) anschauen und auf keinen Fall darf ich Daten umkopieren oder ändern.

                          Bearbeitet

                          WHERE CAST(preis AS UNSIGNED) <=? ORDER by preis DESC
                          

                          damit erhalte ich jetzt Preise die zwischen 0 und 3,97 liegen. Als Eingabe habe ich 3 geschrieben. Warum sind dann die 3,97 noch da?

                          Weil der Integer-Anteil von 3.97 eben 3 ist?

                          Aber wenn du auf beiden Seiten cast(preis as decimal(10,2)) nimmst, rechts natürlich nur cast(? as decimal(10,2)), dann könnte es klappen

                          Spirituelle Grüße
                          Euer Robert
                          robert.r@online.de

                          --
                          Möge der wahre Forumsgeist ewig leben!
                          1. Guten Abend,

                            Aber wenn du auf beiden Seiten cast(preis as decimal(10,2)) nimmst, rechts natürlich nur cast(? as decimal(10,2)), dann könnte es klappen

                            bringt leider nichts. Gleiches Ergebnis wie zuvor.

                            1. Hallo und gute Nacht,

                              Aber wenn du auf beiden Seiten cast(preis as decimal(10,2)) nimmst, rechts natürlich nur cast(? as decimal(10,2)), dann könnte es klappen

                              bringt leider nichts. Gleiches Ergebnis wie zuvor.

                              Na, dann mach es so:

                              select cast(replace('2,77', ',','.') as Decimal(10,2)) as preis;
                              -> 2.77
                              

                              Umsetzen auf deine Aufgabe kannst Du das jetzt aber? Den daran, es müssen BEIDE Seiten gecastet werden, weil aus dem HTML-Formular ja auch das falsche Format kommt.

                              Grüße
                              TS

                              1. Guten Abend,

                                Na, dann mach es so:

                                select cast(replace('2,77', ',','.') as Decimal(10,2)) as preis;
                                -> 2.77
                                

                                Umsetzen auf deine Aufgabe kannst Du das jetzt aber? Den daran, es müssen BEIDE Seiten gecastet werden, weil aus dem HTML-Formular ja auch das falsche Format kommt.

                                danke dir.

                                WHERE cast(replace(preis, ',','.') as Decimal(10,2)) <=? ORDER by preis DESC
                                

                                Warum muss ich es auf beiden Seiten machen? Wenn ich die Zeile Code ausführe erhalte ich genau das was ich benötige.

                                Was ich noch nicht verstehe ich das (10,2) auf der Seite https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast steht zwar DECIMAL[(M[,D])] es wird aber nicht genuaer erklärt was M und D sein soll.

                                1. Hi there,

                                  Was ich noch nicht verstehe ich das (10,2) auf der Seite https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast steht zwar DECIMAL[(M[,D])] es wird aber nicht genuaer erklärt was M und D sein soll.

                                  M steht für Mantisse, das sind die Stellen einer Gleitkommazahl und D steht für Decimals und das sind eben die Stellen nach dem Komma respektive Punkt...

                                2. Hallo und guten Morgen,

                                  Na, dann mach es so:

                                  select cast(replace('2,77', ',','.') as Decimal(10,2)) as preis;
                                  -> 2.77
                                  

                                  Umsetzen auf deine Aufgabe kannst Du das jetzt aber? Den daran, es müssen BEIDE Seiten gecastet werden, weil aus dem HTML-Formular ja auch das falsche Format kommt.

                                  danke dir.

                                  WHERE cast(replace(preis, ',','.') as Decimal(10,2)) <=? ORDER by preis DESC
                                  

                                  Warum muss ich es auf beiden Seiten machen? Wenn ich die Zeile Code ausführe erhalte ich genau das was ich benötige.

                                  Weil nachher die Zahlen wieder aus einem HTML-Formular kommen. Die sind dann doch genauso kaputt, wie die in der Datenbank. Oder macht Ihr nur Abfragen mit dem phpMyAdmin?

                                  Was ich noch nicht verstehe ich das (10,2) auf der Seite https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast steht zwar DECIMAL[(M[,D])] es wird aber nicht genuaer erklärt was M und D sein soll.

                                  Mantisse und Decimals, also Vorkommazahl und Nachkommastellen. Bzw, bedeutet M hier mMn die Gesamtlänge der Zahl in Digits, also inclusive der Nachkommastellen.

                                  Grüße
                                  TS

                                  1. Guten Abend,

                                    Weil nachher die Zahlen wieder aus einem HTML-Formular kommen. Die sind dann doch genauso kaputt, wie die in der Datenbank. Oder macht Ihr nur Abfragen mit dem phpMyAdmin?

                                    verstanden. Hab es links und rechts eingefügt

                                    WHERE cast(replace(preis, ',','.') as Decimal(10,2)) <=cast(replace(?, ',','.') as Decimal(10,2)) ORDER by preis DESC"
                                    

                                    Nein, phpMyAdmin dürften wir eigentlich gar nicht aufmachen. ich bin da nur kurz rein um zu schauen wie das Feld heißt.

                                    1. Hi there,

                                      Nein, phpMyAdmin dürften wir eigentlich gar nicht aufmachen.

                                      Ist das eine Sonderschule für behinderte Lehrer???

                                      1. Guten Abend,

                                        Ist das eine Sonderschule für behinderte Lehrer???

                                        nein, wir haben Formulare über diese muss alles gemacht werden. Eine Datenbank muss irgendwie mit Create .... erstellt werden (war nicht meine Aufgabe).

                        3. Hi there,

                          WHERE CAST(preis AS UNSIGNED) <=? ORDER by preis DESC
                          

                          damit erhalte ich jetzt Preise die zwischen 0 und 3,97 liegen. Als Eingabe habe ich 3 geschrieben. Warum sind dann die 3,97 noch da?

                          weil unsigned Unsinn ist. Ausser Du verwendest Cent anstelle von Euro, aber nachdem Du ja nichts verändern darfst (find ich sehr amüsant) wirst Du einen anderen Cast verwenden müssen, also eher cast(preis as decimal) - die genaue Syntax kannst Du Dir in dem Link anschauen, den ich ein Posting vorher gesetzt habe. Generell macht es eigentlich nicht viel Sinn, irgendwas komplett ohne Ahnung einfach nachzuschreiben...

                          1. Guten Abend,

                            weil unsigned Unsinn ist. Ausser Du verwendest Cent anstelle von Euro, aber nachdem Du ja nichts verändern darfst (find ich sehr amüsant) wirst Du einen anderen Cast verwenden müssen, also eher cast(preis as decimal) - die genaue Syntax kannst Du Dir in dem Link anschauen, den ich ein Posting vorher gesetzt habe. Generell macht es eigentlich nicht viel Sinn, irgendwas komplett ohne Ahnung einfach nachzuschreiben...

                            wie hier http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646361#m1646361 geschrieben geht es nicht.

                            1. Hi there,

                              wie hier http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646361#m1646361 geschrieben geht es nicht.

                              Und, woran könnte denn das liegen? Ist es vielleicht das Dezimalkomma??? Wie könnten wir das denn herausfinden? Mit einer Funktion, die das Dezimalkomma durch einen Punkt ersetzt, am Ende gar?

                              Und siehe da:

                              where cast(replace(preis, ',','.') as Decimal(10,2)) <= ? ....
                              

                              und wir habens...

                              1. Guten Abend,

                                Und siehe da:

                                where cast(replace(preis, ',','.') as Decimal(10,2)) <= ? ....
                                

                                und wir habens...

                                danke auch dir für deine Hilfe. 99,9% aller Eingaben haben funktioniert. Eine Eingabe funktioniert leider nicht. Der kleinste Preis ist 0,45. Gebe ich in das Suchfeld 0,50 ein müsste der Artikel 0,45 doch gefunden werden, richtig? Leider erhalte ich die Ausgabe 0 Artikel.

                                1. Hallo und gute Nacht,

                                  Und siehe da:

                                  where cast(replace(preis, ',','.') as Decimal(10,2)) <= ? ....
                                  

                                  und wir habens...

                                  danke auch dir für deine Hilfe. 99,9% aller Eingaben haben funktioniert. Eine Eingabe funktioniert leider nicht. Der kleinste Preis ist 0,45. Gebe ich in das Suchfeld 0,50 ein müsste der Artikel 0,45 doch gefunden werden, richtig? Leider erhalte ich die Ausgabe 0 Artikel.

                                  Wer nicht hören kann, muss fühlen ;-P

                                  Ich hatte Dir ja gesagt, Du musst beide Seiten Casten. Warum machst Du das denn nicht?

                                  Grüße
                                  TS

                                  1. Hi there,

                                    Wer nicht hören kann, muss fühlen ;-P

                                    eine echte Schwergeburt...;)

                                    1. Hallo und guten Morgen,

                                      Wer nicht hören kann, muss fühlen ;-P

                                      eine echte Schwergeburt...;)

                                      Ja. Das erinnert mich an den Akt mit Jnnbo, der partout nicht wahr haben wollte, dass die Reparaturfunktion für die Daten in die Datenbank gehörte (als User-defined Function) und nicht mit PHP extern erledigt werden konnte. Dann hätte man immer erst alle Datensätze aus der Tabelle holen müssen...

                                      Aber nun scheint es doch zu klappen, oder?

                                      Grüße
                                      TS

                                      1. Hi there,

                                        Aber nun scheint es doch zu klappen, oder?

                                        Ufff....

                                  2. Guten Abend,

                                    Wer nicht hören kann, muss fühlen ;-P
                                    Ich hatte Dir ja gesagt, Du musst beide Seiten Casten. Warum machst Du das denn nicht?

                                    habe ich doch: http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646375#m1646375

                                    Hier überschneiden sich ein paar Einträge :/

                                2. Hi there,

                                  danke auch dir für deine Hilfe. 99,9% aller Eingaben haben funktioniert. Eine Eingabe funktioniert leider nicht. Der kleinste Preis ist 0,45. Gebe ich in das Suchfeld 0,50 ein müsste der Artikel 0,45 doch gefunden werden, richtig? Leider erhalte ich die Ausgabe 0 Artikel.

                                  Das war mit "auf beiden Seiten" gemeint. Wenn Du 0.50 in das Suchfeld eingibst, dann funktioniert es vermutlich...

                                  1. Guten Abend,

                                    Das war mit "auf beiden Seiten" gemeint. Wenn Du 0.50 in das Suchfeld eingibst, dann funktioniert es vermutlich...

                                    leider nein. Habe es geändert http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646375#m1646375 gebe ich in mein Suchfeld 0,50 ein kommt die Meldung nichts gefunden. Gebe ich 1 oder auch 1,00 wird wieder etwas gefunden.

                                    1. Guten Abend,

                                      Das war mit "auf beiden Seiten" gemeint. Wenn Du 0.50 in das Suchfeld eingibst, dann funktioniert es vermutlich...

                                      leider nein. Habe es geändert http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646375#m1646375 gebe ich in mein Suchfeld 0,50 ein kommt die Meldung nichts gefunden. Gebe ich 1 oder auch 1,00 wird wieder etwas gefunden.

                                      ich bin ja auch bescheuert :/ Bei 0,50 kann er nichts finden, denn der kleinste Preis ist 0,74. Auch kann er bei 0,7 nichts finden, denn es fehlen noch immer 0,04. Bei 0,75 findet er wieder alles.

                                      Danke für eure Hilfe zu später Stunde.

                                      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                        Guten Abend,

                                        Das war mit "auf beiden Seiten" gemeint. Wenn Du 0.50 in das Suchfeld eingibst, dann funktioniert es vermutlich...

                                        leider nein. Habe es geändert http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646375#m1646375 gebe ich in mein Suchfeld 0,50 ein kommt die Meldung nichts gefunden. Gebe ich 1 oder auch 1,00 wird wieder etwas gefunden.

                                        ich bin ja auch bescheuert :/ Bei 0,50 kann er nichts finden, denn der kleinste Preis ist 0,74. Auch kann er bei 0,7 nichts finden, denn es fehlen noch immer 0,04. Bei 0,75 findet er wieder alles.

                                        Danke für eure Hilfe zu später Stunde.

                                        Nur deine Ergebnissortierung kannst Du noch in die Tonne treten. Da musst leider auch casten, wenn der preis numerisch und nicht lexikalisch sortiert werden soll.

                                        Spirituelle Grüße
                                        Euer Robert
                                        robert.r@online.de

                                        --
                                        Möge der wahre Forumsgeist ewig leben!
                                        1. Guten Abend,

                                          Nur deine Ergebnissortierung kannst Du noch in die Tonne treten. Da musst leider auch casten, wenn der preis numerisch und nicht lexikalisch sortiert werden soll.

                                          dazu nutze ich ORDER by preis DESC der größte Preis steht ganz oben, wie es auch sein soll.

                                          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                            Nur deine Ergebnissortierung kannst Du noch in die Tonne treten. Da musst leider auch casten, wenn der preis numerisch und nicht lexikalisch sortiert werden soll.

                                            dazu nutze ich ORDER by preis DESC der größte Preis steht ganz oben, wie es auch sein soll.

                                            das kann nicht sein. guck nochmal genau hin. lass dir einfach mal ganz viele ausgeben.

                                            order by cast( .... preis ... ) desc

                                            würde funktionieren.

                                            Spirituelle Grüße
                                            Euer Robert
                                            robert.r@online.de

                                            --
                                            Möge der wahre Forumsgeist ewig leben!
                                            1. Guten Abend,

                                              das kann nicht sein. guck nochmal genau hin. lass dir einfach mal ganz viele ausgeben.
                                              order by cast( .... preis ... ) desc
                                              würde funktionieren.

                                              ich schau mir das an wenn ich heute Nachmittag vom Nebenjob zurück bin. Muss ins Bett. Mein Wecker klingelt um 4:30 Uhr.

                                    2. Hi there,

                                      leider nein. Habe es geändert http://forum.selfhtml.org/self/2015/jul/24/php-suche-in-mysql/1646375#m1646375 gebe ich in mein Suchfeld 0,50 ein kommt die Meldung nichts gefunden. Gebe ich 1 oder auch 1,00 wird wieder etwas gefunden.

                                      Und was passiert, wenn Du 0.50 eingibst?

                2. Hi there

                  Here we are. Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

                  ändern kann ich schon nur ich möchte ungern alle Einträge neu hinzufügen bzw. ich weiß nicht was passiert wenn ich dort etwas ändere? Laufen dann die restlichen Scripte noch?

                  Den Skripten ist der Datentyp in einer mysql-Tabelle ziemlich wurscht. Was anderes ist, wenn in dem Feld echte Strings drinnen stehen und nicht nur Preise, die sind nach einer Konvertierung sicher weg. Ich würde einfach einmal die Tabelle wegkopieren und sichern, dann kann ja eigentlich nicht viel passieren.

                  Die Alternative wär ein Konvertierungsskript wie es robertroth vorgeschlagen hat. Aber das hört sich für jemanden, der über Deine eingeschätze Erfahrung verfügt eher wie eine mission impossible an...

                  1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                    Here we are. Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

                    ändern kann ich schon nur ich möchte ungern alle Einträge neu hinzufügen bzw. ich weiß nicht was passiert wenn ich dort etwas ändere? Laufen dann die restlichen Scripte noch?

                    Den Skripten ist der Datentyp in einer mysql-Tabelle ziemlich wurscht. Was anderes ist, wenn in dem Feld echte Strings drinnen stehen und nicht nur Preise, die sind nach einer Konvertierung sicher weg. Ich würde einfach einmal die Tabelle wegkopieren und sichern, dann kann ja eigentlich nicht viel passieren.

                    Die Alternative wär ein Konvertierungsskript wie es robertroth vorgeschlagen hat. Aber das hört sich für jemanden, der über Deine eingeschätze Erfahrung verfügt eher wie eine mission impossible an...

                    ich kann es leider nicht ausprobieren, aber was kann denn
                    cast leisten?

                    Da könnte er/sie im phpMyAdmin doch einfach mal ein select damit ausprobieren und sehen ob cast aud dem Kommastring ein Decimal machen kann.

                    Spirituelle Grüße
                    Euer Robert
                    robert.r@online.de

                    --
                    Möge der wahre Forumsgeist ewig leben!
                    1. Hi there,

                      ich kann es leider nicht ausprobieren, aber was kann denn
                      cast leisten?

                      Ja, das ist sicher die Funktion, die der Sinn und Zweck dieser "Übung" ist...;)

                      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                        ich kann es leider nicht ausprobieren, aber was kann denn
                        cast leisten?

                        Ja, das ist sicher die Funktion, die der Sinn und Zweck dieser "Übung" ist...;)

                        Das Theater geht ja weiter, wenn man über den Preis sortieren soll. Ein Index wäre da nutzlos. MySQL kennt noch keine berechneten Indexe.

                        Spirituelle Grüße
                        Euer Robert
                        robert.r@online.de

                        --
                        Möge der wahre Forumsgeist ewig leben!
              2. Tach!

                Ein Datentypfehler. Varchar(100) ist für Preise so ziemlich der falscheste Datentyp (naja, ok, boolean wär' noch blöder gewesen). Wenn Du das nicht ändern kannst, dann hast DU ein echtes Problem. Sonst ist es ganz einfach, mach Typ float daraus...

                Float ist für Preise und andere präzise benötigten Zahlen auch nicht der passende Datentyp. Das gibt unschöne Rechenfehler, weil gebrochene Zahlen nicht mit dem Binärsystem harmonieren. Decimal muss es sein. (Heißt anderswo auch Money.)

                Für die PHP-Seite kann man Strings nehmen, wenn die Zahlen nur aus- und eingegeben werden sollen. Will man auch dort mit ihnen rechnen, ist Float ebenfalls ungeeignet. Ersatz für Decimal gibt es mit den beiden Extensions BC Math und GMP.

                dedlfix.

                1. Tach!

                  Float ist für Preise und andere präzise benötigten Zahlen auch nicht der passende Datentyp. Das gibt unschöne Rechenfehler, weil gebrochene Zahlen nicht mit dem Binärsystem harmonieren. Decimal muss es sein. (Heißt anderswo auch Money.)

                  Naja, ich nehm für Kohle immer Integers, weil ich halt nur Cent abspeichere. Hab damit noch nie Probleme gehabt. Es mag allerdings Spezialfälle geben, wo andere Typen besser sind...

                  1. Tach!

                    Decimal muss es sein. (Heißt anderswo auch Money.)

                    Naja, ich nehm für Kohle immer Integers, weil ich halt nur Cent abspeichere. Hab damit noch nie Probleme gehabt. Es mag allerdings Spezialfälle geben, wo andere Typen besser sind...

                    Integer geht auch, fügt aber eine weitere Komplexitätsebene in alle beteiligten Systeme ein. Ich hoffe, du teilst dann nicht durch 100, um die Centbeträge darstellen zu können.

                    Der Spezialfall Decimal/Money ist extra für Geldrechnereien erfunden worden und ist ziemlich weit verbreitet. Ihn nicht zu verwenden, macht eher die eigene Lösung zum Spezialfall.

                    dedlfix.

                  2. Hallo,

                    Naja, ich nehm für Kohle immer Integers, weil ich halt nur Cent abspeichere. Hab damit noch nie Probleme gehabt. Es mag allerdings Spezialfälle geben, wo andere Typen besser sind...

                    Was machst du bei Tankstellenpreisen?

                    Gruß
                    Kalk

                    1. Hallo und guten Tag,

                      Naja, ich nehm für Kohle immer Integers, weil ich halt nur Cent abspeichere. Hab damit noch nie Probleme gehabt. Es mag allerdings Spezialfälle geben, wo andere Typen besser sind...

                      Was machst du bei Tankstellenpreisen?

                      Da wechselt er dann eben die Währung auf Drachmen oder Lira ;-P

                      Grüße
                      TS

                    2. Hallo,

                      Naja, ich nehm für Kohle immer Integers, weil ich halt nur Cent abspeichere. Hab damit noch nie Probleme gehabt. Es mag allerdings Spezialfälle geben, wo andere Typen besser sind...

                      Was machst du bei Tankstellenpreisen?

                      Ich vermag das Problem nicht zu erkennen. Was soll ich da machen? Ich hab noch nie in meinem Leben etwas mit einer Tankstelle zu tun gehabt, ich hab kein Auto, ich hab nicht einmal einen Führerschein - und so viel Flexibilität kann man mir schon zutrauen, daß ich, sollte sich daran etwas ändern, mental und psychisch in der Lage bin, andere Datentypen zu verwenden, wenn es notwendig sein sollte. Die Frage solltest Du eigentlich der Tankstelle stellen: was macht die denn, wenn am Ende ein halber Cent herauskommt?

                      Im Übrigen kommt meine Vorliebe für Integers aus einer Zeit, als man den Luxus von Decimal- oder Währungsdatentypen noch nicht kannte und ein Integer sowohl beim Rechnen schneller war als auch gespeichert weniger Platz benötigte. Buchhalterisch ist das Rechnen mit Cents absolut korrekt, wenn man die kaufmännischen Rundungsregeln beachtet. Alles andere sind Schein- oder Luxusprobleme...

            2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              ich hoffe ich bekomme den Beitrag noch geschrieben. Hier geht gerade die Welt unter :/

              Wie sieht das Create-Statement der Tabelle aus, bzw. wie ist der Spaltentyp von preis?

              Die Tabelle habe ich nicht angelegt. Wenn ich im phpMyAdmin auf Struktur gehe sehe ich bei Typ varchar(100). Der Preis steht z.B. 0,75 oder auch 199,00 in den einzelnen Feldern.

              Du scheinst ja PDO zu benutzen? Wie sehen denn die Statements genau aus?

              Du meinst diesen Code?

              if ($Preis) {
              $PreisAbfrage = $mysqli->prepare($select . "WHERE preis <=? ORDER by preis DESC" );
              $PreisAbfrage->bind_param("s", $Preis);
              }
              

              Hast Du die Beträge im Statement auch mit Komma geschrieben?

              Ich gebe den Betrag genau so ein wie er auch in der Datenbank steht also z.B. 0,75 oder auch 2,00

              Wer hat denn diese Tabelle angelegt? Zahlen in einem Stringtyp und dann noch mit Komma, das wird schwierig.

              Die genaue Erklärung, warum def Vergleich so ausfällt, hat Dir Klawischnigg schon gegeben. Man könnte jetzt beigehen, und die Tabelle umstellen. Da muss dann aber auch die Eingabe-Sanitation angepasst werden im PHP.

              Oder man schreibt sich zwei relativ komplexe Konvertierungsfunktionen, eine für die Datenbankseite und eine für die PHPseite, die man dann bei der Abfrage benutzt.

              Spirituelle Grüße
              Euer Robert
              robert.r@online.de

              --
              Möge der wahre Forumsgeist ewig leben!
              1. Guten Abend,

                Wer hat denn diese Tabelle angelegt? Zahlen in einem Stringtyp und dann noch mit Komma, das wird schwierig.

                kann ich dir nicht sagen haben wir so bekommen. Wir müssen darauf aufbauen bzw. damit arbeiten.

        2. Hi there,

          wenn ich nach 0,75 suche, erhalte ich alle Einträge inkl. 0,75. Passt wenn ich nach 2,00 suche, erhalte ich Einträge die im Betrag 199,00 stehen haben. Passt nicht

          2,00 ist doch 100% kleiner wie 199,00. Will mich MySQL oder PHP etwas verarschen?

          Auch wenn ich Dir auf den Nerv gehe, aber da haben wir schon wieder ein Gebiet, auf dem etwas Befassen oder Nachlesen sinnvoll wäre - es geht um Datentypen.

          Die Integer- oder Fließkommazahl 2 resp. 2.00 ist kleiner als die Integer- oder Fließkommazahl 199 resp. 199.0

          aber:

          der String '2,00' ist eindeutig größer als der String '199,00'.

          mit anderen Worten: Du vergleichst keine Zahlen sondern Du vergleichst Zeichenketten, die aussehen wie Zahlen. Die Ursache kann jetzt ein Designfehler in der Tabellendefinition sein (varchar statt float bspw.) oder in der Abfrage...

      2. Hi there,

        Damit erhältst Du alle Einträge die kleiner oder gleich der gesuchte Preis sind. Prinzipiell: An Deiner Stelle würde ich mich erst mit Operatoren in der Abfragesprache SQL befassen, ehe ich da weitermachte, wo Du schon herumdokterst...

        Danke dir. Warum sollte ich mich mit Operatoren in SQL befassen? Ich benötige diese Abfrage für ein kleines Haushaltsbuch.

        Damit Du Dein kleines Haushaltsbuch in Zukunft selbst programmieren kannst...