Vault Mod: max. Anzahl von Aktien festlegen

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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.
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:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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!!
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:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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.
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:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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.
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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)
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:

Re: Vault Mod: max. Anzahl von Aktien festlegen

Beitrag 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
Antworten