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.

Random en php

Son muchas más veces de las que podemos llegar a pensar las veces que necesitamos un número aleatorio en PHP ya sea para mostrar por poner un ejemplo un listado de banners en un espacio publicitario.

Lo que tendríamos que poner es lo siguiente:

<?php
srand(mktime());
echo(rand());
?>

El resultado lo estamos mostrando directamente con un echo pero podríamos guardarlo en una variable para trabajar con este valor a posterior.

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.

Extensión de archivo en php

Para saber la extensión de un archivo en php podemos hacer uso de la función pathinfo(string $ruta) que nos devuelve el nombre del archivo, la carpeta en la que está y la extensión.

Un ejemplo de uso es el siguiente:

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
 
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>

Esto mostraría:
/www/htdocs/inc/
lib.inc.php
php
lib.inc

Obtener dimensiones de una imagen con php

Para saber el ancho y alto de una imagen, así como el tipo de archivo y los canales de color, podemos hacer uso de la función getimagesize(string $filename).
La función devuelve una matriz de 7 elementos.
Siendo los indices:
0: Ancho.
1: Alto.
2: una de las constantes IMAGETYPE_XXX indicando el tipo de imagen.
3: cadena de texto con la cadena height=»yyy» width=»xxx».
4,5,6 y/o 7: Los canales RGB y/o CMYK

A continuación un ejemplo de uso:

<?php
list($ancho, $alto, $tipo, $atributos) = getimagesize("img/flag.jpg");
echo "<img src=\"img/flag.jpg\" $atributos alt=\"Ejemplo de getimagesize()\" />";
?>

Crear lector RSS con php

Aquí os dejo un script que devuelve noticias procedentes de un rss:

<?php
$long_descripcion=100; 
$num_noticias=3; 
$n=0; 
$noticias = simplexml_load_file('http://www.invbit.com/feed'); 
foreach ($noticias as $noticia) {  
	foreach($noticia as $reg){ 
		if($reg->title!=NULL && $reg->title!='' && $reg->description!=NULL && $reg->description!='' && $n<$num_noticias){ 
			?> <div class="noticia"> <?php
			echo '<h4><a href="'.$reg->link.'" target="_blank">'.$reg->title.'</a></h4>'; 
			if(strlen($reg->description)>$long_descripcion) 
				echo '<p>'.substr($reg->description,0,$long_descripcion).'...</a></p>'; 
			else if ($reg->description==NULL || $reg->description==''){
			}
			else 
				echo '<p>'.$reg->description.'</p>'; 
			$n++; 
			?> </div><?php
		} 
	} 
}
?>

Eliminar código html en php

Para eliminar las etiquetas html de una variable en php podemos hacer uso de la función strip_tags().

Ejemplo:

$stringHTML = '<p>Soy un molesto parrafo con un <a href=#>link</a></p>';
$stringSinHTML = strip_tags($stringHTML);
echo '$stringSinHTML';

Esto mostrará:
Soy un molesto parrafo con un link

También podemos eliminar sólo determinadas etiquetas de la siguiente forma:

$stringHTML = '<p>Soy un molesto parrafo con un <a href=#>link</a></p>';
$stringSinHTML = strip_tags($stringHTML,'<p>'); //Elimino todas menos la <p>
echo '$stringSinHTML';

Esto mostrará:
<p>Soy un molesto parrafo con un link</p>

Cookies

Función que nos permite crear una cookie:

setcookie(Nombre, Valor, Tiempo_Vida, Path, Dominio, Seguro);

Ejemplo:

// Esta cookie se llama "saludo", tiene el valor "hola" y dura una hora. 1 hora = 3600 segundos 
setcookie("saludo", "hola", time() + 3600);

Para leer una cookie:

//Devuelve hola
echo $_COOKIE['saludo'];

Para ver todas las cookies y sus valores:

// A way to view all cookies
print_r($_COOKIE);

Para eliminar una cookie, ponemos su valor en blanco y el tiempo de vida negativo:

// Marca el tiempo de vida a una hora antes.
setcookie("user", "", time()-3600);

Detectar URL en texto y ponerlo como link

Función que busca una URL en un texto y la pone como enlace en HTML muy útil para comentarios.

function findReplaceURL($text){
 
// The Regular Expression filter
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
 
// Check if there is a url in the text
if(preg_match($reg_exUrl, $text, $url)) {
 
       // make the urls hyper links
      return preg_replace($reg_exUrl, "<a href=".$url[0].">".$url[0]."</a> ", $text);
 
} else {
 
       // if no urls in the text just return the text
       return $text;
 
}
}