Vault Mod: Tageszinsen berechnen?

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Vault Mod: Tageszinsen berechnen?

Beitrag von Dungeonwatcher »

Hi! :cool:

Ich will das Zinssystem des Vault Mods ändern. Die eingebaute Version ist zu unlogisch und führt zu Verwirrung. ^6
Gedacht habe ich an ein Tageszinskonto mit täglicher Verzinsung und jährlicher oder vierteljährlicher Auszahlung.

Dazu habe ich bereits folgendes umgesetzt:

Code: Alles auswählen

$vault_day = create_date('Ymd', $board_config['vault_loan_interests_time'], $board_config['board_timezone']);
$current_time = time();
$current_day = create_date('Ymd', $current_time, $board_config['board_timezone']);
if ($vault_day < $current_day)
{
Damit wird ein täglicher Abgleich des Tagesdatums analog PHP Funktion zeitgesteuert ausführen? durchgeführt. Das funktioniert auch inkl. dem aktualisieren des Datums in der DB.

Nun lese ich den aktuellen Jahres Zinsatz (interests_rate) aus der Tabelle VAULT_GENERAL aus und teile ihn durch 365 Tage.

Code: Alles auswählen

$vault_general = vault_get_general_config();

$sql = "SELECT * FROM " . VAULT_GENERAL_TABLE ;
if(!$result = $db->sql_query($sql))
{
	message_die(CRITICAL_ERROR, "Could not query information in Vault General Table", "", __LINE__, __FILE__, $sql);
}
while( $row = $db->sql_fetchrow($result) )
{
	$vault[$row['config_name']] = $row['config_value'];
}

$interests_day = ( $vault_general['interests_rate'] / 365);
Auch das funktioniert bestens.

Dieses Ergebnis soll nun mit den einzelnen User Konten (account_sum) multipliziert werden. Dazu müssen aus der Tabelle VAULT_USERS die Werte für owner_id (entspricht der User_ID) und account_sum (aktueller Kontostand) ausgelesen und verbunden werden. Das versuche ich so zu lösen:

Code: Alles auswählen

	for ( $i = 0 ; $i < count ( $owner ) ; $i ++ )
	{
		$a = $owner[$i]['account_sum'];
		$account_sum_interests_day = $a / 100 * $interests_day;

		$usql = "UPDATE " . USERS_TABLE . "
			SET account_sum_interests = account_sum_interests + $account_sum_interests_day
			WHERE owner_id =  ".$owner[$i]['owner_id'];
		$uresult = $db->sql_query($usql);
		if( !$uresult )
		{
			message_die(GENERAL_ERROR, "Couldn not update Vault Users Table", "", __LINE__, __FILE__, $usql);
		}
	}
Das funktioniert bis Zeile 4 perfekt. Mittels

Code: Alles auswählen

echo "$a";
echo "$account_sum_interests_day";
werden die korrekten Werte angezeigt.

Nun müssen dies Werte nur noch in die DB eingetragen werden. Das sollte eigentlich mit diesem Code funktionieren:

Code: Alles auswählen

		$usql = "UPDATE " .VAULT_ USERS_TABLE . "
			SET account_sum_interests = account_sum_interests + $account_sum_interests_day
			WHERE owner_id =  ".$owner[$i]['owner_id'];
		$uresult = $db->sql_query($usql);
		if( !$uresult )
		{
			message_die(GENERAL_ERROR, "Couldn not update Vault Users Table", "", __LINE__, __FILE__, $usql);
		}
Nachtrag:

Und wie es bei mir desöfteren so ist, während ich hier versuche mein Problem zu schildern, fällt mir die Lösung ein. ;)

Ich habe den hier geposteten Code entsprechend korrigiert, falls doch mal jemand interesse daran haben sollte.

Bye
Zuletzt geändert von Dungeonwatcher am Di 10.Mär, 2009 16:52, insgesamt 2-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Die gesamte Schleife ist doppelt und auch falsch (Du packst ein Array als Key in ein Array...).
Ich würde es deutlich schlanker gestalten, nämlich so:

Code: Alles auswählen

	$sql = "SELECT account_sum FROM " . VAULT_USERS_TABLE . "
		WHERE owner_id = '$owner_id'";
	if(!($result = $db->sql_query($sql)))
	{
		message_die(GENERAL_ERROR, "Couldn not query information Vault Users Table", "", __LINE__, __FILE__, $sql);
	}

	$account_sum_interests_day = 0;

	while ($row = $db->sql_fetchrow($result))
	{
		$account_sum = $row['account_sum'];
		$account_new_sum = $account_sum * $interests_day;
		$account_sum_interests_day += $account_new_sum;
	}

	$db->sql_freeresult($result);

	$sql = "UPDATE " . USERS_TABLE . "
		SET account_sum_interests = account_sum_interests + $account_sum_interests_day
		WHERE owner_id = $owner_id";
	if(!($result = $db->sql_query($sql)))
	{
		message_die(GENERAL_ERROR, "Couldn not update Vault Users Table", "", __LINE__, __FILE__, $sql);
	}
Das spart ettliche Queries und kommt IMHO zum gewünschten Ziel...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Beitrag von Dungeonwatcher »

Hi! :cool:

Da war ich gestern wohl doch etwas langsam beim editieren meiner letzten Nachricht. :)

Egal, ich versuche deinen Code erfolglos nachzuvollziehen. Aber das liegt wohl eher an meiner noch großen Unwissenheit. ^6

Was die Queries angeht, sind diese nicht wirklich ein Problem auf meiner Kiste. Da bremst eher das "lahme" PHP. Bis auf mein Portal mit diesen Werten: 3.6288s (PHP: 95% - SQL: 5%) - SQL queries: 86 ist alles andere im grünen Bereich weit unter 1 Sekunde.

Bye
MiSchmi11

Re: Vault Mod: Tageszinsen berechnen?

Beitrag von MiSchmi11 »

Hallo!

Gibt es da inzwischen auch eine funktionierende Lösung? Würde sowas gerne mal auf meiner Website ausprobieren und einen Zinsvergleich anbieten.
Z.b. wie bei http://www.tageszinsen.net im Tagesgeldvergleich.

Danke und gute Nacht!
Antworten