Foros del Web » Programando para Internet » PHP »

foro: temas leidos/no leidos

Estas en el tema de foro: temas leidos/no leidos en el foro de PHP en Foros del Web. hola, este tema ya lo tratamos hace unos meses pero no me quedó nada claro. esta vez os voy a poner las tablas mysql de ...
  #1 (permalink)  
Antiguo 19/08/2004, 04:55
 
Fecha de Ingreso: octubre-2003
Ubicación: FMSite
Mensajes: 336
Antigüedad: 16 años, 1 mes
Puntos: 2
foro: temas leidos/no leidos

hola, este tema ya lo tratamos hace unos meses pero no me quedó nada claro. esta vez os voy a poner las tablas mysql de usuarios y mensajes en el foro para que sea algo más fácil.

Código PHP:
CREATE TABLE foro_topic(
id INT(11NOT NULL AUTO_INCREMENT primary key,
id_sub INT(11NOT NULL,
id_tema INT(11NOT NULL,
emoticon TEXT NOT NULL,
visit INT(11NOT NULL,
tip INT(11NOT NULL default"1",//1=respuesta, 3=nuevotema
chin INT(11NOT NULL default"1",//1=normal, 2=chincheta
close INT(11NOT NULL default"1",//1=abierto, 2=cerrado
id_user INT(11NOT NULL,
titulo char(50NOT NULL,
asunto char(50NOT NULL,
mensaje text NOT NULL,
ult INT(11NOT NULL,
ip INT(11NOT NULL,
fecha INT(15NOT NULL
);

/////////////////////////////////////

id INT11 NOT NULL AUTO_INCREMENT primary key,
nick VARCHAR(30NOT NULL ,
pass VARCHAR(15NOT NULL ,
email VARCHAR(100NOT NULL ,
fecha INT(15NOT NULL ,
nombre char(100NOT NULL,
apellido char(100NOT NULL,
ubica char(100NOT NULL,
www char(100NOT NULL,
level INT(11NOT NULL default"1",
rollo LONGTEXT NOT NULL ,
msn VARCHAR(100NOT NULL ,
icq INT(100NOT NULL ,
dia INT(2NOT NULL ,
mes char(100NOT NULL ,
anyo INT(4NOT NULL,
avatar text NOT NULL,
posts INT(15NOT NULL,
ultimavis INT(15NOT NULL 
esas son las tablas, en los usuarios, la columna ultimavis se actualiza cada vez que lees un tema.

hay dos maneras que no quiero usar para hacer esto, una es, crear una tabla y meter ahí cada tema por usuario que no ha leido y la otra es crear una cookie por cada tema leido.

a ver si se os ocurre alguna otra manera de hacerlo, si se pude hacer una cookie donde valla almacenando cada id de tema leido... pero explicarme cómo hacer eso...

venga, mil gracias, un saludo
__________________
http://www.fmsite.net/
  #2 (permalink)  
Antiguo 19/08/2004, 08:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 17 años, 11 meses
Puntos: 129
Cita:
hay dos maneras que no quiero usar para hacer esto, una es, crear una tabla y meter ahí cada tema por usuario que no ha leido y la otra es crear una cookie por cada tema leido.
Se trataría de meter en tu Tabla los mensajes (ID del mensaje) que ha leido ese usuario ..

tabla: mensajes_leidos
id_mensajes_leidos
id_usuario
id_mensaje

En tu script que muestras el mensaje en cuestión .. haces un "INSERT" a tu BD de mensajes leidos sólo si ese ID del mensaje para ese usuario no se encuentra ya en tu BD ..

Algo tipo:

Código PHP:
// verificar que no exista ya ese ID para ese usuario como leido
$sql="SELECT COUNT(*) FROM mensajes_leidos WHERE id_usuario ='$id_usuario' AND id_mensaje='id_mensaje'";
$resultado=mysql_query($sql) or die (mysql_error());
if (
mysql_result($resultado,0) == 0){
// haces tu INSERT a la tabla mensajes_leidos con el $id_usuario y el $id_mensaje .. 
// Estas variabels PHP ya las tendrás localizadas en tu script de "ver mensaje" ya que usaras cookies o sesiones para saber que usuario está "en el sistema" y el ID del mensaje que se está presentando ...

A la hora de hacer tu listado de temas .. para indicar a ese usuario que ya ha leido ese mensaje tendrás que hacer una consulta SQL con tu tabla de mensajes y la de "mensajes_leidos" asociadas por ese ID_mensaje y bajo (condición) que sean de ese ID_usuario .. así obtendrás por ejemplo los mensajes "nuevos" para el usuario (que no ha leido) .. O bien haces una consulta a la tabla "mensajes_leidos" (de tipo COUNT()) para ver si para ese ID_mensaje existe el ID_usuario y así saber uno por uno (mensajes) que ya lo vió.

Lo mismo puedes hacer con los mensajes que el usuario "responde" (con una tabla similar) ...

No al contrario .. fijate que para un usuario .. el nº de mensajes probables que lee (que entra al mensaje a abrirlo) es menor que el que no ha leido. Las cookies no te servirían .. por qué si "borra" o no acepta cookies tu usuario igualmente en algún momento hay que llevar este registro de "ID mensaje -> usuario" en una Tabla de tu BD para volcarlo sobre la cookie.

Un saludo,
  #3 (permalink)  
Antiguo 19/08/2004, 08:09
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 16 años
Puntos: 5
Yo estube estudiando algo similar hace tiempo, la forma que tienen los foros de cambiar la imagen según haya o no mensajes nuevos.
Obviamente, si sabemos a través de las cookies los identificadores de los temas que fueron leidos (metiéndolos en la cookie separados por puntos por ejemplo) y además tenemos la última visita del usuario así como la fecha del último post de cada tópico(por sí mientras el usuario está desconectado hay un post que se le suponía leido resulta que tiene un nuevo mensaje); creo que se podría hacer.

Se trataría de extraer la cookie y luego hacer una query que te devuelva todos los topics que fueron actualizados tras la ultima visita del usuario y añadirlo a la cadena que sacaste de la cookie(una cadena con numeros de identificadores de topic separados por puntos). Luego cuando creas el 'pool' del foro en cuestión ya puedes fijarte en esa cadena para mostrar la imagen de leido o no leido en cada topic, y finalmente, la cadena resultante de concatenar la cookie que recogiste al principio con los temas cuya actualización era posterior a la última visita del usuario volvería a ser la cookie. Bueno y clsro cuando el usuario entra a ver un topic se le marca como leido y se borra de esa cadena el id claro esta .

Creo que eso funcionaría, pero no estoy muy puesto en esos temas .

En fin no se si te habre ayudado de mucho (si se me ocurre algo más lo pongo).

Salu2 ;)

Después de escribir este mensaje, me he dado cuenta (despues de leer el mensaje de cluster) que meter esos datos en las cookies lo mismo no es bueno, porque el usuario las puede desactivar, puedes meter lo mismo que se metía en las cookies en un campo adicional de la tabla correspondiente a los usuarios. No se es otra idea, lo mismo es mejor como dice cluster(casi seguro)

Última edición por yoseman; 19/08/2004 a las 08:32
  #4 (permalink)  
Antiguo 19/08/2004, 08:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 17 años, 11 meses
Puntos: 129
mm Bueno .. imaginen un caso particular .. Yo mismo .. aquí en estos foros llevo ya 17 mil y tantos mensajes que he publicado, equivalen a los mismo o más mensajes que pueda haber leido .. En conclusión, me tendría que manejar yo en mi PC con una cookie con "17.000" ID's de mensajes ... Si fuera así todavía estaría mi obsoleto PC procesando la cookie xDD.

Un saludo,
  #5 (permalink)  
Antiguo 19/08/2004, 09:15
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 16 años
Puntos: 5
Tienes toda la razón no se pueden barajar cadenas tan larga ni en una cookie ni como registro de una bd.

He estado mirando como lo hacen los foros phpbb y es exactamente como dice cluster, con la salvedad de que registra los identificadores de topicos no leidos en vez los id de los posts. Pero el método es el mismo

Salu2 ;)
  #6 (permalink)  
Antiguo 19/08/2004, 09:37
 
Fecha de Ingreso: octubre-2003
Ubicación: FMSite
Mensajes: 336
Antigüedad: 16 años, 1 mes
Puntos: 2
Gracias a los dos, bueno, me ha surgido una duda en cuanto a lo que me dijiste, cluster.

Y si un usuario quisiera marcar todos los mensajes como leidos... cómo lo haría?

imaginate que estamos en un foro como este, de 20 000 mensajes más o menos, y 5 usuarios, quieren marcar todso los temas como leidos. Se tendrían que hacer 100 000 filas en la base de datos?

un saludo y gracias por su ayuda
__________________
http://www.fmsite.net/
  #7 (permalink)  
Antiguo 19/08/2004, 10:17
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 16 años
Puntos: 5
A lo mejo0r podrías añadir un campo en la tabla de usuarios con la fecha en timestamp de la petición de marcar todos como leidos y borrar en la tabla de leidos todos los de fecha anterior.
Pero entonces a la hora de tener en cuenta los leidos tendrías que tener en cuenta que los de fecha anterior a ese nuevo campo que añadiste se suponen leidos además de los que están en la tabla de leidos (jo vaya lio me monte yo sólo ).

No se si servirá. A ver que nos dice Cluster.

Salu2 ;)

Última edición por yoseman; 19/08/2004 a las 10:19
  #8 (permalink)  
Antiguo 19/08/2004, 15:50
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 18 años
Puntos: 69
Bueno, veamos si podemos sacar algo en claro, porque este tema me interesa mucho, el de marcar un foro o tema como Leido/No Leido.
Estuve haciendo un experimento recién, configuré el FireFox para que me pregunte antes de setearme cualquier cookie, y me metí en ForosDelWeb, para ver como hace el vBulletin para marcar los temas, y lo que descubrí es lo siguiente:

1) al Entrar al Foro, recibimos la cookie con el hash de la sesión, que es una cookie de sesión (expira al cerrar el browser o después de x minutos) y dos cookies más, que tienen 1 año de duración que indican la última visita(bblastvisit) y la última actividad(bblastactivity). Estas dos cookies, que contienen un unix timestamp, junto a la información almacenada en la base de datos sobre la ultima actualización de cada tema, sirve para hacer "la magia"
Nota: están las demás cookies de usuario, password, preferencias, etc, pero esas no tienen efecto en esto.

2) El foro se nos muestra todos los Foros completos, y basados en la fecha de última actualización de cada foro, comparada con NUESTRA fecha de última visita (la del usuario logeado y que se guardó en la cookie) muestra resaltados los foros que cambiaron DESPUÉS de nuestra última visita. Esto lo hace para todos los foros y subforos que hay. Y no cambia hasta que nuestra cookie de sessión expira.

3) Al entrar en 1 foro en particular ( en mi ejemplo, usé Aplicaciones Prefabricadas ) se vuelve a repetir el proceso del paso 2) , solo que esta vez los temas van a ser los resaltados, basados nuevamente en su fecha de última modificación y la fecha de última visita del usuario. También, al entrar al Foro, se actualiza la cooki de última actividad (bblastactivity), pero la de última visita queda igual.

4) Y al hacer click en un Tema, es donde comienza lo complicado: antes de entrar en el nuevo tema, el Foro nos deja una cookie, llamada vbthread_lastview que contiene información codificada ( vamos, en un formato bastante simple al parecer ), donde se guarda el id's de todos los threads que estaban marcados "nuevos" y que el usuario está visitando, además de un Timestamp al final que debe indicar la fecha de la ultima modificación de la cookie. Esta cookie, es de sesión también, y no se guarda el histórico de toda la vida ( el ejemplo de los 17.000 threads que comentaba Cluster - aunque me gustaria ver una cookie así de grande ). Así, si el usuario vuelve al foro en particular, se puede discriminar, PARA ESA SESION, los temas que ya visitó.

5) Eso es todo? No, a último momento me doy cuenta, que al volver a un Foro en particular, después de leer algún Thread, el vBulletin debe chequear, si hay temas nuevos en ese foro. O sea, si quedan más temas "nuevos" que deban ser marcados. Si no hay más de esos temas, y el foro no tiene sub-foros aún marcados nuevos, entonces se setea una cookie llamada vbforum_view, donde en el mismo formato que la otra cookie, se guardan los ID's de los foros visitados y el timestamp de modificación de la cookie. De esta manera, si volvemos a un foro Mayor, que contenga un subforo, ya puede marcarlo como leido, porqueya hizo la comprobación de que no habia nuevos temas para leer.

Esto, a grandes razgos, es la manera que usa vBulletin para marcar sus foros como leidos/no-leidos. Si alguno quiere comprobar que lo que digo es verdad, puede hacer el mismo ejercicio que yo, configurando sus navegadores y navegando el foro en distintas situaciones. También sería interesante que alguien haga lo mismo, pero con otro foro, como el phpBB o el Invision, para ver que acercamientos al problema hacen estos softwares.

Espero que les haya sido de ayuda. Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #9 (permalink)  
Antiguo 20/08/2004, 09:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 17 años, 11 meses
Puntos: 129
A mi me gustaba la idea de guardar ID's ..sería más "exacto". El método de fijarse en la "sesión activa" (por fechas y sólo guardando los ID's de los que estamos viendo) de los foros/mensajes que estamos visitando es bastante bueno para otimizar recursos al parecer.

Un saludo,
  #10 (permalink)  
Antiguo 07/04/2006, 04:14
Avatar de deccweb  
Fecha de Ingreso: febrero-2003
Ubicación: Mataro
Mensajes: 365
Antigüedad: 16 años, 9 meses
Puntos: 0
Una pregunta Cluster... Porque haces un count en la consulta para ver si lo ha leido o no? "SELECT COUNT(*) FROM" son menos recursos o tiene alguna explicación?
__________________
Calle17.net

edgargranados.es
  #11 (permalink)  
Antiguo 07/04/2006, 04:33
Avatar de deccweb  
Fecha de Ingreso: febrero-2003
Ubicación: Mataro
Mensajes: 365
Antigüedad: 16 años, 9 meses
Puntos: 0
He aplicado esto a un codigo de noticias y quiero que los usuarios logueados puedan ver las noticias que no han leido.

Como deberia hacer la consulta SQL si quiero mostrar todas las noticias que no han leído?

La tabla la he creado así

idnoticia (unico)
idusuario (unico)

Con esta sentencia SQL saco las leidas:

Cita:
SELECT noticias.*, noticias_leidas.idusuario
FROM noticias INNER JOIN noticias_leidas ON noticias.idnoticia = noticias_leidas.idnoticia
WHERE noticias_leidas.idusuario=1;
.. pero como puedo sacar las no leídas?
__________________
Calle17.net

edgargranados.es

Última edición por deccweb; 07/04/2006 a las 04:39
  #12 (permalink)  
Antiguo 08/04/2006, 11:34
Avatar de deccweb  
Fecha de Ingreso: febrero-2003
Ubicación: Mataro
Mensajes: 365
Antigüedad: 16 años, 9 meses
Puntos: 0
Nadie sabe como podria hacer la consulta sql?
__________________
Calle17.net

edgargranados.es
  #13 (permalink)  
Antiguo 10/04/2006, 02:40
Avatar de deccweb  
Fecha de Ingreso: febrero-2003
Ubicación: Mataro
Mensajes: 365
Antigüedad: 16 años, 9 meses
Puntos: 0
Lo hariais de otra forma?
__________________
Calle17.net

edgargranados.es
  #14 (permalink)  
Antiguo 03/10/2006, 21:35
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 15 años
Puntos: 2
Hola.

A ver qué les parece esto:

Para conocer qué THREADS contienen un nuevo mensaje que el usuario aún no ha visualizado, en vez de crear una nueva tabla, se podría hacer lo siguiente:

Cada vez que un usuario crea una respuesta en un THREAD ya existente, se hace lo siguiente:

1. Se eliminan de la tabla "mensajes_no_leidos" todos los registros referentes a este "id_mensaje" (con lo cual ahora todos los usuarios verían el THREAD como no-leído).

2. Se agregaría a la tabla "mensajes_no_leídos" un registro con "id_mensaje" e "id_usuario" del usuairo que ha escríto la respuesta.


¿Qué les parece?

Un saludo.
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 18:52.