Foros del Web » Programando para Internet » PHP »

Foro, mensajes no leidos y emoticonos

Estas en el tema de Foro, mensajes no leidos y emoticonos en el foro de PHP en Foros del Web. Hola! Soy un aficionado a la informática que decidí hace unos 9 meses hacer una página web para un grupo de amigos que nos encontramos ...
  #1 (permalink)  
Antiguo 18/07/2003, 14:03
Avatar de Woody  
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años
Puntos: 0
Pregunta Foro, mensajes no leidos y emoticonos

Hola!

Soy un aficionado a la informática que decidí hace unos 9 meses hacer una página web para un grupo de amigos que nos encontramos separados ( ), obviamente no sabia donde me metia pues no tenia ni idea ni de HTML, ni PHP, ni MySQL..., pero bueno con un poco de sacrificio, leyendo mucho y preguntando de vez en cuando, he conseguido montar un bloque de noticias, una seccion de fotos, un registro y una conexion y ahora estoy metido de lleno en el Foro.

Después de hacer unos vocetos en papel y una especies de pseudocódigos ya lo tengo, pero me he encontrado con un problema: una vez conectado quiero que mediante un código de colores, se indique en la tabla inicial del foro, cuales son los temas donde hay mensajes nuevos (sin leer), lo he programado haciendo que este codigo de colores se base en la fecha del ultimo mensaje del tema y la fecha de la conexión anterior que hizo el usuario, pero el problema es que soy un poco perfeccionista y me gustaría que este codigo de colores funcionase según si yo cargo el tema con los mensajes o no, no sé si se me entiende, lo que quiero es que si el usuario se conecta pero no mira el foro o no se pasa por todos los mensajes que no ha leido el código de colores no cambie.

He pensado guardar en uno de los campos de la tabla de miembros los identificadores de los mensajes que se cargan, pero no se exactamente como guardarlos y luego recuperarlos uno a uno y chequear cuales estan y cuales no y no sé si esta es la mejor opcion.

Un amigo informático me ha comentado algo de "carpetas inteligentes" pero tampoco lo sabia exactamente y no me ha dicho nada más.

Espero que se me haya entendido bien y agradezco la ayuda por adelantado que siempre he conseguido en este foro y perdonar por la extension del mensaje... me enrollo demasiado.

Un Abrazo,

Woody.


P.D.Otro problema que tengo con el foro es que no se como hacer lo de los emoticonos, pero la verdad es que tampoco me he metido a fondo con ellos y ahora me urge más el problema anterior, pero bueno si alguien me quiere dar una ayuda en este aspecto (guardar iconos en tablas MySQL o en archivos, como sustituirlos en el texto...).
  #2 (permalink)  
Antiguo 20/07/2003, 00:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. despues de todo .. la conclusión que saco es que todavia dentro de tu "perfeccionismo" no tienes claro que es lo que tiene que hacer tu aplicación (foro) para esa tarea (mensajes no leidos ..) o si lo tienes claro .. no me quedó claro a mi en lo personal como lo explicastes ..

Si nos indicas que datos guardas yá de tus mensajes y la estructura de los mismos (como se relacionan ... etc) tal vez entendamos que pretendes hacer y aconsejarte sobre algo ...

Cita:
Un amigo informático me ha comentado algo de "carpetas inteligentes" pero tampoco lo sabia exactamente y no me ha dicho nada más.
Eso si que no sé que quiere decirte tu "amigo" .. pues tu estás usando Base de datos y consultas SQL a la misma ...

No sé si estaras al tanto de temas como "normalización" en Base de datos .. pero si pretendes guardarte relacionado con el usuario los mensajes que ha listado .. deberías repasar esos temas (en www.mysql-hispano.com tienes un articulo sobre el tema bastante interesante ..)

------

Las P.D. con otra pregunta .. mejor, centrate en una o inicia un nuevo tema con esa pregunta. Así se tratan mejor los mensajes.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 20/07/2003, 12:11
Avatar de 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
  #4 (permalink)  
Antiguo 20/07/2003, 19:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues ahora está mejor detallado tu problema .. (ya cumplí mi misión xD) ..

Un saludo y suerte.
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 21/07/2003, 05:17
Avatar de Woody  
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años
Puntos: 0
Ehh que quieres decir...

No te entiendo Cluster...

Con tu contestación quieres decir que la forma que planteo es la mejor o que la pregunta esta bien planteada (aunque un poco larga) y que no sabes contestar...

Y si es la mejor tengo la duda de:
Cita:
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
Un saludo,

Woody
  #6 (permalink)  
Antiguo 21/07/2003, 05:35
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

¿Y si tiene mensajes sin leer porque no ha querido entrar a leerlo? ¿Le pondrias un link como en estos foros "Marcar tal foro como leido"?

La pregunta mas importante: ¿merece esta opcion tanto quebradero de cabeza? Es decir, ¿tus usuarios te lo van a agredecer? ¿O por el contrario, se van a liar viendo foros con la lucecita de "Mensajes sin leer" cuando no tienen mensajes nuevos? Por supuesto, siempre lo puedes implementar como retor personal, pero replanteate el lugar que ocupa dentro de las prioridades de tu aplicacion. Podrias dejarlo para la version 2, o en la lista de "si da tiempo".

Sobre la solucion, creo que lo mejor seria almacenar por usuario la lista de mensajes sin leer hasta la ultima conexion, y poner como no leidos esos y los nuevos desde su ultima conexion. Segun vaya leyendo, se elimina de la lista. Creo que es mejor almacenar esta lista, porque se supone que va a ir menguando, mientras que si usases una lista de los que va leyendo, esta lista creceria.

Yo no almacenaria una lista, mas bien una tabla que almacene en cada registro un par (usuario, mensaje) o incluso (usuario, mensaje, hilo), ya que imagino que tendras un listado por hilos.

Luego seria cuestion de inventarse unas buenas consultas para no relantizar demasiado el proceso.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 21/07/2003, 06:07
Avatar de Woody  
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años
Puntos: 0
Ja, ja, ja...

Me ha hecho gracia la primera parte de tu mensaje... Bueno, voy a justificarlo como reto personal, la verdad es que la página es una página de amigos y yo todo esto lo hago como hobby (soy estudiante de ingenieria aeronáutica no informática y de diseño web no necesito conocer nada como es lógico) simplemente me gusta y quiero hacerlo. Simple y llanamente.

Y me has convencido con lo de tu tabla, yo sabia que lo de la lista no era del todo elegante que debería haber otra forma..., pero no habia caido...(gracias). La tabla seria id_mensaje, id_usuario y id_tema (con lo de hilo supongo que te refieres al tema.)

Lo que no creo que sea una buena idea es que cuando se cree un nuevo mensaje se escriba en esta tabla todos los registros con todos los usuarios y luego se vayan eliminando... por que por ejemplo si se crea un nuevo usuario cuando el foro ya esta funcionando... pues todos los mensajes los verá como leidos cuando el problema es todo lo contrario no habrá leido ninguno... unicamente tendre que acordarme que cuando se borre un tema (porque queda obsoleto o lo que sea) también borrar los registros con el id_tema que se elimina y así que dicha tabla no llegue a tener una longitud mas allá de lo necesaria.

Bueno, muchas gracias... creo que ya lo sé hacer...

Un saludo,

Woody

P.D. Creo que en un principio Cluster tenía un poco de razón era una especie de problema de normalización pero un poco camuflado.

Última edición por Woody; 21/07/2003 a las 06:14
  #8 (permalink)  
Antiguo 21/07/2003, 13:26
Avatar de Woody  
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años
Puntos: 0
Ya me funciona

Pues eso que ya lo tengo exactamente como yo quería... bueno gracias a los dos por la ayuda... y una última pregunta...
rompernos los cuernos ayuda a conservar neuronas pero también perdemos cabellos... ¿vale la pena?

Bueno gracias por todo de nuevo.

Un abrazo.

Woody
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:55.