2010-09-03 16 views
5

Utilizzando PHP/MySQL, un utente riceve un singolo punto intero sul proprio account membro ogni giorno. I dati che utilizzerò per determinare se un punto deve essere concesso sono questi campi mysql: Data creazione (data/ora) e Ultimo accesso (UNIX TIME).Concedere all'utente un solo punto ogni giorno

La procedura per la concessione di questi punti viene determinata all'accesso dell'utente. La mia domanda è: qual è il modo più efficace per determinare quanti giorni sono trascorsi dall'ultimo accesso? In secondo luogo, se un utente si collega ogni giorno, come faccio a stabilire se sono trascorse 24 ore e un punto deve essere concesso? I giorni passati equivalgono ai punti indicati (1 al giorno).

Attualmente sto usando questo codice:

/* 
** 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 a parte, è ovvio il mio codice è miope. Se l'utente effettua l'accesso una volta al giorno, non ottiene alcun punto. Pertanto, devo determinare il metodo corretto per farlo utilizzando anche il campo Data creazione. Non riesco proprio a capirlo oggi, qualche suggerimento? Grazie.

+0

Potrebbe essere più facile se hai appena concesso i punti in un punto fisso nel tempo, diciamo a mezzanotte. Ogni così lievemente ingiusto verso coloro che si registrano alle 12:01 contro qualcuno che si registra alle 23:59, ma dopo alcuni mesi di affiliazione, questo tipo di differenza è un errore di arrotondamento. –

+3

MAI fare matematica di data come hai fatto qui (aka, dividendo per 86400). In ogni anno, c'è un giorno di 23 ore e un giorno di 25 ore. Usa sempre un oggetto datetime intelligente. Fare altrimenti è programmare bug nascosti nel tuo programma. – riwalk

+0

@ Stargazer712 Grazie per il suggerimento, non l'ho mai considerato. – mrtwidget

risposta

3

Questo è più adatto per il database che per PHP. Aggiungi una tabella users_points, con indice univoco (user_id,login_date). Dati di esempio:

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

Poi su ogni login, contrassegnare che l'utente si è connesso a quella data (se la riga esiste già, l'indice impedisce la duplicazione):

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

E per ottenere il numero di punti:

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

Questo è anche un bene che si dispone di un elenco di giorni in cui l'utente ha effettuato l'accesso, nel caso in cui si modificano i criteri e si desidera fare un riconteggio.

user_id è un INT, login_date è un DATE, c'è un indice utilizzabile, in modo che entrambi Inserisci e selezionare dovrebbe essere veloce, e la tabella sarà relativamente piccolo, anche con un numero enorme di utenti.

Nel caso in cui si insiste per avere il punteggio utente memorizzato in un luogo (o forse si desidera recuperare insieme ad altri dati utente), si potrebbe fare questo su login:

  • eseguire il insert ignore
  • esegue il select count
  • salva il risultato in una colonna della tabella users.
+0

Grazie Piskvor! Penso che la tua risposta abbia cambiato idea su come fare tutti questi calcoli, e semplicemente limitarmi a un tavolo. Sono stato così preso dall'usare quello che ho già non ho mai considerato questa direzione. Così semplice e ovvio (ora), ma così efficace. Grazie! – mrtwidget

+0

@mrtwidget: prego. – Piskvor

+0

Il numero di punti è un valore a cui si accede continuamente. Calcolarlo ogni volta che è necessario è uno spreco di risorse. Il calcolo deve essere eseguito una volta per un periodo e il valore deve essere letto dal DB. –

3

Utilizzare un campo separato per mantenere la data quando si aggiunge il punto all'account dell'utente. Se questo non è successo oggi - aggiungi un punto (o più) e aggiorna un campo.

Problemi correlati