Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/07/2003, 12:11
Avatar de Woody
Woody
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años
Puntos: 0
Bueno, vamos a organizarnos...

Después de la respuesta de Cluster tengo que reconocer que tiene razón y que tengo que organizar y documentar un poco mi pregunta y para no enrollarma como en el otro mensaje sin ser lo suficientemente claro voy a escribir un Esquema:
[list=1][*]Unas primeras apreciaciones

Olvidemonos del tema emoticonos... como ha dicho Cluster ya nos pelearemos en otro momento...

Olvidemonos de mi amigo de las "carpetas inteligentes" creo que no tenia mucha idea...

Me he leido el artículo que me ha recomendado Cluster... pero creo que ese no es mi problema pero bueno luego os pondre como son las tablas de MySQL...
[*]Funcionamiento de la página y del foro

La página tiene una conexión, quiero decir que se pueden introducir 2 campos (nick y contraseña) se comprueba si el usuario esta registrado y si todo es correcto se crea una "session", variables de sesion y todo eso... la página se comporta distinta según quien este "al otro lado" (todo esto funciona bien, la sesion se propaga por todos lados los rincones de la página -Gracias en gran medida a la ayuda de Cluster me dio para programarla- y todo genial...)

Una de las partes de la página es el Foro, el usuario conectado a llegar al foro se encuentra con una tabla donde puede ver las áreas de las que conta el foro al lado de éstas estan los temas el usuario puede seleccionar en cual de estos quiere entrar (son links) y al lado de cada tema hay una imagen que intenta representar una luz (un piloto), dicha luz esta apagada (fija) si en este tema del foro no hay mensajes nuevos para ese usuario en concreto y parpadea (intermitente) si si que hay mensajes nuevos.
[*]Problema

El problema es que esta lucecita esta programada de momento de la siguiente manera: En la tabla de (MySQL) "miembros" guardo la fecha de conexión anterior del usuario (verdaderamente el usuario al conectarse carga en una variable de session la fecha de la anterio conexion y justamente después modifico en la tabla "miembros" ese campo (en la fila del usuario claro) para la próxima vez que se conecte en el campo fecha_ultima_conexion este la conexion que esta haciendo ahora), y en otra tabla (MySQL) "mensajes" guardo los mensajes y uno de los campos es fecha_creacion, bueno, así que de aquí tomo el mensaje que pertenezca al tema (del cual queremos poner la lucecita) con la fecha_creacion mayor, claro, tomo el último mensaje escrito del tema.

Comparo estas dos fechas "fecha_ultima_conexión" del usuario (guardada en la variable de sesion) y "fecha_creacion" del último mensaje del tema del foro que nos ocupa y entonces segun cual de las dos es mayor, la imagen que pongo es un gif animado que parpadea o es una imagen fija de la luz apagagada. (las fechas las introduzco con la hora linux... vamos que son un número y es fácil compararlas)

El problema supongo que ya lo sabréis, si el usuario se conecta pero ni siquiera se pasa por el foro, la próxima vez que se pase por este las luces indicaran donde hay mensajes nuevos desde su última conexión pero no donde hay mensajes sin leer. Esto lo podría solucionar haciendo que la fecha_ultima_conexion del usuario se cambiase cuando el usuario entre en la seccion foro (y llamarla fecha_ultima_conexion_foro) y no cuando se conecta a la página en general, pero tampoco me convence porque por ejemplo si el usuario no tiene tiempo para entrar en todos los temas con luz parpadenate la próxima vez que se conecte y entre en el foro algunas luces parpadenates estaran apagadas, cuando en dichos temas no se han leido los mensajes.
[*]Estructura de la página y tablas MySQL

Bueno, haciendo caso a Cluster, comento un poco las tablas que tiene la base de datos:

Tabla "miembros"
Entre los campos de dicha tabla estan:
id_usuario (identificador (número) y clave primaria), nick (clave unica), contrasena, fecha_ultima_conexion...

Tabla "areas_foro"
Entre los campos de dicha tabla estan:
id_area (identificador (número) y clave primaria), nombre, id_creador (número y identificador del usuario que creo el area), fecha_creacion...

Tabla "temas_foro"
Entre los campos de dicha tabla estan:
id_tema (identificador (número) y clave primaria), nombre, id_area (número y identificador del area al cual pertenece el tema), id_creador (número y identificador del usuario que creo el area), fecha_creacion...

Tabla "mensajes_foro"
Entre los campos de dicha tabla estan:
id_mensaje (identificador (número) y clave primaria), titulo, mensaje, id_tema (número y identificador del tema al cual pertenece el mensaje), id_creador (número y identificador del usuario que creo el area), fecha_creacion, fecha_modificacion...

(Bueno Cluster creo que mi problema no es de optimizacion pero la verdad es que es cierto que es interesante el artículo que me has recomendado)

Bueno, entender ahora el funcionamiento creo que es fácil. Cuando se carga el foro, se crea una tabla con las áreas y al lado los nombres de los temas de dicha área, mediante el campo id_area de cada tema de la tabla "temas_foro" dichos nobres (de los temas) son links que van a la página Ver_temas que seleccionan de la tabla "mensajes_foro" los que tienen el id_tema del cual viene el link. (Obviamente al crear una nueva área, tema o mensaje solo se crea una nueva fila en las correspondientes tablas).
[*]Posible solucion
Yo he pensado una solucion pero no se si será la mejor y no sé si el la que se debe tomar en estos casos.

Podría crear un campo en la tabla miembros llamado "id_mensajes_leidos" y en ella ir guardadndo los id_mensajes que el usuario va cargando al pasearse por el foro (programar si verdaderamente los lee o no es imposible ) , así en este campo podría ser por ejemplo "14 16 20 3 2 10 9" y que luego cada vez que cargase la tabla inicial del foro se comprobase si en esta lista de números falta alguno de un mensaje perteneciente a un tema en concreto y escoger así la imagen.

Luego también habría qu ir modificando esta lista, cuando el usuario se pasease por el foro y añadiendo los id_mensajes de los mensajes que se cargen y que no esten en la lista.

El problema que tengo en esta posible solucion es que aunque si sabria sumar números a la lista:
$lista="$lista"." "."$id_mensaje(nuevo)";
(o algo parecido), no sé como comprobar que un determinado número este en la lista y se me plantea que el número de conexiones que se harían será muy grande y por lo tanto no sé si esto relentizará mucho la página y puede que exista una solucion mucho mejor.

Tengo que mencionar que escribiendo esto se me ha ocurrido otra forma gemela, tambien se podría guardar el "id_usuario" en un nuevo campo de la tabla "mensajes_foro" llamado id_usuarios_que_me_han_leido y actuar de forma análoga, el problema es que me encontraría con los mismos problemas, aunque esta nueva "version" tiene ventajas como que si se borra un tema (queda obsoleto) con todos sus mensajes no se guardariía informacion inecesaria en la base de datos cosa que si pasaria si hacemos la forma primera.[/list=1]



Me lo he releido y creo que ahora si que esta mucho mejor planteado aunque ha sido un poco largo y supongo que si has llegado hasta aquí habrá sido ha base un cierto esfuerzo, solo por eso mucha gracias y si encima puedes ayudarme te lo agradezco también.

Un saludo,

Woody

P.D. Estoy en un ordenador público y hay cola así que perdonarme por los acentos y faltas tipográficas producidas por la rápidez de escribir el mensaje.

Última edición por Woody; 20/07/2003 a las 13:42