12.31.2010

Creando un sistema de comentarios en PHP

Vamos a crear un sistema para permitir a nuestros usuarios comentar en nuestro sitio, partiremos del hecho de que tenemos algun sistema de noticias o bien que hemos creado algun CMS para nuestro sitio. Si aun no tienes un sistema de noticias en el libro PHP para todos se explica claramente como crear un pequeño CMS para tu sitio.


Ahora, es importante que identifiquemos que deseamos hacer. 

Vamos a mostrar los comentarios en cada entrada, ahora lo mas importante es considerar que x o y comentario pertenecera a x o y entrada entonces. A la hora de crear nuestra tabla MySQL vamos a incluir un campo que indique la entrada a la que pertenece el comentario.

Ademas, crearemos un modulo en nuestro panel de administracion para administrar los comentarios en cada entrada. para permitir al administrador borrar o moderar los comentarios.

Entonces, vamos a crear una nueva tabla en nuestra base de datos,  Dicha tabla va a contener los siguientes datos:

CREATE TABLE `tusitioya`.`comentarios` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`idnoticia` INT NOT NULL ,
`nombre` TEXT NOT NULL ,
`comentario` TEXT NOT NULL
) ENGINE = MYISAM ;

Esta tabla contiene 4 campos, uno para el id del comentario, uno para el id de la noticia, para el autor del comentario y para el comentario en si.

Ahora, vamos a crear un archivo de conexion al que llamaremos conect.php (es probable que algunos ya lo tengan y no haga falta volverlo a escribir)

En el basicamente, vamos a conectarnos con nuestro servidor MySQL y a seleccionar nuestra base de datos:

<?php
//conexion con la base de datos
$conexion = mysql_connect("localhost","root","") or die("Problema de conexion");
//seleccion de la tabla
mysql_select_db("tusitioya",$conexion) or die ("No se pudo conectar con la tabla");
?>

Una vez que hemos creado la tabla,  y hemos creado nuestro archivo de conexion, vamos a crear el archivo que ingresa los datos a la tabla, este sera basicamente un formulario muy sencillo con un campo de texto para el nombre del usuario, y uno para el comentario. 

Ademas agregaremos un campo oculto que almacene el id de la noticia y un submit, para enviar el comentario. A este archivo le llamaremos coment.php

<form action="index.php" method="post">
Nombre:
<br/>
<input type="text" name="nombre"/>
<br/>
Comentarios:
<br/>
<textarea name="comentario"></textarea>
<br/>
<br/>
<input type="hidden" name="idnoticia" value="<?php echo $_GET['op']?>"/>
<input type="submit" value="Enviar"/>
</form>

Por el momento, es HTML basico y algo de PHP unicamente para obtener el valor de la noticia almacenada en una variable que pasa por URL llamada "op"

Ahora, vamos a escribir el programa que procesara los datos, si estos existen para eso vamos a utlizar la funcion isset,

if (isset($_REQUEST['nombre']) && isset($_REQUEST['comentario'])) {
Y si la condicion es verdadera, entonces vamos a insertar los valores de nuestro formulario en nuestra base de datos, de modo que nuestro script quedaria mas o menos asi:

if (isset($_REQUEST['nombre']) && isset($_REQUEST['comentario'])) {
    include("conect.php");
    mysql_query("INSERT into comentarios(idnoticia,nombre,comentario)
    values('$_REQUEST[idnoticia]','$_REQUEST[nombre]','$_REQUEST[comentario]')",$conexion) or die(mysql_error());
    header("location:index.php?op=$_GET[op]");
    }

Ya ubicado en nuestro archivo coment.php queda mas o menos asi:

<?php
if (isset($_REQUEST['nombre']) && isset($_REQUEST['comentario'])) {
    include("conect.php");
    mysql_query("INSERT into comentarios(idnoticia,nombre,comentario)
    values('$_REQUEST[idnoticia]','$_REQUEST[nombre]','$_REQUEST[comentario]')",$conexion) or die(mysql_error());
    header("location:index.php?op=$_GET[op]");
    }
?>
<form action="coment.php?op=<?php echo $_GET['op']?>" method="post">
Nombre:
<br/>
<input type="text" name="nombre"/>
<br/>
Comentarios:
<br/>
<textarea name="comentario"></textarea>
<br/>
<br/>
<input type="hidden" name="idnoticia" value="<?php echo $_GET['op']?>"/>
<input type="submit" value="Enviar"/>
</form>
Vale, aunque ahorita podrian probarlo.. estos comentarios se ingresarian y no habria un valor para la variable op, por lo que a la hora de procesar el formulario habria un error, pero eso lo veremos mas adelante, ahora vamos a crear un archivo que lea los comentarios acorde al articulo seleccionado.

En este archivo, en principio vamos a procesar los datos UNICAMENTE si existe la variable op, que sera el identificador de la noticia en cuestion, de modo que nuestro script seria:

<?php
if (isset($_GET['op'])) {
    include("conect.php");
    $resp = mysql_query("SELECT nombre,comentario FROM comentarios WHERE idnoticia=$_GET[op]",$conexion);
    while($ext=mysql_fetch_array($resp)) {
        echo $ext['nombre'];
        echo "<br/>";
        echo "<br/>";
        echo $ext['comentario'];
    }
}
?>

Basicamente, estamos mostrando todos los resultados para nombre y comentario donde el idnoticia sea igual al id pasado por URL ´op´ Asi pues, si incluimos estos dos archivos en el archivo que muestra los articulos de esta forma:

<?php
$opcion = $_GET["op"];
if (isset($opcion)) {
    include ("conect.php");
    $respuesta = mysql_query("SELECT arto FROM articulos WHERE id = $opcion",$conexion);
    while ($existe = mysql_fetch_array($respuesta)) {
        echo $existe['arto'];
}
    echo "<br/>";
    echo "<br/>";
    include("leercoment.php");
    echo "<br/>";
    echo "<br/>";
    include ("coment.php");
}
else {
    echo "<p>Este es un parrafo de ejemplo. Y este sitio ha sido creado siguiendo el curso tu Sitio Ya de Maurizzio Penalba</p>
        <p align='center'><img src='recursos/objetos/equipo.jpg' width='331' height='225' /></p>";
}
   

?>
Ahora, en nuestro index.php veremos algo como esto:



Aunque algo tosco, el darle un poco de estilo queda en manos de cada uno, ahora, aunque el sistema de comentarios ha quedado muy prolijo, aun nos hace falta hacer un par de cosas, en primer lugar deseamos mejorar la seguridad del sistema pues asi como esta cualquiera puede ingresar HTML, PHP o cualquier otro script que podria ser malicioso, ademas debemos contar con un area de administracion para eliminar y modificar comentarios

En principio vamos a parsear todo el texto que entre a travez de nuestras areas de texto, esto lo haremos con una funcion, y vamos a incluirla en nuestro archivo coment.php

function parsearhtml($texto) {
    return nl2br( htmlentities($texto, ENT_QUOTES) );
    }
Con esta funcion, pasamos todas las etiquetas HTML a texto plano, y traducimos cualquier comilla de esta forma evitamos cualquier clase de defase o XSS en nuestro sitio, aunque sean solo comentarios podria representar algun problema en un futuro. Una vez aplicada la seguridad a nuestro script, quedaria mas o menos asi:

<?php
function parsearhtml($texto) {
    return nl2br( htmlentities($texto, ENT_QUOTES) );
    }
$comentario = parsearhtml($_REQUEST['comentario']);
$nombre = parsearhtml($_REQUEST['nombre']);
if (isset($_REQUEST['nombre']) && isset($_REQUEST['comentario'])) {
    include("conect.php");
    mysql_query("INSERT into comentarios(idnoticia,nombre,comentario)
    values('$_REQUEST[idnoticia]','$nombre','$comentario')",$conexion) or die(mysql_error());
    header("location:index.php?op=$_GET[op]");
    }
?>
<form action="coment.php?op=<?php echo $_GET['op']?>" method="post">
Nombre:
<br/>
<input type="text" name="nombre"/>
<br/>
Comentarios:
<br/>
<textarea name="comentario"></textarea>
<br/>
<br/>
<input type="hidden" name="idnoticia" value="<?php echo $_GET['op']?>"/>
<input type="submit" value="Enviar"/>
</form>
Ahora, solo nos hace falta agregar un area de administracion a nuestro script, dado que partimos del hecho de que tenemos un CMS propio o hemos creado uno a partir del curso PHP para todos vamos a suponer a suponer que el sistema de login ya ha sido implementado. Y unicamente voy a mostrar el script que corresponderia al listado de los comentarios en cada uno de los articulos para el area de administracion

<?php include("llave.php") ?>
<table border="0" cellspacing="4">
<?php
include ("../conect.php");
if (isset($_GET['del'])) {
    mysql_query("DELETE from comentarios WHERE id=$_GET[del]",$conexion);
}
$ids = mysql_query("SELECT id,nombre,comentario FROM comentarios",$conexion);
while ($ide = mysql_fetch_array($ids)) {
    echo "<tr>";
    echo "<td>".$ide['id']."</td>";
    echo "<td>".$ide['nombre']."</td>";
    echo "<td>".$ide['comentario']."</td>";
    echo "<td>"."<a href='editcomment.php?del=$ide[id]'>Eliminar</a>"."</td>";
    echo "</tr>";
}
?>
</table>
Y con esto finalmente hemos creado nuestro sistema de comentarios, ahora, voy a dejar los archivos junto al CMS que se ha creado en PHP para todos a modo de que puedan seguir el tuto

http://www.mediafire.com/?0gk364njn3397jb

Claro que el sistema puede mejorarse mucho, Por ejemplo podemos agregar un editor de texto enriquecido Pero esto es con caracter educativo.
A la espera de sus comentarios e inquietudes.
Un saludo

18 comentarios:

KOVY (Kevin Rizo) dijo...

jeje, interesante, lastima que no se puede en blogger, aunque si se guardara el archivo .php en un servidor aparte a blogger, y se adjuntara alos coments de blogger, serviria?

FELIZ NAVIDAD Y PROSPERO AÑO NUEVO!!!

KOVY (Kevin Rizo) dijo...

perdon, perdon, perdon, me imagino que seria mas JavaScript, eso creo?

Linkgl dijo...

Bien ahí mz, sólo te puedo recomendar no usar REQUEST para obtener las variables, o usas $_POST o $_GET que con $_REQUEST el sitio queda vulnerable :P Y poner un captcha o algun filtro para bots porque si llega un bot te va a llenar de comentarios basura el sitio :P !

Maurizzio Peñalba dijo...

@KOVY pues, creo que podrias adjuntar algun javascript a las paginas de blogger pero no veo porque hacer un sistema de comentarios en blogger

@Linkgl Si, pensaba incluir el captcha pero no queria alargar mas el tutorial, La verdad no sabia que $_REQUEST podia representar problemas en cuanto a la seguridad sin duda uno de los cambios que se pueden incluir.

Luis Ville Moraalinen (makhukita,Rootwarez) dijo...

O muy bueno we yo quisiera saber como podemos modificar una plantilla web sin dañarla we por que eh tratado y no puedo ojala puedas ayudarme we
Un Saludo

Makhukita

we dijo...

hola, estoy creando un sistema de noticias como dices, y me baje el CMS, pero cuando entro a la administración no me permite loguear, como se puede entrar a la admin del cms???

Anónimo dijo...

mm

Anónimo dijo...

Buenisismo, pero la neta no se usar PHP, ke manual o tutorial online me recomiendas, mi correo es unforgiven_1994@hotmail.com por si gustas contestarme, paz!!!

Anónimo dijo...

q asco

Edwin dijo...

hola que tal muy interesante tuto lo he estado siguiendo y tengo un problema en este codigo
<?php
$opcion = $_GET["op"];
if (isset($opcion)) {
include ("conect.php");
al declarar la varoable op no esta definida me marca, ya en indes cuando ya le pongo index.php?op=1 si me funciona pero mientras
solo entre a index me carca que no esta definida la variable, que podria haer ahi espero tu respuesta de antemano gracias por el tuto

Maurizzio Peñalba dijo...

:facepalm:.... Si son un monton de archivos .php, no hay ni un ejecutable u.u hay que ser ignorante

pedro batista dijo...
Este comentario ha sido eliminado por el autor.
Ricardo dijo...

¿Podrían volver a subir el comprimido? El archivo ya no existe. Gracias!

Daniel Jose Ruiz Gutierrez dijo...
Este comentario ha sido eliminado por el autor.
Univerluz Clarísimo dijo...

Hola tengo una duda mas bien una pregunta ¿por que en bes de enseñar eso tan sencillo por que mejor no enseñan este que utilice para dejar este mismo comentario? y la verdad la mayoria de las paginas hacen lo mismo mejor no enseñen nada.

Brenda dijo...

hola.... disculpe estoy creando un sistema de comentario...lo estoy implementando en un sistema de ordenes de compras, como puedo hacer para que el comentario que se realice, en una orden de compra solo se visualice en esa orden y no en todas las ordenes que se han hecho.....

raul dijo...

ya no esta disponible para bajarse el archivo lo borraron..puedes subirlo de nuevo?
gracias

raul dijo...

me sale este error

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\nuevosistema\leercoment.php on line 9

aque se debera

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Design Blog, Make Online Money