2010-09-03 13 views
5

Mit PHP/mySQL wird einem Benutzer jeden Tag ein einzelner ganzzahliger Punkt für sein Mitgliedskonto gewährt. Die Daten, die ich verwenden werde, um festzustellen, ob ein Punkt erteilt werden sollte, sind diese mysql-Felder: Erstellungsdatum (Zeitstempel) und Letzte Anmeldung (UNIX TIME).Einem Benutzer jeden Tag einen Punkt zuweisen

Das Verfahren zum Gewähren dieser Punkte wird bestimmt, wenn sich der Benutzer anmeldet. Meine Frage ist, was ist die effizienteste Art zu bestimmen, wie viele Tage seit der letzten Anmeldung vergangen sind? Zweitens, wenn sich ein Benutzer jeden Tag anmeldet, wie stelle ich fest, ob 24 Stunden vergangen sind und ein Punkt gewährt werden soll? Vorübergehende Tage entsprechen den angegebenen Punkten (1 pro Tag).

Derzeit bin ich mit diesem Code:

/* 
** Updates Points based on days since last visit 
*/ 
static function UpdatePoints($username) 
{ 
    $getlog = System::$mySQL->Select("lastLog, creation FROM users WHERE username='$username'"); 
    $log = System::$mySQL->Fetch($getlog); 

    $offset = (TIME() - $log['lastLog'])/86400; // 24hrs 
    $lastlog = round($offset); // in days 

    if($lastlog > 0) 
    { 
     System::$mySQL->Update("users SET points=points+".$lastlog." WHERE username='$username'"); 
    } 
} 

Markup beiseite, es offensichtlich ist mein Code kurzsichtig ist. Wenn sich der Benutzer einmal täglich anmeldet, erhält er keinen Punkt. Daher muss ich die richtige Methode dafür ermitteln, indem Sie das Feld Erstellungsdatum ebenfalls verwenden. Ich kann es heute einfach nicht umdrehen, irgendwelche Vorschläge? Vielen Dank.

+0

Könnte einfacher sein, wenn Sie die Punkte zu einem festen Zeitpunkt, zum Beispiel um Mitternacht, vergeben haben. Jeder ist so unfair gegenüber denen, die sich um 12:01 Uhr gegen jemanden anmelden, der sich um 23:59 Uhr registriert, aber nach ein paar Monaten Mitgliedschaft ist dieser Unterschied ein Rundungsfehler. –

+3

NIEMALS date Mathematik wie Sie hier getan haben (aka, durch Division durch 86400). In jedem Jahr gibt es einen 23-Stunden-Tag und einen 25-Stunden-Tag. Verwenden Sie immer ein intelligentes Datetime-Objekt. Andernfalls müssen Sie versteckte Fehler in Ihrem Programm programmieren. – riwalk

+0

@ Stargazer712 Danke für den Tipp, das habe ich nie gedacht. – mrtwidget

Antwort

3

Dies ist besser für die Datenbank als für PHP geeignet. Fügen Sie eine Tabelle users_points mit dem eindeutigen Index (user_id,login_date) hinzu. Beispieldaten:

user_id | login_date 
====================== 
19746 | 2010-09-02 
19746 | 2010-09-03 

Dann auf jedem Login, markieren Sie, dass der Benutzer zu diesem Zeitpunkt hat sich angemeldet (wenn die Zeile bereits vorhanden ist, wird verhindert, dass der Index Duplizierung):

INSERT IGNORE INTO `users_points` (`user_id`,`login_date`) VALUES (19746,CURDATE()) 

Und die bekommen Anzahl der Punkte:

SELECT COUNT(*) FROM `users_points` WHERE `user_id` = 19746 

Dies ist auch gut, dass Sie eine Liste der Tage, an denen der Benutzer angemeldet hat, falls Sie die Kriterien ändern und eine Nachzählung tun wollen.

user_id ist ein INT, login_date ist ein DATE, gibt es ein brauchbares Index, so dass beide Einsatz und wählen Sie sollte schnell sein, und der Tisch relativ klein sein, auch mit einer großen Anzahl von Benutzern.

Bei beharren Sie den Benutzer Punktzahl in einem Ort gespeichert sind (oder vielleicht wollen Sie es zusammen mit anderen Benutzerdaten abgerufen werden), können Sie dies bei der Anmeldung tun:

  • laufen die insert ignore
  • Führen Sie die select count
  • Speichern Sie das Ergebnis in einer Spalte der Tabelle users.
+0

Danke Piskvor! Ich denke, deine Antwort hat meine Meinung geändert, all diese Berechnungen zu machen und nur mit einem Tisch zu bleiben. Ich war so in der Lage, das zu nutzen, was ich bereits habe. Ich habe diese Richtung nie in Betracht gezogen. So einfach und offensichtlich (jetzt), aber so effektiv. Vielen Dank! – mrtwidget

+0

@ mrtwidget: Gern geschehen. – Piskvor

+0

Anzahl der Punkte ist ein Wert, auf den ständig zugegriffen wird. Berechnung jedes Mal, wenn es benötigt wird, ist Verschwendung von Ressourcen. Die Berechnung muss einmal pro Periode durchgeführt werden und der Wert sollte aus dem DB gelesen werden. –

3

Verwenden Sie ein separates Feld, um das Datum beizubehalten, als Sie den Punkt dem Benutzerkonto hinzugefügt haben. Wenn das heute nicht passiert ist - füge einen Punkt (oder mehrere) hinzu und aktualisiere ein Feld.

Verwandte Themen