es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La actualización de SQL una vez al día (en el primer inicio de sesión del usuario) falla.

Tengo un sistema de inicio de sesión y quiero aumentar el valor de una base de datos de un usuario conectado en 1, pero solo si es el primer inicio de sesión del usuario del día.

Se puede imaginar como obtener un punto por el inicio de sesión diario.

La forma en que intento hacer esto es usando WHERE, AND y datediff:

Primero:

$add1point4login = "UPDATE accounts
SET points = points + 1, lastpoint = CURRENT_TIMESTAMP
WHERE username='".$_SESSION['name']."'";

Usando lo anterior funciona perfectamente bien: los puntos aumentan en 1 y el lastlogin se actualiza con el CURRENT_TIMESTAMP, pero el usuario podría obtener puntos infinitos solo cerrando sesión e iniciando de nuevo.

Entonces quiero verificar la diferencia entre la marca de tiempo lastpoint en mi base de datos y el CURRENT_TIMESTAMP y solo dar un punto si la diferencia entre los días es> 0.

Así que agregué AND y comencé a usar datediff:

$add1point4login = "UPDATE accounts
SET points = points + 1, lastpoint = CURRENT_TIMESTAMP
WHERE username='".$_SESSION['name']."' AND (datediff(accounts.lastpoint,CURRENT_TIMESTAMP>0)";

Ahora ya no funciona. Ni los puntos obtienen un aumento de uno, ni se actualiza el lastpoint-timestamp…

que sería el resultado deseado si el CURRENT_TIMESTAMP fuera el mismo día que el timestamp almacenado en lastpoint, pero no si CURRENT_TIMESTAMP es 2021-11-19 21:21:36 y el almacenado es 2021-11-17 21:21:36.

Realmente no sé qué sigue, tal vez esté completamente ciego en este punto. ~.~

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes modificar tu consulta SQL de la siguiente manera:

    $add1point4login = "UPDATE accounts 
    SET points = points + 1, lastpoint = CURRENT_TIMESTAMP 
    WHERE username='".$_SESSION['name']."' AND 
    DATEDIFF(CURRENT_TIMESTAMP, lastpoint) > 0";
    

    El código anterior verifica la diferencia entre el sello de tiempo actual y el sello de tiempo de último punto en la base de datos, utilizando la función DATEDIFF. Si el resultado es mayor que 0, significa que el usuario no ha iniciado sesión hoy, y los puntos y el sello de tiempo de último punto se actualizan en consecuencia.

    Ten en cuenta que la función DATEDIFF toma dos argumentos y devuelve el número de días entre ellos. En este caso, queremos obtener la diferencia entre el sello de tiempo actual y el sello de tiempo de último punto en la base de datos, por lo que colocamos CURRENT_TIMESTAMP como primer argumento y lastpoint como segundo argumento.

    ¡Espero que esto te ayude!

Comments are closed.