“Es gibt ein Anzeigeproblem. Wir haben das Problem eingekreist, die Log spinnt.”
Damit wurde ich konfrontiert, als Entwickler bei dem Browserspiel Gangwars. Konkret ging es um falsche Abbuchungen bei einem Geld-Transaktions-Modul.
Okay, dachte ich mir.. das kann ja nicht so schwer sein. Zeitgleich mit dem Auftreten des Problems wurde die PHP Version von 5.1 auf 5.2 aktualisiert, naheliegend, das dort irgendwo ‘was im argen lag.
Nach einigen kleinen Versuchen und der Analyse der Daten in der Datenbank kam ich zum Ergebnis, das die Ausgabe zwar falsch war, die Buchungen tatsächlich aber korrekt waren. Da die Log aber auch falsch war, konnte das Problem nur in der Logerstellung sein.
Es dauerte dann doch einiges, bis ich mich an den Buch herangetastet hatte – leider kein ordentlicher Debugger zu Hand 🙁 – und das Problem hatte. Vielmehr: Ich wusste, wo das Problem ist, aber nicht wieso.
Ab einer Zahl mit mehr als vier Nullen (beispielsweise 100000) verhält sich PHP 5.2 neuerdings wie folgt: Wird diese Zahl mit einem String (zum Beispiel zu einem Query) konnektiert, dann “wird” der Wert in wissenschaftlicher Schreibweise genommen (expontieller Wert, Basis 10). Aus 100000 wird also 1.0E05. Die Datenbank, wie schlau sie doch ist, konnte damit jedoch in einem INT-Feld nichts anfangen, und kürzte so verständlicherweise auf das nächste logische – nämlich 1.
Das Problem zu beheben indes war nicht das Problem, ein String-Cast auf die entsprechende Variable wirkt schnell Wunder. Aber mir bleibt des fade Beigeschmack, bei dieser “Lösung” irgendwie nicht kapiert zu haben, was und weshalb ich da eingreifen musste.