2010-01-13 13 views
5

Estoy construyendo un sitio de red social en PHP/MySQL/jQuery. Una vez que un usuario inicia sesión en mi sitio, me gustaría consultar el DB y obtener un anuncio de administrador, si existe. Este será un cuadro de mensaje que se muestra en la página para todos los usuarios, pero tendrá un X para hacer clic en él y no volver a mostrarlo hasta que el administrador publique un nuevo mensaje de anuncio. Entonces, si nunca haces clic en la X y hay mensajes de anuncio que existen en la base de datos, siempre aparecerá este cuadro de mensaje en tu página, sin embargo, si hiciste clic en la X para cerrarla, entonces regresas a la página. no estar allí, a menos que haya un nuevo mensaje de administrador publicado.¿La mejor manera de mostrar un mensaje de administrador a ciertos usuarios?

Sé que hay varias formas de hacerlo, pero estoy buscando la manera más eficiente.

Una idea que tengo, si agrego un campo mysql extra en la tabla del usuario "admin_message" y lo marco como 0, cuando publique un nuevo mensaje de administrador cambiará el registro para cada usuario a 1, si es administrador el mensaje se establece en 1 y luego se muestra en la página del usuario. Luego, cuando el usuario haga clic en la X para ocultar el cuadro, actualizará la fila de la tabla de usuario y reducirá el valor a 0.

Otra idea que tengo es usar cookies para verificar si un usuario ha elegido ocultar un mensaje , creo que esto sería más rápido, pero tal vez no tan bueno, ya que el usuario puede iniciar sesión con diferentes computadoras y si se muestra un mensaje nuevo, es posible que no lo vea de inmediato.

Entonces, ¿me pregunto si es una mala idea utilizar el campo de la base de datos adicional? Si tuviera 1,000,000 de usuarios, cuando publicara un nuevo mensaje de administrador, tendría que actualizar 1,000,000 de filas para asegurarme de que todos puedan ver el mensaje. ¿Hay una mejor manera? También una vez que un usuario inicia sesión en mi sitio, utilizaré una sesión para almacenar el valor de ellos al ver u ocultar el mensaje en lugar de mirar el DB en cada carga de página.



ACTUALIZACIÓN

En este momento creo que mi puesto podría de sido un poco confuso o no clara sobre qué es exactamente lo que quería decir, porque la mayoría de las respuestas son atendidos a un sistema de mensajes, que esto no es algo cercano a.

Olvídese de la palabra mensaje, por favor, trataré de explicarlo con una palabra diferente. Digamos que hay 1 administrador en el sitio, que es el único administrador que puede publicar un mensaje para que lo vean los usuarios. Los usuarios solo verán 1 mensaje, si hay 2352345234 mensajes publicados a lo largo de la vida útil del sitio, no importará, solo verán 1 mensaje, el más nuevo.

Ahora, algunos usuarios que inician sesión y ven este mensaje "div" en la página pueden cansarse de verlo, por lo que podrán ocultarlo para que nunca vuelva a aparecer.

Será tan simple como un sí o un no para mostrar este mensaje en la página.

Sin embargo, si decido que necesito publicar un nuevo mensaje de administrador para que todos los usuarios lo vean, incluso un usuario que eligió ocultar y no mostrar el mensaje de administrador lo volverá a ver hasta que decida no volver a verlo.

Respuesta

3

Dos soluciones simples son los siguientes:

Buena: Hora de la cookie de los usuarios, si contiene un indicador que indica el mensaje ha sido mostradas no mostrar el mensaje, si no mostrarlo. Cuando el usuario lo cierra, actualice la cookie. Pros: absolutamente simple. Contras: el usuario puede ver el mismo mensaje dos veces dependiendo de si borran sus cookies o inician sesión desde otra máquina.

Mejor: Almacene una marca en la base de datos en algún lugar (puede almacenarla en la tabla de usuarios administradores por ahora, y más adelante dividirla en otra tabla). Cuando el usuario inicia sesión, 1) guarde este marcador en la cookie o sesión del usuario, 2) actualice la base de datos, 3) decida si el mensaje debe mostrarse. Cuando el usuario cierra el mensaje, actualice la cookie/sesión y DB. Pros: el usuario nunca recibe el mensaje dos veces. Contras: un poco más involucrado ya que necesita mantener la bandera en el db.

Detalles de implementación: Para la marca, puede usar una identificación de mensaje como ya se sugirió o, más que probable, ya está conservando la última marca de usuario de inicio de sesión del usuario y podría usar eso.

0

Recomiendo tener una tabla admin_message_queue. Tendrá un cuerpo de mensaje, una ID de usuario y una ID de mensaje. Cuando publique un nuevo mensaje de administrador, agregará un registro para cada usuario administrador a esa tabla. Luego, cuando inicien sesión, simplemente seleccionen todas las filas admin_message_queue donde ID de usuario = el usuario que inició sesión.

Para deshacerse del mensaje que acaba de hacer, el botón de cerrar activará una devolución de llamada AJAX a un método en el servidor que toma el ID del mensaje. Ese método eliminará de admin_message_queue donde ID de mensaje = el publicado y ID de usuario = la ID de usuario de la sesión. De esa forma, un usuario no puede eliminar mensajes para otra persona.

Hacerlo de esta manera le evita tener que mantener alrededor de las filas de mensajes vistos. ¿Por qué alternar un poco para ocultarlo a alguien? Acabará guardando muchos datos que ya no se usan.

Actualizado después de la actualización de la pregunta: Lo siento, pensé que estabas tratando de mostrar mensajes solo a los administradores. También puede mantener esta misma lógica para mostrar el mensaje más reciente a todos los usuarios. Simplemente tenga una tabla con un ID de usuario, mensaje de texto. Cada vez que publique un mensaje pasará y sobrescribirá el texto del mensaje para todas las personas que aún tengan registros (personas que no han ocultado el mensaje) y agregará filas para otras personas. Cuando ocultan el mensaje, elimine la fila de ese usuario.

+0

Bueno, sinceramente, no es tan complejo. Será 1 administrador en el sitio y solo mostrará 1 mensaje, el mensaje más nuevo que será para que todos los usuarios lo vean, solo necesito una forma para que los usuarios oculten el cuadro de mensaje si lo desean mostrar en la página y una forma de forzar el cuadro oculto para mostrar si publico un mensaje nuevo. Por lo tanto, no es necesario que almacene ningún ID de usuario de ningún tipo y no necesito consultar ID especiales – JasonDavis

1

Todos los usuarios pueden tener last_message_seen, por lo que debe consultar los mensajes "nuevos" (message_id> last_message_seen) para su usuario. Si [X] cierra (o expira), su javascript puede verificar los mensajes nuevos y así sucesivamente ...

La otra idea es tener ese último mensaje visto en el entorno de JavaScript, pero en ese caso será reseteado (recalculado) cuando actualice/abandone la página, y si no está en la base de datos, su usuario puede perder mensajes insertados entre la carga de la última página y esta actualización.

O ... puede estar en la sesión, por lo que no se perderá ninguna. Cuando inicia sesión, el número se restablece a un número "normal", digamos: último mensaje o mensaje posterior (ahora - 1 h) o lo que sea ...

1

Usaría la idea n. ° 1. No usaría un bool-field para verificar si el usuario ha leído el mensaje, usaría un campo datetime, con algún valor predeterminado. Si campo == predeterminado, no leído. Cuando se lee, configure el campo AHORA().

De esta forma usted sabrá de manera aproximada qué tan rápido leen el mensaje los usuarios.

EDIT:

después de su edición, yo todavía utilizan el mismo mecanismo. El mensaje necesita un campo para saber si se lee o no. Si los usuarios hacen clic en la X (para cerrar), actualice la base de datos y marque el mensaje como leído.

Si el administrador publica un nuevo mensaje, esto aparecerá.

También necesita un datetime de creación para su messahe, porque si un usuario no cerró el mensaje anterior y el administrador publica uno nuevo, solo se puede mostrar el último mensaje.

Edit2: En respuesta a este comentario:

Incluso si un usuario se perdió el mensaje de la mañana, solamente la más reciente se debe mostrar.Tal vez soy misunderstaning pero suena como si está diciendo que básicamente marcar un mensaje leído 100.000 veces es de 100.000 usuarios clic en la X y yo creo que debe ser más en la tabla de usuario, mostrar o no lo hago cuadro de mensaje espectáculo , no en un individuo base

algo no es locigal en su teoría. Desea guardar el "mostrar/no mostrar" como una configuración, pero desea mostrar el mensaje de todos modos. ¿Cómo sabe cuándo anular la configuración de los usuarios y cuando no sin recordar si el sistema mostró el mensaje al usuario? Incluso si solo desea mostrarlo una vez, necesitará un campo en la base de datos (en el nivel del mensaje) para almacenar si el sistema mostró el mensaje al usuario o no.

+0

Incluso si un usuario omitió un mensaje, solo se mostrará el más nuevo. Tal vez estoy malinterpretando, pero suena como si estuvieras diciendo que básicamente marque un mensaje leído 100.000 veces 100.000 usuarios hagan clic en la X y creo que debería estar más en la tabla de usuario, mostrar o no mostrar cuadro de mensaje, no de forma individual – JasonDavis

+0

No está en un nivel de mensaje, está bien para que sea más simple de entender, pretendemos que solo haya 1 mensaje hecho ALGUNA vez y simplemente actualizo ese mensaje/comentario/aviso como quiera llamarlo. Cuando lo actualizo, todos los usuarios deberían verlo en la página, incluso si deciden no verlos. La configuración para ocultarlo es solo para ocultarlo hasta que actualice/publique uno nuevo. Creo que lo entendí ahora, agregaré un campo de configuración a DB para mostrar o no mostrar los avisos de la página de inicio/mensaje – JasonDavis

+0

gracias por tratar de entender lo que estoy diciendo, sé que es difícil de explicar las cosas a veces – JasonDavis

1

Usted está manteniendo un tiempo de inicio de sesión para el usuario ¿verdad? Como un last_login datetime?

Así que recibe todos los mensajes donde date_created> = last_login. Muestrelas, luego actualice el tiempo last_login to now().

Cuestiones relacionadas