Mié. Oct 2nd, 2024

Sistema interno de mensajes

1- Introducción

2- Utilidades posibles

3- Desarrollo

         3.1- Campos de la base de datos

         3.2- Archivo de conección a la base de datos

         3.3- Envío de mensajes internos

         3.4- Bandeja de salida

         3.5- Bandeja de entrada

4- Consejos

 

1-  Introducción

A lo largo de todo este artículo les iré explicando como desarrollar un sistema de mensajería interna para tu sitio web, el manual explicará como desarrollarlo en php y MySQL.

Se explicará cada vez que se inserte un código el uso del mismo y su función de modo tal que al terminar de leer esto seas capas de entender el funcionamiento y puedas crear el tuyo propio o modificar este a tu gusto, agregándole funciones o restando las mismas.

2- Utilidades posibles

Las utilidades para este sistema están muy a la vista, van desde que se puedan comunicar los usuarios dentro de la web de forma privada ya sea para realizar un negocio, un comentario o lo que sea hasta utilizarlo como un mail interno para una empresa u organización en la que solo se pueden comunicar si estás registrado.

Ya casi es común ver esto en todas las webs, en foros ver mensajes privados y en otros sitios, pero ¿qué pasa si estás programando tu propio sitio y quieres meter este sistema? ¿Descifrarás los códigos viendo los de un foro? Pues no te hará falta ya que a lo largo de este tutorial te explicaré como realizarlo.

3- Desarrollo

3.1- Campos de la base de datos

En este apartado les indicaré los campos necesarias que utilizaremos para la base de datos, me basaré el ejemplo utilizando phpmyadmin, vamos a crear una base de datos, bajo el nombre de: “mensajesint”

Una vez creada la base de datos(esto es si no se disponía de una, si ya se tiene una base de datos directamente se puede pasar a la parte en que creamos una tabla para los mensajes).

Ahora es momento de crear la tabla, la llamaremos “mensaje” y contendrá los campos:

 

ID – Int (50) Key – Autoincrement

Emisor – Varchar (90)           *

Receptor – Varchar (90)        *

Asunto – Varchar (50)

Mensaje – Blob

Estado – Int (1)

*Estos dos varchar de 90 depende en realidad de la cantidad máxima de caracteres que pueda tener un usuario. Ahora pasaré a explicar porque es cada campo:

 

ID: Es el valor numérico que se genera de forma automática y que no se puede repetir, es para identificar de forma única cada mensaje.

Emisor: En este campo se guardará el usuario que envía el mensaje

Receptor: En este campo se guardará el usuario que recibe el mensaje, es decir, para quien estaba destinado.

Asunto: En este campo se guardará el asunto del mensaje ingresado por el usuario.

Mensaje: Aquí guardaremos el mensaje enviado.

Estado: Este campo es de vital importancia, y solo tomará los valores 0, 1, y 2, es para indicar si algún usuario borró el mensaje o puede visualizarlo, si el campo está en 0 quiere decir que ambos pueden ver el mensaje, si el campo está en 1, quiere decir que el emisor lo borró de bandeja de salida y solo el receptor lo puede ver en bandeja de entrada, si el campo está en 2 quiere decir que el receptor lo borró de bandeja de entrada pero el emisor no de bandeja de salida, y si ambos lo borran ya se puede eliminar el registro, total no debería ser visible en ese caso para nadie. Tener este campo de estado nos evita crear otra tabla para que cada uno almacene su mensaje.

3.2- Archivo de conección a la base de datos

El archivo lo llamaremos “conectar.php” y tendrá el siguiente código:

<?

$coneccion=mysql_connect(«localhost», «root», «root»);

mysql_select_db(«mensajesint», $coneccion);

?>

En donde dice localhost pondremos la dirección de la base de datos, en el primer root va el nombre de usuario y en el segundo root la contraseña.

En la segunda línea de código estamos seleccionando la base de datos, es decir “mensajesint” la cual llevaría otro nombre si ya disponías tu base de datos o si le haz indicado otro nombre.

3.3- Envío de mensajes internos:

En este caso daré por acentado una variable que no indicamos y que indicará tu sitio web que es la variable $user la cual contendrá el nombre de usuario de la persona que está conectada actualmente, es decir, quien va a enviar el mensaje.

Debemos crear el formulario de envío de mensajes:

<form method=”post” action=”enviarmensaje.php”>

Para: <br>

<input type=”text” name=”receptor”> <br>

Asunto: <br>

<input type=”text” name=”asunto”> <br>

Mensaje: <br>

<textarea name=”mensaje” style=”width: 300px; height: 125px;”></textarea> <br>

<input type=”submit” value=”Enviar” name=”envio”>

</form>

Lo que hicimos en ese código fue crear el formulario que se enviará a la página enviarmensaje.php la cual tomará los datos y los guardará en la base de datos.

Archivo enviarmensaje.php:

<?php

include “conectar.php”;

$receptor=$_POST[receptor];

$asunto=$_POST[asunto];

$mensaje=$_POST[mensaje];

$estado=0;

            $agrego_mensaje=mysql_query(«insert into mensaje(

                                   `emisor`,

                                   `receptor`,

                                   `asunto`,

                                   `mensaje`,

                                   `estado`

                                   ) VALUES (

                                   ‘$user’, ‘$receptor’, ‘$asunto’, ‘$mensaje’, ‘$estado’

                                   );», $coneccion);

if($agrego_mensaje) echo “Mensaje enviado correctamente”;

else “Error al enviar el mensaje”;

?>

En este archivo lo que hacemos es guardar el mensaje en la bd, en la primera línea de código incluyo el archivo de conección a la base de datos para poder realizar este procedimiento, posteriormente pido las variables que fueron enviadas a través del formulario, hasta llegar a la variable $estado, la cual la declaro con 0 que indica que es visible por ambos, tanto emisor como receptor, como expliqué anteriormente.

En la línea siguiente, declaro una variable donde ejecuto la acción de guardar el registro en la base de datos. El emisor es una variable llamada $user que como lo dije anteriormente proviene de la web ya que en este tutorial no explicamos como loguear usuarios y demás, esta variable $user puede cambiar de acuerdo a tu código.

Y finalmente por medio de un IF verificamos si se ejecutó correctamente la acción, si así fue nos informa que se envió correctamente el mensaje, en caso contrario que hubo un error al enviarlo.

La variable ID no hace falta aclararla debido a que es automática y se genera sola.

   3.4- Bandeja de salida

En esta parte del tutorial vamos a listar todos los mensajes enviados con la opción de borrarlos, el mismo lo organizaré en una tabla, primero pondré el código y abajo la explicación como venimos haciendo:

Bandejadesalida.php:

<?php

include “conectar.php”;

$accion=$_GET[accion];

If($accion==”eliminar”)

{

$id=$_GET[id];

$sel=mysql_query(“Select estado from mensaje where id=’$id’;”, $coneccion);

$estado=mysql_result($sel, 0, estado);

            if($estado==0)

$eliminar=mysql_query(“Update mensaje set estado=’1’ where id=’$id’;”, $coneccion);

elseif

$eliminar=mysql_query(“delete from mensaje where id=’$id’;”, $coneccion);

If($eliminar) echo “Mensaje eliminado correctamente”;

Else echo “No se ha podido borrar el mensaje”;

}

$seleccion=mysql_query(“Select * from mensaje where emisor=’$user’ and (estado=’0’ or estado=’2’);”, $coneccion);

$cantidad=mysql_num_rows($seleccion);

echo “<table border=’0’>”;

echo “<tr><td>Destinatario</td><td>Asunto</td>”;

echo “<td>Mensaje</td><td>Acción</td></tr>”;

for($i=0;$i<$cantidad;$i++)

{

$id=mysql_result($seleccion, $i, id);

$asunto=mysql_result($seleccion, $i, asunto);

$destinatario=mysql_result($seleccion, $i, receptor);

$mensaje=mysql_result($seleccion, $i, mensaje);

echo “<tr><td>”.$destinatario.”</td><td>”.$asunto.”</td>”;

echo “<td>”.$mensaje.”</td>”;

echo “<td><a href=’bandejadesalida.php?accion=eliminar&id=”.$id.”’>”;

echo “Eliminar</a></td></tr>”;

}

echo “</table>”;

?>

En la primera línea de código nos conectamos a la base de datos en la siguiente pedimos una variable que nos es llegada por el método get, en el caso de que un usuario borre un mensaje de la bandeja de salida la url será: bandejadesalida.php?accion=eliminar&id=ID

Entonces en la siguiente línea comparamos si la acción es igual a eliminar si así es, pedimos el id y buscamos el estado de ese ID en la tabla, ya que si el estado es 0, solo debemos cambiar el estado a 1 para que se pueda seguir viendo en la bandeja de entrada, pero si el estado es 2 se borra el registro de la base de datos, ya que si el estado está en dos indica que el usuario receptor lo borró de la bandeja de entrada y si ahora lo está eliminando el usuario de la bandeja de salida ya se puede borrar el registro.
En la primera condición que lo igualamos a uno como anteriormente dije utilizo la función update de mysql para actualizar el estado a 1(visible solo para el que lo recibió en bandeja de entrada), y si estaba en 2(visible solo para el de bandeja de salida) lo elimino total ya no debería ser visible para nadie porque ambos lo borraron.

Si la acción no era enviar o ya se ejecutó la acción del eliminado se almacena en la variable “selección” todos los registros que se encuentren en mensajes siempre y cuando al usuario le corresponda en bandeja de salida y el estado sea 0(visible por ambos) o 2(visible para bandeja de salida). Y en la variable cantidad, solicito la cantidad de registros para saber cuantas veces recorrer el for, posteriormente creo una tabla para ordenar los datos y por medio de un for le voy agregando filas(<tr>) con los valores correspondientes. Se puede ver que la última fila el href de la acción eliminar es como mencioné anteriormente bandejadesalida.php?accion=eliminar&id=ID

Una ves finalizado el for, cierro la tabla.

3.5- Bandeja de salida

Ahora llegando al final del tutorial solo quedan que vean los mensajes recibidos, para lo cual es algo muy similar al código del punto anterior:

Bandejadeentrada.php:

<?php

include “conectar.php”;

$accion=$_GET[accion];

If($accion==”eliminar”)

{

$id=$_GET[id];

$sel=mysql_query(“Select estado from mensaje where id=’$id’;”, $coneccion);

$estado=mysql_result($sel, 0, estado);

            if($estado==0)

$eliminar=mysql_query(“Update mensaje set estado=’2’ where id=’$id’;”, $coneccion);

elseif

$eliminar=mysql_query(“delete from mensaje where id=’$id’;”, $coneccion);

If($eliminar) echo “Mensaje eliminado correctamente”;

Else echo “No se ha podido borrar el mensaje”;

}

$seleccion=mysql_query(“Select * from mensaje where receptor=’$user’ and (estado=’0’ or estado=’1’);”, $coneccion);

$cantidad=mysql_num_rows($seleccion);

echo “<table border=’0’>”;

echo “<tr><td>Destinatario</td><td>Asunto</td>”;

echo “<td>Mensaje</td><td>Acción</td></tr>”;

for($i=0;$i<$cantidad;$i++)

{

$id=mysql_result($seleccion, $i, id);

$asunto=mysql_result($seleccion, $i, asunto);

$destinatario=mysql_result($seleccion, $i, receptor);

$mensaje=mysql_result($seleccion, $i, mensaje);

echo “<tr><td>”.$destinatario.”</td><td>”.$asunto.”</td>”;

echo “<td>”.$mensaje.”</td>”;

echo “<td><a href=’bandejadeentrada.php?accion=eliminar&id=”.$id.”’>”;

echo “Eliminar</a></td></tr>”;

}

echo “</table>”;

?>

Como podemos apreciar el código es casi el mismo, y para no repetir sobre lo mismo solo diré los cambios que se producen:

-Al momento de eliminar en el caso de que el estado sea 0(visible para ambos) se pasa a 2(para que aún lo pueda ver el que lo envió pero no el que lo recibió ya que lo está borrando). Si el estado no estaba en 0 quiere decir que estaba en 1, por lo tanto solo visible en bandeja de entrada por lo que ya se puede borrar el registro de la base de datos ya que lo está eliminando.

– El otro cambio que se produce es en la selección, ya que en vez de seleccionar por el campo emisor selecciono por el receptor, ya que el usuario está en bandeja de entrada donde verá los que recibió siendo el receptor y no emisor y además que el estado sea 0 (visible por ambos) o 1 (visible en bandeja de entrada).

El resto del código se puede decir que es el mismo que para bandeja de salida.

4- Consejos

– No olvidarse de reemplazar la variable $user por la del usuario en cuestión ya sea una variable que tiene el nombre o una variable con el valor de la sesión “usuario”

– La tabla es un poco precaria, se puede mejorar el diseño utilizando css para la misma

– Por seguridad, si se va a implementar para usuarios, recomiendo hacer al momento del que se va a borrar un mensaje una revisión del id si ese ID le corresponde al usuario en cuestión, en caso de que no le corresponda que no se borre, para evitar que los usuarios puedan modificar esto desde la url.

– Poner un captcha al envío de mensajes o una restricción en la cantidad de envíos por persona.

Por Atomico

Un comentario en «Sistema interno de mensajes»
  1. Buenas quisiera implementar un sistema de mensajes privados para mi web , he estado mirando tu código y resulta muy útil, pero en tu sistema no está la opcion de responder a un mensaje.

    Como podria hacerse este supuesto.

    El poder enviar un mp a otro usuario y que este pueda responderle desde el mismo mp y guardando los datos del texto anterior.

Los comentarios están cerrados.