Riesen Problem mit PHP - Nachkommastellen

Alles, was PHP betrifft, kann hier besprochen werden.

Riesen Problem mit PHP - Nachkommastellen

Postby mischka1 » 19. June 2008 16:03

Hallo zusammen,

ich habe seit kurzem ein riesen Problem mit meinem XAMPP.

Es gibt mehere Importscripte welche csv und/oder txt Datei in eine DB schreiben. Da bei kommt es sporadisch zu einem Fehler.
Einige Zahlwerte müssen berechnet werden Brutto/Netto oder einfachste Summen, diese Berechnungen macht das PHP. Es werden Zahlwerte (Preise) nur noch bis zum Komma in der DB gespeichert, parallel lasse ich die Werte noch in ein Textfeld in der DB speichern und formatiere diese zuvor mittel number_format, dort sind die Werte korrekt. Das Problem zieht sich dann auch über alle Zeilen der Dateien.


Das Zielfeld in der DB hat als Datentyp "float".

Das witzige ist, wenn man den Import kurz mit der selben Datei darauf wiederholt, werden alle Werte richtige gespeichert.

Kann das hier evtl. (Arbeits-)Speicherprobleme geben?

Hat jemand einen tip oder lösung?

Danke :)
mischka1
 
Posts: 3
Joined: 19. June 2008 15:55

Postby Wiedmann » 19. June 2008 17:37

Es werden Zahlwerte (Preise) nur noch bis zum Komma in der DB gespeichert

Testen und darüber nachdenken:
Code: Select all
<?php
    var_dump((float) '1.2');
    var_dump((float) '1,2');
?>
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby mischka1 » 19. June 2008 20:04

Wiedmann wrote:
Es werden Zahlwerte (Preise) nur noch bis zum Komma in der DB gespeichert

Testen und darüber nachdenken:
Code: Select all
<?php
    var_dump((float) '1.2');
    var_dump((float) '1,2');
?>



Danke für diese nichtssagende Hilfe.
Die Zahlwerte werden mit einem Punkt zu DB gesendet und wie schon beschrieben funktioniert das Script auch zu 95%. Es werden die Zahlen im korrekten Format übergeben, jedoch wird im konkreten Beispiel folgendes ausgegeben:

Code: Select all
$var = 2.6;
echo number_format($var, 2, ',', '');

gibt wie zu erwarten eine 2,6 zurück und speichert diese Testhalber in der DB in einem Datenfeld (Varchar).

Die selbe Variable ($var) soll nun in ein Datenfeld (Float) in der DB geschrieben werden, das klappt auch zu 95%

Nur eben passiert es unter Umständen das ($var) nur den Wert 2 im Float-Datenfeld hat, aber eben im Testfeld(Varchar) die formartierten 2,6.

Das ist das Problem, wieso läuft dsa Script nicht immer.
Aufgefallen ist mir, das das dann passiert wenn vorher eine Berechnung.

Hier mal ein Beispiel:
Code: Select all
$zwischen = 99.99;
$steuer = ($zwischen * 19.0) / 119;
mysql_query("insert into orders_total_local (orders_id, title, text, value, class, sort_order) values ('".$tmp_data['order-id']."', 'inkl. UST 19%:', '".number_format($steuer, 2, ',','')."' ,'".floatval($steuer)."', 'ot_tax', '50')");


In diesem Fall schreibt es eine 99,99 in das text feld und in das value Feld eine 99.

WIE GESAGT DAS PASSIERT NICHT IMMMER!!!!

Hast jemand noch eine Idee?
mischka1
 
Posts: 3
Joined: 19. June 2008 15:55

Postby Wiedmann » 19. June 2008 21:00

Hier mal ein Beispiel:
Code: Select all
$zwischen = 99.99;
$steuer = ($zwischen * 19.0) / 119;
mysql_query("insert into orders_total_local (orders_id, title, text, value, class, sort_order) values ('".$tmp_data['order-id']."', 'inkl. UST 19%:', '".number_format($steuer, 2, ',','')."' ,'".floatval($steuer)."', 'ot_tax', '50')");

In diesem Fall schreibt es eine 99,99 in das text feld und in das value Feld eine 99.

Bei diesem Beispiel kann es nciht passieren, dass er diese Werte in die Felder schreibt. (es wird ja $steuer geschrieben und nicht $zwischen)

(Jedenfalls kann ich es damit nciht nachvollziehen)

WIE GESAGT DAS PASSIERT NICHT IMMMER!!!!

Um das zu präzisieren:
- Es passiert generell nicht immer?
- Es passiert auch mit den selben (z.b. den oben angegeben) Zahlen nicht immer (das obige Script in einem Loop)?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby mischka1 » 20. June 2008 10:39

Ja, es passiert völlig sporadisch.
Das Script läuft bereits seit fast einem Jahr und es gab nie derartige Probleme. Es läuft immer eine Import-Datei von Anfang bis Ende durch und wenn der Fehler auftritt, dann zieht er sich durch den gesamten Import. Probiert es mit der selben Datei ein paar Minuten später noch einmal, funktioniert es tadellos. Es tritt eigentlich erst seit ein paar Tagen auf, seit der Server ziemlich am Resourcen-Limit läuft.

Daher meine Vermutung, das es mit der Auslastung des Rechners zu tun haben könnte, sprich bei maximaler Speicherauslastung werden bestimmte PHP-Funktionen nicht vollständig oder korrekt ausgeführt. Ist sowas überhaupt möglich?

Was ebenfalls einen Programmierfehler fast völlig ausschließt ist, das es unterschiedliche Importe (Scripte) betritt und wenn der Fehler auftritt, ist er in allen Importen vertreten, selbst bei einem DB-Abgleich zwischen einer Lokalen und einer entfernten DB, wo nur Werte ausgelesen und wieder geschrieben werden (außer bei Produktpreisen wo eine Berechnung der Mehrwertsteuer durchgeführt werden muss).

Was aber alles schon und auch meistens funktioniert eben nur manchmal passiert der Fehler.
mischka1
 
Posts: 3
Joined: 19. June 2008 15:55


Return to PHP

Who is online

Users browsing this forum: No registered users and 3 guests