entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Querys automáticas

Buenas. Estoy necesitando armar lo siguiente. Actualmente tengo un sitio web en el que, cada vez que un usuario se loguea comprueba específicamente con un WHERE si el nombre de la sesión (ese usuario) tiene Ejemplo seteado en 1 (== 1). Si lo tiene, se procede a hacer otro query con otra acción que es irrelevante. Lo que busco hacer es no hacer esto cada vez que un jugador se conecta si no de manera automática chequeando toda la tabla de usuarios. ¿Me recomiendan hacerlo de esta manera o cómo? ¿Hacerlo de esta manera consumiría más recursos al estar ejecutando querys automáticas de comprobación de datos en toda la tabla entera o no? Estoy abierto a sus opiniones o experiencias también.
También quisiera usar este método para por ejemplo habilitar a los usuarios el cambio de correo electrónico asociado a sus cuentas (registraré una fecha en la base de datos, y cuando llegue la fecha se efectuaría el cambio automáticamente).
Saludos y gracias.

2votos

Leonardo-Tadei comentado

Yo, sin más detalles sobre lo que hace esa query no podría opinar nada... tampoco entiendo bien eso de "cada vez que un jugador se conecta o automáticamente chequeando toda la tabla".

Qué tarea puede hacerse tanto sobre el registro de un jugador que sobre todos los registros de todos los jugadores y que el resultado sea el mismo?

0voto

Leyes comentado

Una tarea de ejemplo es la que puse acerca del cambio de correos electrónicos. Para otra cosa que usaría esto es porque tengo una web y un foro con los usuarios conectados, si cada vez que hago la comprobación en la tabla usuarios de la web (que es la principal) por ejemplo la variable Baneado da 1 debo a través de otra query mandar a la tabla de usuarios del foro ese dato para setear una placa y/o imagen de que el usuario se encuentra baneado. Lo mismo si un usuario estuvo baneado alguna vez y le quedó la variable, luego lo desbaneé a través de un medio externo y le queda la placa en el foro, ahora mismo tendrá que loguearse para que se actualice eso en el foro, sin embargo si logro hacerlo de otra manera, que se revisen las variables de manera automática, sería sin necesidad de que éste se loguee. No sé si me explico.
Gracias.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola @KevinLeyes,

es un diseño un poco raro que el dato de si un jugador está baneado deba "copiarse" al foro, porque esto implica que el foro está accediendo a los datos del jugador de forma distinta de cómo lo hace el juego... en fin, vamos a tu cuestión:

La solución ideal en este escenario es crear un trigger que, cuando se modifica un usuario, haga el cambio en la tabla de foro también.

Cómo el trigger está "mirando" un campo, no importa por qué mecanismo se cambie, se hará el otro cambio al mismo tiempo.

Por la lógica que planteás, deberías crear un Peocedimiento Almacenado que haga los cambios según los valorse asignados, y que el trigger dispare ese procedimiento.

Alternativamente, en caso de que estés usando un formato de MySQL que no soporte Procedimientos ni Triggers, podrías hacer lo mismo en el código: en este caso, en la parte del código que modifica al usuario, hacer el impacto en la otra tabla, si es necesario.

De esta manera no hace falta que el usaurio se loguee al juego, porque el evento lo dispara el modificar al usuario, no el login que es como lo tenés ahora.

Saludos cordiales!

0voto

Leyes comentado

Hola Leonardo.

En cuanto a que el foro en cierta parte está "desvinculado" con la web es cierto, ya que no posee las mismas tablas debido a que es un script brindado por SMF, de foros, ajeno al sitio web desarrollado por cuenta propia, por lo que al registrarse en la web se crea la cuenta automáticamente allá, con los mismos datos y demás. Pero en fin, eso lo tengo bien organizado y funcional, sin embargo dándome cuenta te di un ejemplo incorrecto (el de los baneos), ya que eso es asignado siempre a través del código como vos me decías en una parte, al banear y al desbanear, yo necesitaría esto mismo pero para cuando no puede asignarse manualmente, es decir cuando es automático y hay fechas de por medio, digamos, así que con respecto a la pregunta en sí, paso a darle ejemplos más adecuados y concretos para los que buscaría hacer esto:

Cambio de correo electrónico
Los usuarios a través de la web podrán hacer un cambio de e-mail de la cuenta, pero por seguridad se almacenaría y al llegar a la fecha (30 días después del día en que inicien el proceso) recién se efectuaría el cambio. Como lo tengo ahora recién se cambiaría cuando el usuario loguee en la web (como menciono en el segundo ejemplo).

Placas membresías VIP (son como tipos de cuentas con beneficios) mostradas en el foro (como un reconocimiento ahí)
Al comprar en la web una membresía se le asigna la fecha a usuarios (1) y la placa a smf_members (2). Para terminarlo, ya que tiene una duración de 30 días), comprueba en UNIX si la fecha actual es mayor que la fecha vieja y ahí le saca la membresía (requiere login en el juego o en la web para dicha comprobación). Acá lo que mencionaba es que si el usuario no se loguea en ningún lado no se le quitará la placa en el foro, por lo que como bien decía anteriormente, busco hacerlo de manera automática y no chequear todo esto cuando el jugador se loguea.

Ahora quizás habiendo aclarado o especificado un poco mejor para qué lo usaría, ¿cambiaría lo que me recomendabas utilizar en un principio o cómo sería mejor que haga?
Yo pensaba en hacer algo como una comprobación de las fechas como actualmente hago con las membresías VIP cada vez que alguien ingrese al index para solucionar eso de estar o no logueado, y en ese caso se revisaría la tabla completa en busca de qué y cuántos usuarios poseen fechas de cambio de correo electrónico y expiración VIP mayores a las del día y hora actual, todo a través de UNIX, pero considero en parte muy poco profesional hacerlo de esta manera, creería (no estoy seguro, ya que eso preguntaba), que siendo una web muy visitada haría muchas querys y además de consumir recursos del hosting, cargaría lento y se navegaría mal, debe haber como vos me mencionabas otro método o camino, esto de los triggers y/o la dependencia de una tabla por el valor de otra, no estoy seguro ni aún leí nada sobre ésto. Sin embargo, en caso de que me sirva, aplicaría únicamente para el caso del muestreo de las placas de las membresías VIP (no la expiración), ya que el cambio de correo electrónico es diferente, no tiene que ver con placas en el foro.

Muchas gracias por responder, un saludo.

2votos

Leonardo-Tadei comentado

Hola @KevinLeyes,

en este escenario que describís, lo mejor sería crear una tarea CRON que ejecute un script una vez al día que haga todas las actualizaciones.

Si el script tarda mucho en ejecutarse (porque hace trabajo acumulado) lo podés invocar vía CGI. Si no tardara demasiado, en la tarea CRON lo podés invocar como si se tratara de una pagina del sitio vía wget:

wget http://sitio.web/actualizar.php

De esta forma podés planificar la tarea para que se ejecute en horario de poca carga y no depender de que el usuario se loguea para habilitar los cambios.

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta