Fehler in Verarbeitung

Sasser

Erfahrenes Mitglied
Guten Morgen!

Ich nutze die automatische Zahlungsabwicklung von PayPal, welche auch funktioniert. PayPal ruft nach erfolgreicher Zahlung mein Script auf und übergibt u.a. auch den gezahlten Preis. Aus diesem Gesamtbetrag und dem Einzelpreis für einen Monat berechne ich dann die Gesamtmonate, welche ich den User gutschreibe. Dabei gibt es aber leider massive Probleme. Der Gesamtbetrag wird korrekt übergeben, allerdings errechnet er daraus folgendes (1. ist das gekaufte und 2. das errechnete):

1 Monat > 1 Monat
2 Monate > 2 Monate
3 Monate > 2 Monate
4 Monate > 4 Monate
5 Monate > 4 Monate
6 Monate > 5 Monate
7 Monate > 6 Monate
8 Monate > 8 Monate
9 Monate > 9 Monate
10 Monate > 9 Monate
11 Monate > 11 Monate
12 Monate > 12 Monate

PHP:
$quantity = floor ( $price / show ( premiumprice ) );
			$db = connect_db ();
			$row = mysql_fetch_assoc ( mysql_query ( "SELECT `premium`, `premiumhistory` FROM user WHERE `user` = '$user'", $db ) );
			mysql_close ( $db );
			if ($row [premium] >= time ()) {
				$premium = $row [premium] + ($quantity * 2678400) + (floor ( $quantity / show ( premiumfreefrom ) ) * 2678400);
			} else {
				$premium = time () + ($quantity * 2678400) + (floor ( $quantity / show ( premiumfreefrom ) ) * 2678400);
			}
			if ($row [premiumhistory] != "") {
				$premiumhistory = date ( 'd.m.Y' ) . "|" . $price . "#" . $row [premiumhistory];
			} else {
				$premiumhistory = date ( 'd.m.Y' ) . "|" . $price;
			}

Bitte nicht von "premiumfreefrom" irritieren lassen, denn diese Variable gibt an, ab welchen Monate es einen gratis dazu gibt.

Findet jemand meinen Fehler, warum er solche komischen Sachen errechnet? Ich suche schon seit Tagen, finde aber leider nichts... Wie gesagt der gezahlte Preis wird definitiv korrekt übergeben!

Vielen Dank für eure Hilfe!
 
Kannst du bitte nochmal erklären was bei dir als Ergebnis raus kommt und in wie fern sich das von dem realen Betrag unterscheidet?
Ist es ein nachvollziehbarer Wert, wie zum Beispiel das der letzte Monat doppelt berechnet wird oder ist es sporadisch?
Weil die Auflistung mit den 12 Monaten sagt mir nur eins: Bahnhof. ;-)
 
Also das Muster sieht sehr komisch aus, aber da es immer weniger ist, dann wieder stimmt denke ich es liegt vielleicht an
PHP:
 floor()
Vielleicht einmal zu viel abgerundet :D

Welche Variable gibt dann das Datum aus?
 
Aber rundet

PHP:
floor ();

denn nicht immer auf die nächste Ganzzahl ab?

So ich habe nun die Sache einmal gekürzt.

Bei der folgenden Prozedur kommt komischerweise 2 anstatt 3 heraus!?

PHP:
$premiumpreis = "2.49";
$premiumfreefrom = "0";

$price = "7.47";

$quantity = floor ( $price / $premiumpreis );

$premium_duration = $quantity + floor ( $quantity / $premiumfreefrom );

echo "Dauer: ".$quantity."<br><br>";

echo "Ingesamt: ".$premium_duration;
 
Das ist nicht komisch. Das ist PHP :D glaub ich.
Weil es sich hierbei um float-Zahlen aus einem String heraus handelt, denke ich das er bei der Berechnung einen Wert rauskriegt der knapp unter der 3 ist und floor macht daraus selbstverständlich 2.
Leider ein Problem mit float-Zahlen.
http://de3.php.net/manual/de/function.floor.php#82042
http://de3.php.net/manual/de/function.floor.php#66807

Daher Empfehle ich dir die Zahlen als Integer rechnen zu lassen:
PHP:
$a = (int) ("2.49" * 100);
$b = (int) ("7.47" * 100);
$c = (int) $b / $a;
echo $c;

Type-Cast von float nach int "rundet" von sich aus immer zum nächsten Integer "in richtung 0".
 
Zuletzt bearbeitet:
Ich danke dir für die Superschnelle Hilfe!

Ich werde es ausprobieren und mich nochmal melden :-)

Warum bin ich eigentlich nicht darauf gekommen...
 
So ich habe es nun getestet, allerdings kommt nun bei folgender Prozedur 3.5 anstatt 3 heraus!? Wo liegt noch mein Fehler!?

PHP:
$test = "7.47";

$premiumprice = (int) 2.49 * 100;
$payed = (int) $test * 100;
$quantity = (int) $payed / $premiumprice;

echo $quantity;
 
Die Präzedenz schlägt in letzter Zeit furchtbar häufig zu ;)
Es wird erst der Type-Cast gemacht und dann die Rechenoperation.
Beispiel:
PHP:
$premiumprice = (int) 2.49 * 100;
// mit Klammern die Präzedenz angedeutet:
$premiumprice = ( ( (int) 2.49 ) * 100 );
// höchste Präzedenz - Type-Cast
$premiumprice = ( ( 2 ) * 100 );
// nächsthöchste - Multiplikation
$premiumprice = ( 200 );
Sieh dir die Klammern bei meinem letzten Post an, damit kannst du das ein bisschen steuern.
Du kennst Präzedenz schon aus der Mathematik: Punkt vor Strich. Hier ist es Type-Cast vor Rechenoperationen. Mehr dazu in der Tabelle.

Hier noch das versprochene Bild zu Präzedenz in JAVA die ich in PHP immer gut anwenden konnte:
So. Bin inner Mensa... Antworten dauert :P
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    20,3 KB · Aufrufe: 5
Zuletzt bearbeitet:
Zurück