Sistema administrable de comentarios

Usando solamente una tabla de MySQL y varias lineas de codigo PHP, vamos a crear un sistema de comentarios en articulos. Estos comentarios seran aprobados o rechazados por algun administrador o moderador antes de ser mostrados al publico.

La base de datos

En este caso, vamos a usar una base de datos MySQL llamada comentarios. De cada comentario, necesitamos saber e id unico, a que articulo corresponde, en que fecha fue escrito, quien lo escribio, el comentario en si, y el estado del comentario.

CREATE TABLE `comentarios` (
  `cid` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `id` INT(6) NOT NULL,
  `unix` INT(12) NOT NULL,
  `autor` VARCHAR(128) NOT NULL,
  `contenido` VARCHAR(1024) NOT NULL,
  `estado` INT(1) NOT NULL
) ENGINE = MYISAM;

Mostrar comentarios y formulario

Para manter el codigo del script principal de la pagina mas limpio, vamos a crear una funcion llamada commentsDisplay(), con la que se mostrara los datos en la base y el formulario HTML.

function commentsDisplay() {
  $result = mysql_query("select * from comentarios where id='$_GET[id]' order by unix asc");
  while($row = mysql_fetch_array($result)) {
    if ($row['estado'] == 1) {
      echo '<div class="comment">
       <div class="h_comment">'.$row[autor].' dijo
       <div class="f_comment">'.fecha($row[unix]).' </div></div>
       <div class="c_comment">'.$row[contenido].'</div>
       </div>';
    }
    else { echo '<div class="comment"><div class="h_comment"><span class="code_ej">Comentario no verificado</span></div></div>'; }
  }

  $form = '<form action="" method="post">
    <table id="addcomment">
      <tr><td>Nombre:</td><td><input type="text" name="autor" /></td></tr>
      <tr><td>Comentario:</td><td><textarea name="contenido" cols="30" rows="6"></textarea></td></tr>
      <tr><td colspan="2"><input type="submit" /></td></tr>
    </table>
    <input type="hidden" name="action" value="add_comment" />
  </form>';

  echo '<div class="comment">
    <div class="h_comment">Agregar un comentario</div>
    <div class="c_comment">'.$form.'</div>
  </div>';
}

Administracion de comentarios

Para administrar los comentarios, vamos a mostrarlo dentro de un <input> o <textarea>, para evitar una posible injeccion de HTML.

function commentsAdmin() {
  $result = mysql_query("SELECT * FROM comentarios WHERE estado=0 ORDER BY unix ASC");
  while($row = mysql_fetch_array($result)) {
    echo '<div class="comment">
      <form action="" method="post">
      <div class="h_comment"><input type="text" name="autor" value="'.$row[autor].'" /></div>
      <div class="c_comment"><textarea name="contenido" cols="52" rows="10">'.$row[contenido].'</textarea>
      <input type="hidden" name="cid" value="'.$row[cid].'" />
      <input type="submit" name="apr_comment" value="Aprobar" style="width:49%" />
      <input type="submit" name="del_comment" value="Borrar" style="width:49%" />
      </div></form>
    </div>';
  }
}

Modificaciones de la base de datos

La primera modificacion que necesitamos, es la de agregar el comentario. Si bien en este ejemplo no hay proteccion contra ataques de injeccion SQL, es muy importante defender tu sitio de estos ataques. Existen mejores defenzas que el uso de la funcion mysql_real_escape_string(), por eso no lo he agregado en el ejemplo.

if($_POST[action] == 'add_comment') {
  $unix = date(U);
  $contenido = $_POST[contenido]; // Agregar defenza contra SQL Injection aca
  mysql_query("insert into comentarios values ('',$_GET[id], $unix, '$_POST[autor]', '$contenido', 0)") or die(mysql_error());
}

Luego tenemos las consultas de administracion de comentarios. Primero la usada para aprovar el comentario.

if ($_POST[apr_comment]) {
  mysql_query("UPDATE comentarios SET estado = '1' WHERE cid=$_POST[cid];") or die(mysql_error());
}

Y la funcion para borrarlos.

if ($_POST[del_comment]) {
  mysql_query("DELETE FROM comentarios WHERE cid=$_POST[cid];") or die(mysql_error());
}

La hoja de estilos

En mi caso uso estas declaraciones de estilo, pero pueden ser modificadas facilmente.

#addcomment td {
    text-align:center;
}
#addcomment input,textarea {
    border:1px solid #000;
}
.comment {
    width:400px;
    margin:0 auto;
    margin-top:20px;
    overflow: auto
}
.h_comment {
    background-color:#B2CDE0;
    padding:2px;
    border:1px solid #778C7E
}
.c_comment {
    background-color:#FFF;
    padding:6px;
    border:1px solid #778C7E;
    border-top:0;
}
.f_comment {
    float:right;
    font-size:10px;
    position:relative;
    top:-15px;
}

La funcion fecha()

Gracias a Andres Navarro me di cuenta que habia usado una funcion hecha por mi y no habia mostrado como era. Lo unico que hace esta funcion es transformar una fecha en formato unix en el formato dd-mm-yy.

function fecha($unix) {
  $d = getdate($unix);
  return "$d[mday]-$d[mon]-$d[year]";
  unset($d);
}

 
#1  ELfeR
8 de Abril del 2009
CAPO!
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Comentario no verificado
Agrega tu comentario. Tu opinion si importa!.
Nombre

Tu mensaje


Por razones de seguridad todos los comentarios deben ser aceptados antes de ser publicos. Se puede usar HTML para darle formato al comentario, pero cualquier otro tipo de HTML sera ignorado antes de ser ingresado a la base de datos. Cualquier informacion personal sera mantenida en privado, a menos que se especifique lo contrario.