Foros del Web » Programando para Internet » PHP »

Duda programación nuevos mensajes

Estas en el tema de Duda programación nuevos mensajes en el foro de PHP en Foros del Web. Hola colegas, estoy programando un foro en PHP desde cero, y me he atorado, pues no sé como mostrarle al usuario los nuevos mensajes que ...

  #1 (permalink)  
Antiguo 13/04/2010, 11:30
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Duda programación nuevos mensajes

Hola colegas, estoy programando un foro en PHP desde cero, y me he atorado, pues no sé como mostrarle al usuario los nuevos mensajes que se hayan escrito.

Se me había ocurrido comparar la fecha actual con la ultima fecha activo, pero eso solo funcionaría mientras esta logueado, si se desconecta y vuelve a iniciar sesión y hay algún mensaje que no haya leido, pues se pierde y le aparecerá como leido.

Otra forma que se me ocurrió grabar los mensajes que el usuario haya leido, y que cuando inicie sesión se compare la lista y que el sitio le muestre como no leidos los que no esten en la lista. Pero este metodo a la larga no funcionaría, ya que si el sitio crece serían cientos o miles de mensajes que se habrían que comparar.

¿Ustedes que me sugieren? ¿Cómo se puede manejar esto de los mensajes nuevos?
__________________
http://exegesis-biblica.com/
  #2 (permalink)  
Antiguo 13/04/2010, 11:44
Avatar de _-ZeuS-_  
Fecha de Ingreso: junio-2007
Ubicación: Quito, Ecuador! ;)
Mensajes: 100
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: Duda programación nuevos mensajes

x ke no usas un status en la bd?
  #3 (permalink)  
Antiguo 13/04/2010, 11:57
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

bueno en realidad para eso tienes 2 formas.. si estas registrado y logueado, en la db
user_id | post_id

y ahi vas agregado..
ahora si no esta registrado
se usan por cookies / sessiones
agregando las id en una cookie separados por punto y coma por ejemplo
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 13/04/2010, 11:57
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Cita:
Iniciado por _-ZeuS-_ Ver Mensaje
x ke no usas un status en la bd?
Te refieres a ponerle un campo a la base de datos para guardar ahi si lo ha leido o no? Nada recomendable, eso funciona para mensajes privados, en donde se establece que el usuario final es quien esta leyendo el mensaje, pero no funciona para mensajes publicos, en donde todos los usuarios leen los mensajes, no creo poder guardar en ese campo que 2 usuarios han leido el mensaje, pero que los otros 100 por ejemplo no lo han leido.

Alguna otra opción?
__________________
http://exegesis-biblica.com/
  #5 (permalink)  
Antiguo 13/04/2010, 11:59
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

Cita:
Alguna otra opción?
la mia puede ser ?
__________________
More about me...
~ @rhyudek1
~ Github
  #6 (permalink)  
Antiguo 13/04/2010, 12:06
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Duda programación nuevos mensajes

Creo que esa opción es la que el mismo había comentado en su primer post pero que había descartado por el tamaño que podría llegar a tener esa tabla.

Un saludo
  #7 (permalink)  
Antiguo 13/04/2010, 12:07
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Cita:
Iniciado por Hidek1 Ver Mensaje
bueno en realidad para eso tienes 2 formas.. si estas registrado y logueado, en la db
user_id | post_id

y ahi vas agregado..
ahora si no esta registrado
se usan por cookies / sessiones
agregando las id en una cookie separados por punto y coma por ejemplo
Si te entendí bien, lo que tengo que hacer es crear una tabla, por ejemplo mensajes nuevos, con los campos id, user_id, post_id, fecha. Y en esa tabla guardar la información del id que el usuario no ha leido. Es así?

Pero si es así, no se sobre carga la base de datos con 200 usuarios y 1000 mensajes, por ejemplo? O quiza no te he entendido bien, podrías explicarlo mejor?
__________________
http://exegesis-biblica.com/
  #8 (permalink)  
Antiguo 13/04/2010, 12:07
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Cita:
Iniciado por Heli0s Ver Mensaje
Creo que esa opción es la que el mismo había comentado en su primer post pero que había descartado por el tamaño que podría llegar a tener esa tabla.

Un saludo
Efectivamente...
__________________
http://exegesis-biblica.com/
  #9 (permalink)  
Antiguo 13/04/2010, 12:15
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

bueno entonces solo llenas el dato en un textoplano separado por punto y coma

Código texto:
Ver original
  1. user_id | post_leidos
  2. 50        12;25;80;10;11;15

luego solo un
Código PHP:
Ver original
  1. in_array(explode(";", $registro["post_leidos"]))
__________________
More about me...
~ @rhyudek1
~ Github
  #10 (permalink)  
Antiguo 13/04/2010, 12:16
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Duda programación nuevos mensajes

Blogger, no sé si habrá gente que use algún otro método, pero creo que los métodos más conocidos son esos dos que tu mismo has comentado, no sé si hay otra forma, cuando yo utilize PhpBB si no recuerdo mal, funciona así, con el tema de las fechas, comparando la fecha de la última vez logeado.

Un saludo
  #11 (permalink)  
Antiguo 13/04/2010, 12:17
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Cita:
Iniciado por Hidek1 Ver Mensaje
bueno entonces solo llenas el dato en un textoplano separado por coma

Código texto:
Ver original
  1. user_id | post_leidos
  2. 50        12;25;80;10;11;15
Perdona mi ignorancia, pero como podría sacar la información de post_leidos y compararla?
__________________
http://exegesis-biblica.com/
  #12 (permalink)  
Antiguo 13/04/2010, 12:18
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

luego solo un
Código PHP:
Ver original
  1. in_array(explode(";", $registro["post_leidos"]))
__________________
More about me...
~ @rhyudek1
~ Github
  #13 (permalink)  
Antiguo 13/04/2010, 12:34
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Eso podria, funcionar... pero alguien tiene otra idea?
__________________
http://exegesis-biblica.com/
  #14 (permalink)  
Antiguo 13/04/2010, 12:42
Avatar de blogger  
Fecha de Ingreso: diciembre-2005
Ubicación: frente al monitor
Mensajes: 398
Antigüedad: 18 años, 4 meses
Puntos: 12
Respuesta: Duda programación nuevos mensajes

Cita:
Iniciado por Heli0s Ver Mensaje
Blogger, no sé si habrá gente que use algún otro método, pero creo que los métodos más conocidos son esos dos que tu mismo has comentado, no sé si hay otra forma, cuando yo utilize PhpBB si no recuerdo mal, funciona así, con el tema de las fechas, comparando la fecha de la última vez logeado.

Un saludo
Deja implementar el metodo que ofrece Hidek1, a ver que tal funciona, o cual me convence más.
__________________
http://exegesis-biblica.com/
  #15 (permalink)  
Antiguo 13/04/2010, 12:43
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

Como quiera puedes usar una tabla y reportarlos como lo haz indicado desde el principio. Acuerdate que los motores de la base de datos se mueven bastante rápido. Lo importante es saber indexar bien las tablas. De esa forma es más rápido buscar los datos. En la mayoría de los casos (por no decir todas) es recomendable usar el motor de búsqueda de una base de datos que usar un proceso de PHP.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #16 (permalink)  
Antiguo 13/04/2010, 13:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

y si te fijas foros grandes (como este) usan ese método de guardar los ids en una tabla, pero solo guardan X tiempo, no por siempre, es decir si dejas de visitar el foro por algún tiempo al regresar vas a ver todos los temas leidos.

Este tipo de cosas se suele usar en tablas del tipo Memory ya que las busquedas son muy rapidas y en general son datos que no pasa nada si se pierden.

Saludos.
  #17 (permalink)  
Antiguo 13/04/2010, 14:12
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

Cita:
tablas del tipo Memory
podrias especificar sobre eso ?
__________________
More about me...
~ @rhyudek1
~ Github
  #18 (permalink)  
Antiguo 13/04/2010, 14:23
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Aquí tienes información: http://dev.mysql.com/doc/refman/4.1/...ge-engine.html

@GatorV: Sé que este foro usa tablas del tipo Memory, lo que tengo dudas es en la parte de arriba sale una opción que dice Tus opciones y si selecciono Marcar foros como leidos, todos los foros quedan, logicamente, leídos. ¿Qué es lo que hacen para lograr esto, que un usuario pueda marcar todo como leído? (si puedes mencionarme de algún lugar donde documentarme mejor). Tengo la idea de que los id nuevos son insertados en esa tabla tipo Memory y que como indicaste se mantienen en esas tablas por X cantidad de tiempo. Lo que no entiendo es como interactua el proceso de que un usuario vio un tema y ya sale como leído basado en esa tabla y que si marca foro como leido salen todos leidos solamente a ese usuario.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por GatorV; 13/04/2010 a las 14:42
  #19 (permalink)  
Antiguo 13/04/2010, 14:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

Lo que hace más bien es insertar los no-leidos, es pensar del otro lado del problema, al marcar todos como leidos, lo unico que hace es borrar todo donde user_id = current_user asi todos aparecen como no leidos.

Saludos.
  #20 (permalink)  
Antiguo 13/04/2010, 14:52
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

Ok, esa parte de insertar los no-leídos, me imaginaba que es así, lo que no entendí bien fue la parte que dices sobre borrar todo donde user_id = current_user. Porque lo que me estoy imaginando ahora mismo es, conforme lo que me dijiste, como si cada usuario tuviera una tabla Memory (lo cual sé que no es así). Ahí es donde quiero saber, como se hace esa comparación, para borrar. Yo siempre pensé que verificaba el último id registrado en la base de datos e ingresaba en alguna columna, el último id y con alguna especificación en otra columna indicando que anteriores a ese id también, o algo así.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #21 (permalink)  
Antiguo 13/04/2010, 15:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

Pues no, puede ser algo tan simple como una tabla de dos columnas:
Código:
user_id | thread_id
Entonces cuando hay un cambio a algún tema, o se crea algún tema, hay un insert a esa tabla:
Código SQL:
Ver original
  1. INSERT INTO unread VALUES ($user_id, $thread_id)

Luego cuando ves un tema puede hacer un:
Código SQL:
Ver original
  1. DELETE FROM unread WHERE thread_id=$thread_id

Si quieres marcar todos los foros como leidos
Código SQL:
Ver original
  1. DELETE FROM unread WHERE user_id=$user_id

Donde $user_id es igual al id de usuario que quieres marcar todos como leidos (en este caso el que inicio sesión.

Saludos.
  #22 (permalink)  
Antiguo 13/04/2010, 15:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

Bien ya voy entendiendo, entonces, ¿cómo el sistema hace para que si yo vi un tema, borra el mensaje, pero como evita que tú no veas el tema leído?. Me refiero, yo vi el tema, se borro de esa tabla, pero si la borro, se supone que todo el mundo que visite este foro vea también como leído el tema, aunque no lo haya hecho. Pregunto esto porque entiendo que esta parte
Código MySQL:
Ver original
  1. INSERT INTO unread VALUES ($user_id, $thread_id)
lo que hace es insertar el nuevo thread_id del que añadió. Pero ¿cómo se hace para que cuando tu lo hayas leído, te salga a ti leído y a mi todavía como no-leído? ¿Ya aquí requeriría de otra tabla?

Disculpa que pregunte, pero hace un tiempo, me puse a pensar como el foro hacia esto específicamente.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #23 (permalink)  
Antiguo 13/04/2010, 15:53
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

por eso indica user_id

inserta TU id y el id del thread asi luego haces un select con tu id
SELECT * FROM unread WHERE user_id = $_SESSION["user_id"];
y de ahi puedes comprobar los que TU no has leido
__________________
More about me...
~ @rhyudek1
~ Github
  #24 (permalink)  
Antiguo 13/04/2010, 15:56
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

Lo que yo entendí, es que se inserta el id y el thread que la persona añadió. Me refiero cualquier persona ingresó un tema, el id de esa persona y el thread de esa persona son los que se almacenaron en la base de datos ¿o me equivoco?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #25 (permalink)  
Antiguo 13/04/2010, 15:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

Exacto guarda el user_id del usuario actual así cada user_id tiene sus temas leidos y puedes borrar o seleccionar por usuario, o por tema, o hacer un join y verlo por foro.

Es una tarea compleja pero como bien dice el link de MySQL, es la ventaja de tablas del tipo Memory.

@Abimaelrc, no no inserta el ID del usuario actual no del que creo. Es decir en esa tabla vas a tener muchos IDs, de usuario y muchos threads repetidos es probable.
  #26 (permalink)  
Antiguo 13/04/2010, 16:03
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

Oh, ya creo que comprendí, entonces esas tablas lo que hacen es insertar todos los usuarios que no han leído todavía ese tema. Si no es así por favor peguenme un tiro
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #27 (permalink)  
Antiguo 13/04/2010, 16:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

Así es, es yo creo un proceso un poco lento me imagino tener todos los user_ids pero pues es una tabla que es muy volatil
  #28 (permalink)  
Antiguo 13/04/2010, 16:12
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Duda programación nuevos mensajes

-> (para tapar el ojo) Por fin llegue a un acuerdo contigo. Bueno gracias por el dato, me ha ayudado a entender mejor esto.
Cita:
Iniciado por forosdelweb
Tu debes de esparcir algo de Karma a otros usuarios antes de darle otra vez a GatorV.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #29 (permalink)  
Antiguo 13/04/2010, 16:29
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Duda programación nuevos mensajes

@GatorV: bueno sigo con el tema por que no quede 100% claro...
quiza me odies pero no estoy deacuerdo con esa forma ..

que pasaria si el foro tiene 4.000.000 de usuarios registrados y el movimiento promedio fuera entre post editados y nuevos de 500 por minuto... ?
tendrias 500 consultas * 4.000.000 de usuarios.. y eso solo en un minuto..
(sin mencionar los fines de semana )

ahora yo para aportar con una idea creo q seria mejor hacerlo al reves..

Código PHP:
Ver original
  1. <?php
  2. // al crear un tema
  3. $consulta = "INSERT INTO read_control (thread_id, users_id) VALUES ($thread_id, NULL)";
  4. // al editar un tema
  5. $consulta = "UPDATE read_control SET users_id = NULL WHERE thread_id = $thread_id";
  6. // al leer un tema que no habias leido (user registrado & logueado)
  7. $consulta = "UPDATE read_control SET users_id = CONCAT(users_id, ';".$_SESSION['user_id']."') WHERE thread_id = $thread_id";
  8. // en la carga de la pagina donde muestra los topic del foro seleccionado (user registrado & logueado)
  9. $consulta = "SELECT t.thread_id, t.thread_title, t.thread_subtitle, t.thread_url, r.users_id
  10.              FROM threads t, read_control r
  11.              WHERE t.thread_id = r.thread_id
  12.              AND t.thread_category = $categoria_foro
  13.              ORDER BY t.date_last_modification";
  14. $consulta = $db->consultar($consulta);
  15. while($registro = $db->fetch_assoc($consulta)){
  16.     $leido = in_array($_SESSION["user_id"], explode(";",$registro['thread_id'])) ? "normal" : "bold";
  17.     echo '<a style="font-weight:'.$leido.'" href="pagina.php?id='.$registro['thread_id'].'">'.$registro['thread_title'].'</a>';
  18. }
  19. ?>

aunque es solo una idea de la forma en que yo creo quedaria con menos saturacion..


PD: no estoy obesionado

saludos
__________________
More about me...
~ @rhyudek1
~ Github

Última edición por Hidek1; 13/04/2010 a las 16:46
  #30 (permalink)  
Antiguo 13/04/2010, 23:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda programación nuevos mensajes

Como te digo, si ves vBulletin lo maneja por tiempo así que no inserta en los 4,000,000 de users, si no solo en los activos, eso hace que el proceso sea menor. Yo creo que si los de vBulletin escogieron una forma para hacerlo así es porque han explorado todas las formas.

Saludos.

Etiquetas: mensajes, nuevos
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 23:35.