[PHP/MySQL] Große Zahlen benutzen?

atlan428

Well-known member
ID: 43536
L
13 Mai 2006
269
10
Ich muss bei meinem Browsergame öfters sehr große Zahlen ins MySQL speichern. Da die Zahlen auch Nachkommastellen enthalten, habe ich die SQL-Felder als FLOAT deklariert. Dadurch können die Einträge auch richtig vom MySQL geordnet werden. Leider lassen sich jetzt keine Zahlen mehr mit PHP und den MySQL-Einträgen vergleichen.

Beispiel:
PHP:
if($eingabe > $f->Goldmuenzen) {
echo "Fehler!"
}

Obwohl die Variable $eingabe den Wert 10000000000 hat und $f->Goldmuenzen den Wert 1e+03, ergibt die Abfrage das der Wert im SQL größer als der Eingabewert ist. Wenn ich das Feld aber als VARCHAR(255) deklariere, dann geht die Abfrage auch richtig. Nur das Rechnen mit dem MySQL und das Sortieren geht dann nicht mehr.

Welchen Feldtyp soll ich jetzt benutzen oder wie bringe ich dem PHP bei, dass der trotzdem mit den Werten richtig rechnen kann?

Vielen Dank für eure Hilfe!
 
Welchen Feldtyp soll ich jetzt benutzen oder wie bringe ich dem PHP bei, dass der trotzdem mit den Werten richtig rechnen kann?

An der Datenbank würde ich nichts ändern. Nutz in php vor dem Vergleich einfach floatval oder intval um die Werte aus der Datenbank zu konvertieren. ;)

edit: Der Artikel Typen-Tricks auf php.net ist sicher auch interessant für dich. Stichwort "typ-casting". ;)

Gruß, Zera
 
@ zerafin

Vielen Dank für deine sehr schnelle Hilfe! Bist du dir sicher, dass es damit richtig funktioniert? Dieses Feature ist nämlich sehr wichtig, weil gerade dieser Bug extrem ausgenutzt wurde.
 
Bist du dir sicher, dass es damit richtig funktioniert? Dieses Feature ist nämlich sehr wichtig, weil gerade dieser Bug extrem ausgenutzt wurde.

Ich habe es nicht getestet, aber ich wüsste nicht wieso es nicht gehen sollte. Damit vergleichst du ja zwei Typen vom selben Typ. Zur Sicherheit könntest du noch beide verglichene Werte mit is_float überprüfen (falls zum Beispiel der Wert aus der Datenbank falsch ausgelesen wurde), aber das finde ich übertrieben.

Gruß, Zera
 
Ja, dass ist klar. Jetzt stellt sich aber nur die Frage, ob die Werte auch richtig im MySQL geändert werden. Gestern war es nämlich der Fall, dass der SQL-Eintrag unverändert bleibt. Das kann bei großen Transaktionen ja sehr fatal sein.
 
da du nicht genau geschreiben hast um was für werte es handelt, stell ich einfach mal die datentypen double und decimal in den raum.
 
@ ZeroCCC

Ich hatte doch geschrieben gehabt, welche Werte ich meine. Es handelt sich dabei um sehr große Werte (über 10 Milliarden), die auch noch bis zu 10 Nachkommastellen haben können. Welcher Datentyp ist für sowas geeignet und geht auch richtig mit PHP?
 
Ich benutze zur Zeit den Datentyp FLOAT. Da ist aber der Fehler aufgetreten. Man konnte die eingegebenen Wert nicht mehr mit dem SQL-Wert vergleichen und es konnten keine Rohstoffe abgezogen werden.
 
Bcmath ist auf unserem Server nicht aktiviert und ich habe auch kein Zugriff darauf. Wenn ich aber Strings im SQL benutze, dann kann man die Werte nicht mehr übers SQL sotieren lassen.
 
:LOL: und wieso zurhölle arbeitest du mit derartigen zahlen in einem browsergame? lageweile, spaß an der freude oder wie kommt das? ich würd mir vielleicht nochmal gedanken machen ob dass so sinnvoll ist...

ansonsten nimm DECIMAL(21,10)... wird aber als string gespeichert und nicht als zahl. also mehr speicher und berrechnungen in der dv könnten auch probleme machen...
 
Die großen Zahlen haben 2 Ursachen:

1. Durch die Eingabe zu großer Zahlen konnten Rohstoffe transferiert werden, die man gar nicht hatte
2. Es gibt verschiedene Benutzer, die mehr als eine Milliarde Rohstoffe besitzen
 
Bcmath ist auf unserem Server nicht aktiviert und ich habe auch kein Zugriff darauf. Wenn ich aber Strings im SQL benutze, dann kann man die Werte nicht mehr übers SQL sotieren lassen.

häh? du erzählst doch nur PHP das die zahl als string behandelt wird. das hat doch nichts mit mysql zu tun.

@ZeroCC: warum decimal? es gibt doch bigint
 
häh? du erzählst doch nur PHP das die zahl als string behandelt wird. das hat doch nichts mit mysql zu tun.

@ZeroCC: warum decimal? es gibt doch bigint

bigint ist ein integer datentyp... der kann also nur mit ganzzahlen umgehen und nicht mit gleitkommazahlen. decimal ist ein ganz spezieller datentyp... intern werden die zahlen als chars gespeichert (bei neuen versionen wirds anderes codiert) somit ist eine sogut wie hunderprozente genauigkeit gegeben. jedoch erkauft man sich diese durch speicher und performance einbußen...

@atlan428 und wie kommts zu den kommastellen?
 
bigint ist ein integer datentyp... der kann also nur mit ganzzahlen umgehen und nicht mit gleitkommazahlen. decimal ist ein ganz spezieller datentyp... intern werden die zahlen als chars gespeichert (bei neuen versionen wirds anderes codiert) somit ist eine sogut wie hunderprozente genauigkeit gegeben. jedoch erkauft man sich diese durch speicher und performance einbußen...

@atlan428 und wie kommts zu den kommastellen?

ups^^
ich habe überlesen, dass es nachkommastellen in seinem bug gibt, sry
 
Es kommt zu Kommazahlen, weil man die Rohstoffe über den Martkplatz verkauft werden können und weil das Rohstoffsystem auch kleine Werte auf die Zeitdifferenz aufteilen muss.

Eisen kostet z. B. 0,219124770 Goldmünzen.
 
da würde ich dann sagen, da ist in der Planung und Konzeption schon einiges schief gegangen :roll:
10Mrd Rhstoffe k, das darf ja sein, aber solch eine Goldmünzenzahl, nee