PHP con MySQL: Sistema de comentarios simple con moderación

Crear un sistema de comentarios es más facil de lo que podemos pensar en un principio, necesitaremos guardar muy pocos datos con el nombre el email y el texto del comentario nos será suficiente.

Un ejemplo es el que os pongo a continuación donde creariamos en musql una tabla con los campos id, idarticuloasociado, nombre, email, texto,activo:

CREATE TABLE IF NOT EXISTS `prefijo_comentarios` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `idarticuloasociado` INT(10) UNSIGNED NOT NULL,
  `nombre` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  `texto` text COLLATE utf8_unicode_ci NOT NULL,
  `activo` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idartista` (`idartista`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

No debemos olvidarnos de poner idarticuloasociado como clave foranea del artículo donde se comente:

ALTER TABLE `comentarios`
  ADD CONSTRAINT `prefijo_comentarios_1` FOREIGN KEY (`idarticuloasociado`) REFERENCES `prefijo_articulo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Ahora las dos funciones que usaremos en PHP para moderar los comentarios son en primer lugar:

function enviarcomentario($mysqli,$nombre,$email,$texto,$articuloid) {
	if (!ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$email)){ 
	        return 'Email incorrecto'; 
	} else { 
		 $envio = $mysqli->query("INSERT INTO prefijo_comentarios (`id`, `idartista`, `nombre`, `email`, `texto`, `activo`) VALUES (NULL, '$articuloid', '$nombre', '$email', '$texto','0');");
		$subject = "Comentario";
		$mensaje = "--------------------------------------------------- \n";
		$mensaje.= "                      Comentario                    \n";
		$mensaje.= "--------------------------------------------------- \n";
		$mensaje.= "NOMBRE:   ".$nombre."\n";
		$mensaje.= "EMAIL:    ".$email."\n";
		$mensaje.= "FECHA:    ".date("d/m/Y")." a las ".date("h:i:s a")."\n";
		$mensaje.= "IP:       ".$_SERVER['REMOTE_ADDR']."\n\n";
		$mensaje.= "--------------------------------------------------- \n\n";
		$mensaje.= $texto."\n\n";
		$mensaje.= "--------------------------------------------------- \n";
		$mensaje.= "Enviado desde http://conocimiento.invbit.com \n";
                $mensaje.= "Activar: http://www.midominio.com/moderacomentario.php?accion=activar&id=xx  \n";
		$mensaje.= "Eliminar: http://www.midominio.com/moderacomentario.php?accion=eliminar&id=xx \n";
		$headers = "From: ".$email."\r\n";
		if (mail('moderador@midominio.com', $subject, $mensaje, $headers)) {
			return 'Se ha guardado pero no se ha podido avisar al moderador de su envio.';
		} else {
			return 'Enviado correctamente y esperando moderación.'; 
		}	
	} 
}

Aquí lo que realizamos es introducir las variables que recojemos en el formulario HTML que tengamos en la página web para posteriormente guardarlo en la base de datos y enviar un email al moderador que se va formando en la variable $mensaje con el resto de valores recogidos.

Finalmente para activar o rechazar el comentario usaremos la función:

function moderarcomentario($mysqli,$idcomentario,$accion) {
	if ($accion=='activar') {
		$envio = $mysqli->query("UPDATE prefijo_comentarios SET activo='1' WHERE id = '$idcomentario';");	
	} elseif($accion=='eliminar') {
		$envio = $mysqli->query("DELETE FROM prefijo_comentarios WHERE id = '$idcomentario';");	
	}
 
}

Es recomendable que esta función este protegida por usuario y contraseña pro lo que lo propio es que se ponga dentro del panel de administración de la página web.

Conectarse a MySQL desde PHP

Una de las peculiaridades que tiene PHP es que nos facilita mucho el trabajo para conectarnos y trabajar con diferentes tipos de bases de datos, una de las más usadas es MySQL y podemos conectarnos de una forma muy sencilla con tan solo llamar a la función mysql_connect y pasar los parámetros que indico a continuación:

$conexion = mysql_connect("servidor", "usuario", "clave");
mysql_select_db("prueba", $conexion);

En este caso tendríamos servidor donde le indicaríamos cual es la dirección IP del servidor, en caso de el mismo servidor donde ejecutas PHP localhost, usuario que como el nombre nos dice es el usuario para conectarnos con la base de datos y clave que es la contraseña de ese usuario.

ON DELETE, acciones al eliminar una clave foránea

CASCADE: Cuando las filas de la tabla padre sean borradas, las filas de la tabla hija a las que haga referencia serán borradas también.

RESTRICT: El valor no puede ser borrado si existe alguna referencia externa.

NO ACTION: Igual que restrict pero comprueba si existe alguna referncia externa al final de la consulta, con lo que los triggers se ejecutarán.

SET NULL: Establece los valores referenciales a null (en la tabla hija).

SET DEFAULT: Establece los valores referenciales a su valor por defecto (en la tabla hija).