Justi 17 de noviembre de 2008 a las 14.36
   Imprimir artículo
elWebmaster.com

Taller de PHP: Nuestro blog – Sistema de comentarios (1)


¡Hola, mis alumnitos! ¿Como pasaron la semana? En la clase de hoy vamos a ver como los usuarios registrados pueden dejar comentarios en nuestras noticias.

Para ello vamos a tener que crear primero la pagina donde se vera la noticia completa, la dificultad que tendrá esto es que vamos a tener que hacer un join con dos tablas, la de categorías y la de usuarios.

Como en todas nuestras clases del blog primero voy a mostrar el código y después lo voy a pasar a explicar.

  1. <?
  2.  
  3. // iniciamos session
  4. session_start ();
  5.  
  6. // archivos necesarios
  7. require_once 'admin/config.php';
  8. require_once 'admin/conexion.php';
  9. require_once 'admin/esUsuario.php';
  10.  
  11. // obtengo puntero de conexion con la db
  12. $dbConn = conectar();
  13.  
  14. // verificamos que este conectado el usuario
  15. if ( !empty( $_SESSION&#91;'usuario'] ) && !empty($_SESSION['password']) ) {
  16.     $arrUsuario = esUsuario( $_SESSION&#91;'usuario'], $_SESSION['password'], $dbConn );       
  17. }
  18.  
  19. if ( !empty($_POST&#91;'submit']) ) {
  20.    
  21.     if ( !empty($_POST&#91;'comentario']) )     $comentario     = $_POST['comentario'];
  22.     if ( !empty($_GET&#91;'idNoticia']) )       $idNoticia      = $_GET['idNoticia'];
  23.     if ( !empty($arrUsuario&#91;'idUsuario']))  $idUsuario      = $arrUsuario['idUsuario'];
  24.    
  25.     // completamos la variable error si es necesario
  26.     if ( empty($comentario) )   $error&#91;'comentario']        = true;
  27.     if ( empty($idNoticia) )    $error&#91;'idNoticia']         = true;
  28.     if ( empty($idUsuario) )    $error&#91;'idUsuario']         = true;
  29.    
  30.     // si no hay errores registramos al usuario
  31.     if ( empty($error) ) {
  32.        
  33.         // inserto los datos de registro en la db
  34.         $query  = "INSERT INTO `comentarios` (comentario, idUsuario, idNoticia) VALUES ('$comentario','$idUsuario','$idNoticia')";
  35.         $result = mysql_query($query, $dbConn);
  36.        
  37.         header( 'Location: vernoticia.php?idNoticia='.$idNoticia );
  38.         die;
  39.        
  40.     }
  41.    
  42. }
  43.  
  44. // traemos la noticia
  45. $query = "SELECT noticias.idNoticia, noticias.titulo, noticias.copete, noticias.cuerpo, categorias.valor as categoria, usuarios.usuario FROM `noticias`
  46. INNER JOIN `categorias` ON categorias.idCategoria = noticias.idCategoria
  47. INNER JOIN `usuarios` ON usuarios.idUsuario = noticias.idUsuario
  48. WHERE noticias.idNoticia = " . $_GET&#91;'idNoticia'] . " LIMIT 1";
  49. $resultado = mysql_query ($query, $dbConn);
  50. $noticia = mysql_fetch_assoc ($resultado);
  51.  
  52. ?>
  53. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  54. <html xmlns="http://www.w3.org/1999/xhtml">
  55. <head>
  56.     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  57.     <title>Blog Personal</title>
  58. </head>
  59.  
  60. <body>
  61.  
  62.     <h1>Blog Personal</h1>
  63.    
  64.     <? if ( empty($arrUsuario&#91;'usuario']) ) { ?>
  65.     <ul>
  66.         <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li>
  67.         <li><a href="registrar.php">Reg&iacute;strate gratis</a></li>
  68.     </ul>
  69.     <? } else { ?>
  70.     <p>Bienvenido <?= $arrUsuario&#91;'usuario'] ?> - <a href="index.php?salir=true">Salir</a></p>
  71.         <? if ( $arrUsuario&#91;'tipo'] == 'admin' ) { ?>
  72.         <ul>
  73.             <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li>
  74.         </ul>
  75.         <? } ?>
  76.     <? } ?>
  77.  
  78.     <h2><?php echo $noticia&#91;'titulo']; ?></h2>
  79.     <p>Publicado por <b><?php echo $noticia&#91;'usuario']; ?></b> en <i><?php echo $noticia&#91;'categoria']; ?></i></p>
  80.     <div><?php echo $noticia&#91;'cuerpo']; ?></div>
  81.    
  82.     <div>
  83.         <?php if ( !empty( $arrUsuario ) ) { ?>
  84.        
  85.             <form action="vernoticia.php?idNoticia=<?php echo $_GET['idNoticia']; ?>" method="post">
  86.                 <p>
  87.                     <label for="comentario">Dejar un comentario</label><br />
  88.                     <textarea rows="3" cols="50" name="comentario"></textarea>
  89.                 </p>
  90.                 <p>
  91.                     <input name="submit" type="submit" value="Enviar" />
  92.                 </p>
  93.             </form>
  94.        
  95.         <?php } else { ?>
  96.             <p>Para dejar un comentario hay que ser un usuario registrado. <a href="registrar.php">Registrar</a> o <a href="ingresar.php">Ingresar</a></p>
  97.         <?php } ?>
  98.     </div>
  99. </body>
  100. </html>

¿Que cosas nuevas tenemos acá?
Con lo primero que nos encontramos es con una verificación si se envió un post, esto es si nos dejaron un comentario, para guardarlo en la base de datos. Por el momento estos comentarios no los vamos a mostrar, ya que los tiene que revisar primero un administrador, para evitar que nos dejen spam, insultos u otras cosas desagradables :).

Dentro del submit verificamos 3 cosas, que contenga texto, que sea de un usuario registrado y que este la id de noticia a la que hace referencia el comentario. Fíjense que para esta ultima el valor de la id la estamos pasando por GET, no por POST.

Por otro lado, como no va a hacer falta mostrar el error a los usuarios en caso de que falle, simplemente dejamos la variable de error con un TRUE si es que existe. Recuerden que en las clases anteriores le poníamos un STRING con el error a mostrar.

Bueno, si no tiene errores, hacemos el insert en la base de datos.

A continuación tenemos la consulta para traer la noticia, esta consulta es bastante más compleja que las que veníamos usando, ya que hace dos JOINS, uno con la tabla de categorías y otro con la tabla de usuarios. De esta forma, en una sola consulta obtenemos el nombre de la categoría y el nombre de usuario. Recuerden que en la tabla de noticias solo guardábamos las id de ambos. Esto nos permite estar siempre actualizados en caso de que cambiemos el nombre de usuario o nombre de la categoría desde el panel de admin.

Por ultimo dentro de lo que seria el “template”, osea la parte de html, vamos a tener un if que nos va a mostrar el formulario para dejar un comentario o nos va a mandar a registrarnos.

Bueno, eso es todo por hoy, la clase que viene veremos cómo mostrar el listado de comentarios aprobados por un admin en esta misma página, y el panel de admin para aprobar o borrarlos. Buena semana.

<< CLASE ANTERIOR CLASE SIGUIENTE >>


Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (28)

  1. juan dice:

    Esta genial este curso, bueno en esta clase tengo una duda.
    como se llama este archivo, sino estoy mal seria el noticias.php
    admin/noticias.php

    o me equivoco.

    Gracias de antemano

  2. Luis Alfonso dice:

    Gracias por ingresar la nueva clase de este taller ya estaba impaciente por leerla y estudiarla !!!

  3. Justi dice:

    Hola Juan, vernoticia.php es el archivo, perdon por no ponerlo.

  4. Michael Burdock dice:

    oye una consulta y la tabla para conectarlo con la bd? disculpa xd si esta soy nuevo en esto ;D

  5. Justi dice:

    @michael burdock: hola, por favor lee todo el taller, esta todo bien explicado.

  6. michael dice:

    window.location=”http://lemichack.es.tl”;

  7. Alex Aguila dice:

    y si se quisiera seleccionar solo determinadas noticias para llevar comentarios es decir, desde el administrador de las noticias decidir cual si llevara comentarios y cual no.

    es posible esto???

  8. Justi dice:

    @alex podes agregar una nueva columna en la tabla de noticias que sea un tinyint con 0 para permitir comentarios y con 1 para no permitirlos, que se cambie con un checkbox desde la carga de noticias, y a la hora de mostrar la noticia tambien traes el nuevo campo y en el template con un if mostras o no el formulario de comentarios.

  9. luis dice:

    voy a probar tu script a ver si funciona

  10. Antonio dice:

    Muy buena la explicacion para el desarrollo, te consulto por el archivo vernoticia.php si lo tenes publicado o esta con otro nombre?? Gracias!!!

  11. Justi dice:

    no entendi la pregunta

  12. Maximiliano dice:

    Buenas! Muy bueno tu taller me ayudó bastante, cómo puedo hacer para mostrar las noticias por categorias?

    Por ejemplo: Pizzas, Empanadas

    index.php?Categoria=Pizzas

    y que muestre pizzas, con un isset? O algo así?

  13. Justi dice:

    @maximiliano nop, a la hora de hacer la consulta levantas la variable get y la agregas dentro del where para consultar.

  14. Jordi dice:

    Primero felicitarte por el taller, me ha sido muy util.

    Escribo aqui solo para explicar un problema con el que me topé y conseguí resolverlo.
    En la linea 45 de este ‘vernoticia.php’ se crea una multiple consulta con INNER JOIN. Bien, de esta forma no conseguí hacerlo funcionar, en cambio me funciona perfectamente con LEFT JOIN.

    Si a alguien más le ha ocurrido puede probarlo y si no es correcto del todo me corriges Justi.

    Un saludo a todos y gracias.

  15. ifrance. dice:

    buen material

  16. Sebastian dice:

    Excelente.
    Habria alguna forma de hacer un codigo para filtrar las categorias y q no aparezcan todas juntas?

  17. Justi dice:

    @Sebastian hola, en la consulta que traes la consulta tenes que agregar en la clausula WHERE la categoria que queres traer, quedaria algo asi “SELECT * FROM noticias WHERE idCategoria = 2” por ejemplo.

  18. erick dice:

    esta muy chida este blog

  19. Muey dice:

    Cojonudo!

  20. tucuta dice:

    Excelente tutorial, mis felicitaciones.

    Solo tengo un pequeño problema.

    Me sale esto:

    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\sitio_alondra\blog\vernoticia.php on line 50

    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\sitio_alondra\blog\vernoticia.php on line 60

    Como hago para solucionarlo, ya probé con lo que dijo “Jordi” pero no me funciona.

    Si alguien me puede ayudar se lo agradezco.

  21. lina - arte country dice:

    Hola yo he creado algunas paginas en html pero me siento estancada sin php, quiero aprender desde cero y necesito saber si tiene algun costo hacer consultas y como puedo empezar, espero su respuesta.

  22. lina dice:

    hola, ya encontre el inicio del curso y realmente esta muy detallado, pero como estay tan atrasada quisiera saber si hago preguntas en la primera parte aun tiene respuesta o debo hacerlas en el ultimo blog?

    gracias

  23. Antonio dice:

    @Justi hola, muy Buenas tarde!, cómo puedo hacer para mostrar las noticias por titulo en vez de idNoticia?
    Por ejemplo:
    vernoticia.php?titulo=decision-del-consejo-de-estados
    O algo así?

    Gracias por tu colaboración…..Espero tu respuesta. Gracias…….

  24. Antonio dice:

    @Justi hola de nuevo, he intentado que en vez de idNoticia sea por titulo, y he hecho esto, pero nada que funciona:

    $query = “SELECT noticias.idNoticia, noticias.titulo, noticias.copete, noticias.cuerpo, noticias.fCreacion, categorias.valor as categoria, usuarios.usuario FROM `noticias`
    INNER JOIN `categorias` ON categorias.idCategoria = noticias.idCategoria
    INNER JOIN `usuarios` ON usuarios.idUsuario = noticias.idUsuario
    WHERE noticias.titulo = ” . $_GET[‘titulo’] . ” LIMIT 1″;
    $resultado = mysql_query ($query, $dbConn);
    $noticia = mysql_fetch_assoc ($resultado);

    esto es en el archivo: vernoticias.php.

    me podría ayudar en esto….gracias de nuevo.

  25. Franco Centurion dice:

    Excelente! Con esto mi pagina se fue para arriba de una! 😉 muchas gracias te debo mucho!

  26. Katiuska dice:

    Me parece muy interesante que el comentario pase primero por un moderador porque así evitamos comentarios de mal gusto que nos ofenden o molestan a nuestros usuarios.

  27. Alex Gamo dice:

    Para todos aquellos que todavía sigan este tutorial, deciros que la consulta de vernoticia.php da error utilizando INNER JOIN porque no tiene asignado ningún usuario a la noticia. Hay que modificar la consulta en la pagina admin/noticias.php, concretamente en el apartado donde recibe el “submit”:
    $idUsuario = $arrUsuario[‘idUsuario’]
    El array del usuario tiene que llamar al id de usuario y no al nombre de usuario. Si llama al nombre de usuario el campo idUsuario en la tabla noticias queda a 0 y no hay ningún usuario con ese id.

  28. ulises dice:

    hola veo que a todos les andubo ami no me andubo me salan unos errores alguien seria tan amable de enviarme un rar con todos los archivos funcionando

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder