User-Punktesystem nach Aktivität

lisali

Erfahrenes Mitglied
Hallo!

Ich würde gerne ein Punktesystem für User, gemessen an ihrer Aktivität, basteln.
Da dachte ich an eine Extra-Tabelle mit den Spalten `user_id`, `login`, `logout`, wobei login und logout jeweils DATETIME-Spalten sind.

Von der Idee her möchte ich für jeden User letztendlich eine Gesamtauswertung machen, wobei ich jeweils daran dachte, dass man die an der Online-Aktivität eines Tages festmachen könnte.
Das heißt, dass immer jeweils der Login und Logout in der Datenbank als Zeit-Eintrag gespeichert wird (natürlich dann noch mit der zugehörigen user_id).

Jetzt habe ich mich aber gefragt wie ich das anstelle, dass ich weiß wann ein User immer offline ist. Also, bei mir gilt ein User automatisch nach 15min Inaktivität oder wenn er sich selbst ausloggt als offline... jedoch frage ich mich wie ich das in die Datenbank speichere, wenn keiner klickt?
Vor allem was noch den richtigen UPDATE-Befehl angeht, weil ich ja jeweils die Logout-Zeit dem letzten Eintrag in der Datenbank der Login-Zeit zuordnen muss. Die Frage ist eben wie ich das anstelle und wann bzw. bei welcher Aktion und von wem.
Wahrscheinlich gibt es da irgendwie noch mehr Sachen, die ich dabei nicht beachte oder in Betracht ziehe, die mir gerade entgehen und euch vielleicht auf/-einfallen...!?
Wie könnte man das Ganze vernünftig angehen und realisieren?

So viel weiter habe ich bisher aber nicht gedacht, auch nicht was bei dem ganzen die Belastung der Datenbank angeht. Ist meine Idee vom Ansatz her überhaupt gut oder sollte man das ganz anders und auch effizienter umsetzen? Wenn ja, wie genau?

Zur Entlastung dachte ich aber an eine tägliche Löschung der Daten pro Tag jedes Users, da die Gesamtpunkteanzahl in der User-Tabelle festgehalten werden sollen.

Ich freue mich über jede hilfreiche Antwort, dankeschön!

Liebe Grüße,

Lisa
 
Zuletzt bearbeitet:
Benutzer-Aktivitäts-Punktesystem

Hallo!

Ich möchte gerne ein Punktesystem, ähnlich wie bei den Erfahrungspunkten (XP) in Online-Rollenspielen, realisieren.
Statt Level soll es jedoch Ränge geben. Der maximale Rang soll 99 sein.
Das heißt, dass man eine bestimmte Anzahl an Punkten bei Rang 1 hat wie z.B. 100.
Pro Rang soll dieses Maximum an zu erreichenden XP aber immer um eine bestimmte Zahl steigen, z.B. immer um 15% zum davor maximal erreichbaren XP letzten Rangs.
Die derzeitige Anzahl aller gesammelten Erfahrungspunkten ist jeweils in der User-Datenbank als Zahl gespeichert.

Jetzt zerbreche ich mir schon eine Weile meinen Kopf wie ich das PHP-technisch anstellen könnte, das auch so umzusetzen wie ich mir vorstelle.

Ich hoffe jemand kann mir helfen, wäre total dankbar!


Liebe Grüße,

Lisa
 
Also, ich bin jetzt selbst drauf gekommen und es klappt auch prima, jedoch habe ich nun ein Problem das ganze in eine Funktion zu packen. Was habe ich hier falsch gemacht?

PHP:
function ranking($value){
global $xp_percent, $rank, $value, $max_xp, $start_max_xp, $total_xp;
$total_xp = 1000; # max. Anzahl an XP (ergibt höchsten Rang)
$max_rank = 99; # höchster Rang
$start_max_xp = 40; # max. Anzahl an XP bei Rang 1
$rank = round($get[xp] / $start_max_xp); # derzeitiger Rang
if ($rank == 0){ $rank = 1; }
$max_xp = (($start_max_xp * $rank) + 5); # max. Anzahl an XP pro Rang
if ($rank == $max_rank) { $rank = $max_rank; } # höchster Rang wurde erreicht

$xp_percent = $get[xp] / $max_xp * 100;
$xp_percent = round($xp_percent,2);

$rank = str_pad($rank, 2, "0", STR_PAD_LEFT);

echo $value;
}

# --- Ausgabe:
ranking($rank);
ranking($xp_percent);
 
Zuletzt bearbeitet:
Hi,

was du noch brauchst, ist eine Aktivitätsspalte (evtl. auch Zeitstempel), die immer dann upgedatet wird, wenn ein User eine neue Seite aufruft.

Dann könntest du einen Cronjob erstellen, der diese Aktivitätsspalte prüft und nach einer definierten Zeit die Logout-Spalte füllt.
 
Na wusch, das klingt nach Arbeit.

Du könntest die SessionID in die db mit login- Datum eintragen und nach automatischem inaktiv das logout setzen. Das "automatische" ausloggen machst du mit einem Cronjob. Falls derjenige jetzt doch noch aktiv ist und sich abmeldet überschreibst du das logout Feld.

Das ganze greift natürlich nicht alle Eventualitäten ab, da er auch nach einer Stunde einfach den Browser schließen kann und trotzdem bei dir nur mit 15min drin ist.
 
Rangsystem... komme einfach nicht weiter!

An die Mods: Bitte lasst das Thema so wie es ist ohne andere Beiträge von mir zu Threads zu verschieben, die kontextuell gar nicht zuzuordnen sind.

Hallo,

ich möchte gerne ein Punktesystem, ähnlich wie bei den Erfahrungspunkten in Online-Rollenspielen (folglich nur noch mit Abkürzung XP bezeichnet), für registrierte User realisieren.
Statt Level soll es jedoch Ränge geben. Der maximale Rang soll 99 sein.
Das heißt, dass man eine bestimmte Anzahl an Punkten bei Rang 1 hat, wie z.B. 100.
Pro Rang soll dieses Maximum an zu erreichenden XP aber immer um eine bestimmte Zahl steigen, z.B. immer um 5% zum davor maximal erreichbaren XP letzten Rangs.
Die derzeitige Anzahl aller gesammelten Erfahrungspunkten ist jeweils in der User-Datenbank als Zahl gespeichert. Das heißt, es gibt je nach Aktion (Mail schreiben, Online-Dauer, im Forum aktiv sein, Freunde werben, etc.) XP in unterschiedlichen Werten.

Jetzt zerbreche ich mir schon eine Weile meinen Kopf wie ich das PHP-technisch anstellen könnte, das auch so umzusetzen wie ich mir vorstelle.

Bisher habe ich das auf die Beine gebracht und habe mal kommentiert, wo ich was erreichen möchte:

PHP:
function ranking($var){
$get = mysql_fetch_array(mysql_query("SELECT xp FROM 
users WHERE id='".$_SESSION['user_id']."'")); # XP aus Datenbank ermitteln
$max_rank = 99; # höchster Rang
$max_xp_start = 100; # max. Anzahl an benötigten XP (NUR bei Rang 1)

    if ($get[xp] >= $max_xp_start) # wenn XP größer als $max_xp_start (sozusagen: wenn > Rang 1)
    {
    $rank = ""; # aktueller Rang - /* 1 */
    $max_xp = ""; # max. Anzahl an XP pro Rang - /* 2 */
    $xp_now = ""; # aktuelle XP /* 3 */
    $xp_percent = ($xp_now / $max_xp * 100); #  Prozentsatz jeder Rangstufe
    }
    else
    {
    $rank = 1;
    $xp_percent = ($get[xp] / $max_xp_start * 100);
    }

$rank = str_pad($rank, 2, "0", STR_PAD_LEFT); # Rang wird mir Nullen gefüllt, wenn < 10

return $var; # Ausgabe
global $rank,$xp_percent,$max_xp,$get;
}

Wie gesagt, dieses "Konstrukt" ist nicht gut durchdacht, aber weiter bin ich nun alleine nicht gekommen.
Zu den Zeilen, die ich kommentiert und gekennzeichnet habe:

/* 1 */ : Wie ermittel ich den aktuellen Rang mit gegebenen Werten? Ich habe die Gesamtpunktzahl jedes Users, zusätzlich sollten bei der Berechnung die +5% Zuwachs eines Ranges berücksichtigt werden.
/* 2 */ : Je nach Rang soll die max. Anzahl an benötigten XP um 5% zunehmen.
/* 3 */ : Die aktuelle XP-Anzeige pro Rangstufe. Bei jeder "neuen" Rangstufe sollte hier bei der Berechnung darauf geachtet werden, dass beim erreichten Limit der Wert wieder auf 0 ist, da man sich ja im "neuen Rang" befindet.

Ich hoffe mir kann jemand weiterhelfen, wäre unendlich dankbar!

Liebe Grüße,

Lisa
 
Hallo!

An die Mods: Bitte lasst das Thema so wie es ist ohne andere Beiträge von mir zu Threads zu verschieben, die kontextuell gar nicht zuzuordnen sind.
Und Du unterlasse es bitte Beiträge grundlos zu "löschen".
So ist es für die "Nachwelt" nicht mehr nachvollziehbar zu was für ein Problem eine eventuelle Lösung geführt hat.
Das ist nicht der Sinn eines Forums.

Davon abgesehen, brauche ich Dir sicherlich nicht erzählen dass Du auch Dir selbst damit schadest?!
Denke mal darüber nach. ;)

Gruss Dr Dau
 
Wie wäre es mit einer rekursiven Funktion?
also so in der Art:

PHP:
$xp = 3000; // Anzahl der XP
$start_xp = 100;
$start_rang = 0;


function berechne_rang($rang,$xp_naechster_rang,$xp)
{
 	$multipler = 1.05;
 	$max_rang = 99;
 	
 	
 	if ($xp >= $xp_naechster_rang AND $rang < $max_rang)
 	{
 		$rang++;
 		return berechne_rang($rang,round($xp_naechster_rang*$multipler),round($xp-$xp_naechster_rang));
 	} else
 	{
 		return $rang;
 		//Hier musst du dann die XP auf 0 setzen und den Rank updaten oder wie du das machen willst.
	}
}

Getestet, gibt beispielsweise aus:

Code:
xp für das nächste Level, Rang, XP

105 - 0 - 2900
110 - 1 - 2795
116 - 2 - 2685
122 - 3 - 2569
128 - 4 - 2447
134 - 5 - 2319
141 - 6 - 2185
148 - 7 - 2044
155 - 8 - 1896
163 - 9 - 1741
171 - 10 - 1578
180 - 11 - 1407
189 - 12 - 1227
198 - 13 - 1038
208 - 14 - 840
218 - 15 - 632
229 - 16 - 414
240 - 17 - 185

18
Also nur den Rang, das andere war zu Testzwecken drin
Du könntest auch ein Array zurückgeben, das den Rang, die XP und die zu erreichenden Xp für die nächste Stufe ausgibt, also so: ;)
PHP:
$xp = 3000; // Anzahl der XP
$start_xp = 100;
$start_rang = 0;


function berechne_rang($rang,$xp_naechster_rang,$xp)
{
 	$multipler = 1.05;
 	$max_rang = 99;
 	
 	
 	if ($xp >= $xp_naechster_rang AND $rang < $max_rang)
 	{
 		$rang++;
 		return berechne_rang($rang,round($xp_naechster_rang*$multipler),round($xp-$xp_naechster_rang));
 	} else
 	{
 		return array($rang,$xp,$xp_naechster_rang);
 		//Hier musst du dann die XP auf 0 setzen und den Rank updaten oder wie du das machen willst.
	}
}

das gibt dann sowas aus:
Code:
105 - 0 - 2900
110 - 1 - 2795
116 - 2 - 2685
122 - 3 - 2569
128 - 4 - 2447
134 - 5 - 2319
141 - 6 - 2185
148 - 7 - 2044
155 - 8 - 1896
163 - 9 - 1741
171 - 10 - 1578
180 - 11 - 1407
189 - 12 - 1227
198 - 13 - 1038
208 - 14 - 840
218 - 15 - 632
229 - 16 - 414
240 - 17 - 185
array(3) { [0]=> int(18) [1]=> float(185) [2]=> float(240) }

*klugscheiss*
Achja, man schreibt dazu Rang, nicht Rank ;)
*klugscheiss*

€dit das 1239942392. mal:

Ich unterstütze Dr. Daus Antrag, lösche nicht einfach Posts.
Nacher steht hier nur die Lösung, aber nicht die Frage und das Problem.
Du hast schließlich die Forenregeln akzeptiert als du dich registriert hast, also ein bisschen mehr Einsicht bitte.
 
Zuletzt bearbeitet:
Tut mir Leid, aber das hat mich einfach verärgert, weil es zwei unterschiedliche Themen waren, weshalb ich auch zwei Threads eröffnete und nach der Verschiebung jeder denkt, dass ich tatsächlich 3 Doppelbeiträge hintereinander gemacht hätte und gar keiner mehr weiß, worum es eigentlich ging. Natürlich möchte ich auch, dass meine Threads anderen Leuten von Nutzen sind.

Und vielen Dank für deine Mühe! Ich verstehe nur leider nicht ganz den Zusammenhang deiner ersten 3 Variablen mit der Funktion.

Wie gibst du das ganze denn testweise aus? Hast du eine Schleife gebaut oder ähnliches?

Danke und liebste Grüße,

Lisa
 
Du musst die Funktion dann natürlich auch aufrufen, hier mal der komplette Testcode:
PHP:
<?php
function berechne_rang($rang,$xp_naechster_rang,$xp)
{
 	$multipler = 1.05;
 	$max_rang = 99;
 	
 	
 	if ($xp >= $xp_naechster_rang AND $rang < $max_rang)
 	{
 		echo round($xp_naechster_rang*$multipler).' - '.$rang.' - '.round($xp-$xp_naechster_rang).'<br/>';
 		$rang++;
 		return berechne_rang($rang,round($xp_naechster_rang*$multipler),round($xp-$xp_naechster_rang));
 	} else
 	{
 		
 		return array($rang,$xp,$xp_naechster_rang);
 		//Hier musst du dann die XP auf 0 setzen und den Rank updaten oder wie du das machen willst.
	}
}


$xp = 3000; // Anzahl der XP
$start_xp = 100;
$start_rang = 0;

$rang = berechne_rang($start_rang,$start_xp,$xp);

echo "Du bist Rang ".$rang[0].' mit '.round($rang[1]/$rang[2]*100).'% zum n&auml;chsten Rang.'; 
?>
 
Zuletzt bearbeitet:
Zurück