User-Punktesystem nach Aktivität

Nagut, ist ja nun nicht so tragisch... hat mich nur verärgert, weil es für mich zwei verschiedene Sachen sind. Vielleicht einem Thema zugeordnet, aber von der Kategorie her habe ich das anders zugeordnet, deshalb zwei Themen.


Was mich momentan interessiert ist, ob ich an die Möglichkeit vorbei komme einen CronJob zu benutzen, wenn ich Punkte an User vergeben möchte?

Also, wenn ich eine Tabelle habe, wo ich alle Online-Zeiten eines Users ausrechne.

Weil ich nicht möchte, dass jemand per Klicks, sondern nur über die Online-Zeit Punkte verdient. Gäbe es da denkbare Alternativen zum CronJob?

Liebste Grüße,

Lisa
 
Eine Möglichkeit ist es, die Loginzeit zu speichern und die der letzten Aktivität des Users. Wenn der User dann wieder ein Klick macht, guckst du wie groß die Spanne zwischen der letzten aktivität und jetzt ist.
Wenn das bspw. mehr als 5 Minuten sind, zählst du die Zeit zwischen der letzten Aktion und jetzt nicht zur Onlinezeit, ansonsten doch.

€dit: Was meinst du mit: Er stoppt bei dem Skript nicht bei 100%

Wenn du Rang 99 bist und die erforderlichen XP für Rang 100 hast, ist ja auch klar, dass er sowas anzeigt:
Du bist Rang 99 mit 123% zum nächsten Rang.

Du musst prüfen, ob der User Rang 99 hat, wenn ja, dann nur die erreichten XP anzeigen.
 
Zuletzt bearbeitet:
Ja, also die Startzeit (Login) und Endzeit (Logout) einer Session habe ich in meiner Tabelle drin. Die Online-Zeit kann ich auch bereits ausrechnen. Ich update da einfach die Tabelle wenn die letzte Aktion des Users >= 15min ist, wenn nicht gibt es einen neuen Eintrag in der Tabelle, sozusagen neue "Session", die dann entsprechend seperat ausgewertet und kalkuliert wird.

Es geht eigentlich nur um das Punktezahl-Update. Deshalb die Frage mit dem CronJob und ob es Alternativen gäbe, die denkbar wären.
Denn: Ich habe die gesamteausgerechnete Online-Zeit in Minuten, die ich durch 10 teile als faire Punktevergabe (XP). Und ich prüfe ja per Seitenaufruf, wie groß die Anzahl an Online-Zeit ist und zeitgleich werden dann auch die Punkte geupdatet... aber das ist ja eigentlich schwachsinnig, da ja dann jeder Benutzer mehr nur durch Klicks als durch Online-Zeit davon profitiert.

Ich hoffe das ist verständlich erklärt von mir?

Deshalb dachte ich an einen CronJob, der stündlich die Online-Zeit berechnet, Punkte vergibt und dann alle Einträge des Users löscht. Aber gibt es da auch Alternativen zum CronJob?
 
Wenn du keinen Cronjob benutzen willst, dann mach das doch so, das der erste Aufruf nach einer vollen Stunde das alles berechnet, und dann erst wieder der der nächsten Stunde.
Soll heißen du guckst:
Letzte Berechnung war 14:01, jetzt ist 14:45 als noch nicht berechnen.
Letzte Berechnung war 14:01, jetzt ist 15:00 also alles berechnen und Zeit auf 15:00 setzen.
Letzte Berechnung war 15:00, jetzt ist 15:00 also nich berechnen.
...

Das erweiterst du noch mit Tag und Monat und dann sollte das gehen, die Zeit könntest du in einer .txt speichern, ist so ähnlich, hat nur den Nachteil, das der erste einer neuen Stunde etwas länger warten muss, aber das ist vertretbar.
 
Zuletzt bearbeitet:
Also wollen will ich den CronJob ja eigentlich nicht, weshalb ich nach einer möglichen Alternativen suche. Mit einem CronJob wäre die Sache ja sozusagen gegessen. Das habe ich vielleicht vergessen zu erwähnen.
 
Ich weiß nicht, ob ich dich richtig verstehe, dann berechne die Onlinezeit dann, wenn der User sich ausloggt oder als augeloggt gilt. Dann musst du keinen Cronjob machen, brauchst für jeden User nur eine Spalte und keine weitere Tabelle. Sobald der User sich ausloggt, rechnest du die Zeit aus und schreibst sie gut. Dann kann der User wieder von vorne anfangen.
 
Ahhh... genau. Die Idee ist super!

Also, ich mach das dann so:

Ich gucke, ob der User offline ist ->

Wenn ja, wird die berechnete Online-Zeit in XP umgerechnet und gutgeschrieben, zeitgleich der Datensatz der Online-Zeit, Login-Zeit, Logout-Zeit des Users auf 0 gesetzt.

Wenn nicht, wird die Online-Zeit (weiterhin) berechnet bzw. addiert zur bereits vorhandenen.

So brauche ich auch nur einen Eintrag pro User in der Tabelle und keinen CronJob, super! DANKE!
 
Ich habe es nun so gelöst:

PHP:
# --- Online-Zeit in Minuten ermitteln:
$online = mysql_fetch_array(mysql_query("SELECT TIMESTAMPDIFF(MINUTE,login,logout) AS min 
FROM `users_time` WHERE user_id='".$_SESSION['user_id']."'"));
# --- Aktivität > 15min:
$count = mysql_fetch_array(mysql_query("SELECT COUNT(user_id) FROM `users_time` 
WHERE TIMESTAMPDIFF(MINUTE,logout,NOW()) > '15' AND user_id='".$_SESSION['user_id']."'"));
if (!empty($count[0]))
	{ # Aktivität > 15min:
		if ($online[min] > 0)
		{ # Online-Zeit > 0min:
		$calc = ($online[min]/10); # Berechnung von Online-Zeit in XP
		mysql_query("UPDATE `users` SET xp = xp+$calc WHERE id='".$_SESSION['user_id']."'");
		mysql_query("UPDATE `users_time` SET login=NOW(),logout=NOW(),min='0' WHERE user_id='".$_SESSION['user_id']."'");
		$online[min] = 0; # für neue Ausgabe der Online-Zeit
		}
	} 
	else 
	{ # Aktivität <= 15min:
	mysql_query("UPDATE `users_time` SET logout=NOW(),min='".$online[min]."' WHERE user_id='".$_SESSION['user_id']."'");	
	}
}

Kurze Erläuterung:
- Online-Zeit wird ermittelt aus der Differenz Login-Zeit und Logout-Zeit in Minuten.
- Prüfen, ob letzte Logout-Zeit > 15 Minuten

- Wenn ja, gilt man als offline und ...
- Wenn Minuten > 0:
- Punkte werden berechnet und gutgeschrieben
- Login-Zeit und Logout-Zeit wird auf aktuelle Zeit und die Minuten auf 0 gesetzt

- Wenn nicht, gilt man als online und ...
- letzte Logout-Zeit updaten auf aktuelle Zeit

Gibt es vielleicht Verbesserungsvorschläge? Ich habe es nicht ausgiebig getestet, aber es scheint ganz gut zu funktionieren. Würde mich über Kritik freuen, auch wenn es um die Performance geht wie ich das nun realisiert habe oder ähnliches.

Übrigens: Jeder Login prüft, ob man bereits jemals eingeloggt war. Weil dann gibt es einen Eintrag in dieser Online-Zeit-Tabelle, ansonsten wird einer hinzugefügt.

Vielleicht hat das ja jetzt auch anderen Leuten irgendwie Nutzen. :)

Edit:

Ich habe gerade nochmal geguckt und überlegt, ob die Spalte min doch nicht eigentlich sinnlos in der Online-Zeiten-Tabelle ist, da ich eh nur mit der Differenz berechne...!?
 
Zuletzt bearbeitet:
Zurück