2010-09-03 18 views
5

Al usar PHP/mySQL, a un usuario se le concede un único punto entero a su cuenta de miembro cada día. Los datos que utilizaré para determinar si se debe otorgar un punto son estos campos mysql: Fecha de creación (indicación de fecha y hora) y Último inicio de sesión (hora UNIX).Otorgar usuario un punto cada día

El procedimiento para otorgar estos puntos se determina cuando el usuario inicia sesión. Mi pregunta es, ¿cuál es la forma más eficiente de determinar cuántos días han pasado desde el último inicio de sesión? En segundo lugar, si un usuario inicia sesión cada día, ¿cómo puedo determinar si han pasado 24 horas y se ha otorgado un punto? Los días pasados ​​son iguales a los puntos dados (1 por día).

Actualmente estoy usando este código:

/* 
** 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'"); 
    } 
} 

marcado un lado, es obvio que mi código es miope. Si el usuario inicia sesión una vez al día, no gana un punto. Por lo tanto, debo determinar el método correcto para hacerlo usando también el campo Fecha de creación. No puedo entenderlo hoy, ¿alguna sugerencia? Gracias.

+0

Podría ser más fácil si acaba de otorgar los puntos en un punto fijo en el tiempo, por ejemplo, a la medianoche. Tan levemente injusto para aquellos que se registran a las 12:01 a.m. contra alguien que se registra a las 11:59 p.m., pero después de algunos meses de membresía, ese tipo de diferencia es un error de redondeo. –

+3

NUNCA feche las matemáticas como lo ha hecho aquí (es decir, dividiendo entre 86400). En un año determinado, hay un día de 23 horas y un día de 25 horas. Utilice siempre un objeto inteligente de fecha y hora. Hacer lo contrario es programar errores ocultos en su programa. – riwalk

+0

@ Stargazer712 Gracias por la sugerencia, nunca lo consideré. – mrtwidget

Respuesta

3

Esto es más adecuado para la base de datos que para PHP. Agregue una tabla users_points, con índice único (user_id,login_date). Los datos de muestra:

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

Luego, en cada inicio de sesión, marca que el usuario ha iniciado sesión en esa fecha (si la fila ya existe, el índice evitará la duplicación):

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

Y para obtener el número de puntos:

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

Esto también es bueno que usted tiene una lista de días en que el usuario ha iniciado la sesión, en caso de que cambie los criterios y quiere hacer un recuento.

user_id es INT, login_date es DATE, hay un índice utilizable, por lo que tanto insertar como seleccionar deben ser rápidos, y la tabla será relativamente pequeña incluso con una gran cantidad de usuarios.

En caso de que insiste en tener el marcador de usuario almacenado en algún lugar (o tal vez desea recuperarlo junto con otros datos de usuario), se puede hacer esto en entrada:

  • corren el insert ignore
  • ejecute select count
  • guarde el resultado en una columna de la tabla users.
+0

Gracias Piskvor! Creo que tu respuesta ha cambiado de opinión acerca de hacer todos esos cálculos, y simplemente quedarte con una mesa. He estado tan atrapado en el uso de lo que ya tengo que nunca consideré esta dirección. Tan simple y obvio (ahora), pero tan efectivo. ¡Gracias! – mrtwidget

+0

@mrtwidget: De nada. – Piskvor

+0

Número de puntos es un valor al que se accede todo el tiempo. Cálculo cada vez que se necesita es un desperdicio de recursos. El cálculo debe realizarse una vez por un período y el valor debe leerse desde el DB. –

3

Utilice un campo separado para mantener la fecha cuando agregó el punto a la cuenta del usuario. Si esto no sucedió hoy, agregue un punto (o varios) y actualice un campo.

Cuestiones relacionadas