Seite 1 von 1

Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Mi 17.Nov, 2010 20:24
von Dungeonwatcher
Hi großer Meister! :cool:

Seit Wochen grübel ich über ein Problem und komme nicht weiter. ^6

Ich will den Vault Mod (Aktien) erweitern, indem nur eine festgelegte Anzahl pro Aktie verfügbar und somit gekauft/verkauft werden kann. Dazu habe ich die entsprechende Tabelle (vault_exchange) um zwei Felder erweitert:

stock_name_max = max. Anzahl verfügbare Aktien
stock_name_max_free = noch verfügbare Aktien

Die entsprechenden Einträge darin werden beim Anlegen/Bearbeiten einer Aktie im ACP eingetragen. Das funktioniert bestens. Das Auslesen und Anzeigen dieser Werte aus der DB in der Übersicht klappt auch problemlos. Nun hänge ich daran fest, das ich es nicht hinbekomme, das beim kaufen/verkaufen einer Aktie diese beiden Werte berücksichtigt werden und das jeweilige Ergebnis in die DB eingetragen wird. ^6
Folgender Code ist hierfür verantwortlich:

Code: Alles auswählen

if ( $exchange_submit )
{
	$sql = "SELECT *
		FROM " . VAULT_EXCHANGE_TABLE ."
		ORDER BY stock_id 
		DESC LIMIT 1";
	$result = $db->sql_query($sql);
	if( !$result )
	{
		message_die(GENERAL_ERROR, 'Could not obtain stock exchange information', "", __LINE__, __FILE__, $sql);
	}
	$stock_data = $db->sql_fetchrow($result);
	$max = $stock_data['stock_id'];
	
	$owned = $db->sql_fetchrow($result);

	for ($i=0; $i <= $max; $i++) 
	{ 
		$input = 'buy_item' . $i; 
		$$input = doubleval($HTTP_POST_VARS[$input]);
		$input2 = 'sell_item' . $i;
		$$input2 = doubleval($HTTP_POST_VARS[$input2]);
	}
	$sql = "SELECT stock_price , stock_id FROM " . VAULT_EXCHANGE_TABLE ." 
		ORDER BY stock_id";
	$result = $db->sql_query($sql);
	if( !$result )
	{
		message_die(GENERAL_ERROR, 'Could not obtain items pets information', "", __LINE__, __FILE__, $sql);
	}
	$items = $db->sql_fetchrowset($result);
	for ( $i = 0 ; $i < count($items) ; $i ++ )
	{
		$price = 0;
		$a = $items[$i]['stock_id'] ;
		$buys = 'buy_item'.$items[$i]['stock_id'].'';
		$buy = $$buys;
		$sells = 'sell_item'.$items[$i]['stock_id'].'';
		$sell = $$sells;
		$sell_price = ($sell * $items[$i]['stock_price']);
		$bank_profit = round($sell_price * $stock_sell_tax/100,2);
		$sell_user_profit = $sell_price - $bank_profit;
		
		$price = ((( $buy - $sell ) * $items[$i]['stock_price'] ) + $bank_profit);
		$price2 = number_format(floatval($items[$i]['stock_price']),2, ".", "");
		
		$ssql = "SELECT stock_amount FROM " . VAULT_EXCHANGE_USERS_TABLE ." 
		WHERE stock_id = ".$items[$i]['stock_id']."
		AND user_id = ".$user_id;
		$sresult = $db->sql_query($ssql);
		
		if( !$sresult )
		{
			message_die(GENERAL_ERROR, 'Could not obtain shares information', "", __LINE__, __FILE__, $ssql);
		}
		$user_items = $db->sql_fetchrow($sresult);
		if ( (( $sell - $buy ) > $user_items['stock_amount'] && is_numeric($user_items['stock_amount'])) || ( !(is_numeric($user_items['stock_amount'])) && (( $buy - $sell ) < 0) ) )
		{
			vault_previous( Vault_stock_lack , vault , '' , '');
		}
		if ( $price > $userdata['user_points'])
		{
			vault_previous( Vault_points_lack , vault , '' , '');
		}
		else
		{
			$sql = "UPDATE " . USERS_TABLE ."
				SET user_points = user_points - $price
				WHERE user_id = $user_id";
			if( !$db->sql_query($sql))
			{
				message_die(GENERAL_ERROR, 'Could not obtain update user points', "", __LINE__, __FILE__, $sql);
			}
			
			$sql = "UPDATE " . VAULT_GENERAL_TABLE ."
				SET config_value = config_value + $bank_profit
				WHERE config_name = 'bank_profit_sum'";
			if( !$db->sql_query($sql))
			{
				message_die(GENERAL_ERROR, 'Could not obtain update bank profit', "", __LINE__, __FILE__, $sql);
			}
			
		}
		$userdata['user_points'] = $userdata['user_points'] - $price;
		$prize = $buy - $sell;
		
		if ( is_numeric($user_items['stock_amount']) &&	$prize != 0 )
		{
			$rsql = "UPDATE " . VAULT_EXCHANGE_USERS_TABLE ."
				SET stock_amount = stock_amount + $prize ,
				price_transaction = $price2
				WHERE user_id = $user_id
				AND stock_id = ".$items[$i]['stock_id'];
			if( !$db->sql_query($rsql))
			{
				message_die(GENERAL_ERROR, 'Could not update user stock 1', "", __LINE__, __FILE__, $rsql);
			}
		}
		else if ( !(is_numeric($user_items['stock_amount'])) && $prize != 0 )
		{
			$rsql = "INSERT INTO " . VAULT_EXCHANGE_USERS_TABLE ."
				( stock_id , user_id , stock_amount , price_transaction )
				VALUES ( ".$items[$i]['stock_id']." , $user_id , $prize , $price2 )";
			if( !$db->sql_query($rsql))
			{
				message_die(GENERAL_ERROR, 'Could not update user stock 2', "", __LINE__, __FILE__, $rsql);
			}
		}
	}
	$stock_exchange = TRUE;	
}
Legende:

buy_item = kaufen
sell item = verkaufen
stock_amount = Anzahl der Aktien des Users

Einige "Hiebe" auf meinen Hinterkopf wären jetzt sicher angebracht. Sei bitte so nett und versuche mich auf den richtigen Weg zu bringen. ;)

Bye

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Do 18.Nov, 2010 09:09
von oxpus
Du fragst hiermit an, welche Werte die Aktien haben:

Code: Alles auswählen

       $sql = "SELECT stock_price , stock_id FROM " . VAULT_EXCHANGE_TABLE ."
          ORDER BY stock_id";
       $result = $db->sql_query($sql);
Weiter unten im Code fragst du dann bestimmte Bedingungen ab, wie Preis über User-Geld, etc.
Hier wäre doch die verfügbare Anzahl Aktien mit abzufragen und dann mit dem zu vergleichen, wie viele der User kaufen will.
Also die Abfrage zunächst ändern in

Code: Alles auswählen

       $sql = "SELECT stock_price , stock_id, stock_name_max_free FROM " . VAULT_EXCHANGE_TABLE ."
          ORDER BY stock_id";
       $result = $db->sql_query($sql);
Dann kann man die verfügbare Anzahl eben verwenden und mit einer Bedingung darauf prüfen. So in etwa:

Code: Alles auswählen

if ($variable_für_die_anzahl_zu_kaufender_aktien > $items[$i]['stock_name_max_free'])
{
       $mögliche_kaufanzahl = $items[$i]['stock_name_max_free'];
}
Und damit kann der User nur noch soviele Aktien kaufen, wie verfügbar sind.
Natürlich muss dann neben der Aktualisierung der Userdaten dann auch die Tabelle vaule_exchange aktualisiert werden, damit stock_name_max_free reduziert, oder im obigen Fall auf 0 gesetzt wird.

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 11:19
von Dungeonwatcher
Moin Meister! :cool:

Das Prinzip habe ich verstanden, nur an der Umsetzung hapert es wieder mal. ^6

Ich habe nun zwei Variablen erstellt:

$stock_name_max = max. vorhandene Aktien
$stock_name_max_free = verfügbare Aktien

Code: Alles auswählen

	$sql = "SELECT stock_price, stock_id, stock_name_max, stock_name_max_free FROM " . VAULT_EXCHANGE_TABLE ." 
		ORDER BY stock_id";
	$result = $db->sql_query($sql);
	if( !$result )
	{
		message_die(GENERAL_ERROR, 'Could not obtain items pets information', "", __LINE__, __FILE__, $sql);
	}
	$items = $db->sql_fetchrowset($result);
	for ( $i = 0 ; $i < count($items) ; $i ++ )
	{
		$price = 0;
		$a = $items[$i]['stock_id'];
		$stock_name_max = $items[$i]['stock_name_max'];
		$stock_name_max_free = $items[$i]['stock_name_max_free'];
		$buys = 'buy_item'.$items[$i]['stock_id'].'';
		$buy = $$buys;
		$sells = 'sell_item'.$items[$i]['stock_id'].'';
		$sell = $$sells;
		$sell_price = ($sell * $items[$i]['stock_price']);
		$bank_profit = round($sell_price * $stock_sell_tax/100,2);
		$sell_user_profit = $sell_price - $bank_profit;
		
		$price = ((( $buy - $sell ) * $items[$i]['stock_price'] ) + $bank_profit);
		$price2 = number_format(floatval($items[$i]['stock_price']),2, ".", "");
		
		$ssql = "SELECT stock_amount FROM " . VAULT_EXCHANGE_USERS_TABLE ." 
		WHERE stock_id = ".$items[$i]['stock_id']."
		AND user_id = ".$user_id;
		$sresult = $db->sql_query($ssql);
Mittels echo hinter diesem Block werden dann ALLE Aktien mit den korrekten Werten aufgelistet. Damit funktioniert natürlich

Code: Alles auswählen

if ($variable_für_die_anzahl_zu_kaufender_aktien > $items[$i]['stock_name_max_free'])
{
       $mögliche_kaufanzahl = $items[$i]['stock_name_max_free'];
}
nicht. Was ist da falsch?

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 12:17
von oxpus
Die Variablen $variable_für_die_anzahl_zu_kaufender_aktien und $mögliche_kaufanzahl hast du aber schon durch diejenigen ersetzt, die du im Vault MOD an dieser Stelle brauchst?
Die sind von mir nur beispielhaft so benannt worden!!

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 13:55
von Dungeonwatcher
oxpus hat geschrieben:Die Variablen $variable_für_die_anzahl_zu_kaufender_aktien und $mögliche_kaufanzahl hast du aber schon durch diejenigen ersetzt, die du im Vault MOD an dieser Stelle brauchst?
Hmmm, <grübel> jetzt schon :!: :

$variable_für_die_anzahl_zu_kaufender_aktien = $buy
$mögliche_kaufanzahl = $stock_name_max_free

Das ganze sieht nun so aus:

Code: Alles auswählen

if ($stock_name_max_free < $buy)
{
	vault_previous( Vault_stock_buy , vault , '' , '');
}
if ($stock_name_max_free >= $buy)
{
und funktioniert auch schon fast wie gewünscht. Sollten zu wenige Aktien verfügbar sein gibt es die passende Fehlermeldung. Sind gleich viel oder mehr Aktien vorhanden kann gekauft werden.

Bleibt jetzt nur noch eines, was alles durcheinander bringt. Es sind teilweise mehr Aktien im Umlauf als ich nun freigeben möchte. Diese möchte ich nach und nach noch verkaufen lassen, solange kann von diesen aber auch nichts mehr gekauft werden. Also habe ich die kplt. Anzahl dieser Aktien minus der max. erlaubten Anzahl als Minuswert in die DB unter max. Verfügbar eingetragen. Mit dieser negativen Zahl kommt aber ebenfalls die Meldung das nicht genügend Aktien zum kaufen vorhanden sind. D.h. diese Bedingung trifft zu:

Code: Alles auswählen

if ($stock_name_max_free < $buy)
{
	vault_previous( Vault_stock_buy , vault , '' , '');
}
Warum wird diese neg. Zahl als Positive gewertet?

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 14:15
von oxpus

Code: Alles auswählen

Warum wird diese neg. Zahl als Positive gewertet?
Wie ist denn das Feld in der Datenbank-Tabelle angelegt? "Unsigned" oder nicht?
Unsigned heisst: Das Vorzeichen wird abgeschnitten.
Ansonsten wäre die Bedingung nicht falsch, sondern wahr.

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 15:50
von Dungeonwatcher
oxpus hat geschrieben:Wie ist denn das Feld in der Datenbank-Tabelle angelegt? "Unsigned" oder nicht?
Weder noch, einfach bigint(15) ohne Attribut. Das Vorzeichen wird ja auch korrekt ausgelesen.

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: Fr 19.Nov, 2010 20:56
von oxpus
Dann sollte aber auch eine Zahl unter 0 kleiner sein, als die Anzahl der zu kaufenden Aktien.
Die erste Bedingung wäre dann WAHR, also erfüllt.
Wenn du die Meldung allerdings nur erfüllen willst, wenn die verfügbare Anzahl Aktien 0 oder höher ist, dann müsste die Bedingung so aussehen:

Code: Alles auswählen

if ($stock_name_max_free => 0 && $stock_name_max_free < $buy)

Re: Vault Mod: max. Anzahl von Aktien festlegen

Verfasst: So 21.Nov, 2010 11:17
von Dungeonwatcher
Moin, moin Meister! :cool:

Wo du mal wieder recht hast. :hh:

Allerdings funktioniert dann das kaufen/verkaufen genau dieser Aktien nicht. Egal, ich lege da jetzt selber regelmäßig Hand an und sowie von diesen Aktien was verkauft wurde werden diese entsprechend händisch gelöscht. Sooooviele sind das ja auch wieder nicht.

THNX für deine Denkanstöße

Bye