Foros del Web » Programando para Internet » PHP »

[APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Estas en el tema de [APORTE] Sistema de Noticias y Comentarios Con MYSQLI en el foro de PHP en Foros del Web. ¿Que es este sistema? Con este sistema puedes crear tus propias noticias y agregarles comentarios. ¿Pero me puedes hacer inyeccion html? No, porque he puesto ...
  #1 (permalink)  
Antiguo 16/08/2012, 17:58
 
Fecha de Ingreso: julio-2012
Mensajes: 276
Antigüedad: 11 años, 8 meses
Puntos: 27
Mensaje [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

¿Que es este sistema?
Con este sistema puedes crear tus propias noticias y agregarles comentarios.

¿Pero me puedes hacer inyeccion html?
No, porque he puesto un sistema que al insertar codigos html los imprime pero no se ejecutan.

¿Como agrego las noticias?
Te tienes que ir al index.php poner el nombre y contraseña y desde hay podras crear las noticias

¿Cual es el nombre y la contraseña?
Por defecto
El nombre: admin
La contraseña: admin
Puedes cambiar el nombre y la contraseña en el archivo llamado index.php

¿Cuantos archivos son?
Son 4 archivos
1- Comentarios.php
2- Conectar.php
3- Index.php
4- Noticias.php

¿Cual es el archivo para modificar la conexion a la base de dato?
El archivo se llama conectar.php

¿Este sistema tiene filtros?
Si, y son los siguientes:

Para crear una noticia:
1- El titulo debe tener como minimo 6 caracteres.
2- El contenido debe tener como minimo 20 caracteres.
3- El titulo y el contenido no pueden estar en blanco.

Para publicar un comentario:
1- El nombre debe tener como minimo 5 caracteres.
2- El mensaje debe tener como minimo 10 caracteres.
3- El nombre y el mensaje no pueden estar en blanco.

¿Para ver los nuevos comentario tengo que reiniciar la pagina?
No, he puesto un sistema para que cada segundo reinicia la pagina (Tu no te daras ni cuenta) por eso si alguien comenta al segundo lo veras en la pagina.

¿Que tengo que añadir en mi base de dato?
Añade estos codigos en tu base de dato:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `comentarios` (
  2.   `Id_Comentarios` varchar(40) NOT NULL,
  3.   `Autor` text NOT NULL,
  4.   `Comentario` text NOT NULL,
  5.   `Fecha` varchar(40) NOT NULL,
  6.   `Ip` varchar(40) NOT NULL,
  7.   PRIMARY KEY (`Id`)
  8. )
  9.  
  10. CREATE TABLE IF NOT EXISTS `ip` (
  11.   `Ip` varchar(40) NOT NULL DEFAULT '',
  12.   PRIMARY KEY (`Ip`)
  13. )
  14.  
  15. CREATE TABLE IF NOT EXISTS `noticias` (
  16.   `Titulo` text NOT NULL,
  17.   `Contenido` text NOT NULL,
  18.   `Categoria` varchar(40) NOT NULL,
  19.   `Fecha` varchar(40) NOT NULL,
  20.   `Ip` varchar(40) NOT NULL,
  21.   PRIMARY KEY (`Id`)
  22. )

Codigo:

Comentarios.php
Código PHP:
Ver original
  1. <?php
  2. include ("conectar.php");
  3. ?>
  4.  
  5. <?php
  6. $comentarios = mysqli_query($conexion, "SELECT Autor,Comentario,Fecha FROM comentarios WHERE Id_Comentarios = '$_GET[noticia]' ORDER BY Fecha DESC");
  7.     echo "<h2>Los comentarios</h2>";
  8.     while($comentar = mysqli_fetch_array($comentarios)){
  9.     echo "<b>$comentar[Autor]</b> $comentar[Fecha]h <br> <div style='word-wrap:break-word; width:500px;'>$comentar[Comentario]<br></div><br>";
  10.     }
  11. echo "<h2>Añadir Comentario</h2>";
  12. echo "<font color='red'>";
  13. if(isset($_POST['enviar'])){
  14.     if(strlen($_POST['nombre']) <= "4"){
  15.     echo "El nombre debe tener como minimo 5 caracteres.";
  16.     }else{
  17.     if(strlen($_POST['mensaje']) <= "9"){
  18.     echo "El mensaje debe tener como minimo 10 caracteres.";
  19.     }else{
  20.     if($_POST['nombre'] == "" | $_POST['mensaje'] == ""){
  21.     echo "Rellena los campos en blanco.";
  22.     }else{
  23.     $_POST[mensaje] = strip_tags($_POST['mensaje']);
  24.     mysqli_query($conexion, "INSERT INTO comentarios(Id,Id_Comentarios,Autor,Comentario,Fecha,Ip) VALUES ('', '$_GET[noticia]', '$_POST[nombre]', '$_POST[mensaje]', NOW(), '$_SERVER[REMOTE_ADDR]')");
  25.     echo "<script>setTimeout(document.location.reload(),1);</script>";
  26.     }}}
  27. }
  28. echo "</font>";
  29. ?>
  30.  
  31. <form action="" method="post">
  32.   <input name="nombre"><br>
  33.   <textarea name="mensaje" rows="6" cols="37"></textarea><br>
  34.   <input name="enviar" type="submit">
  35. </form>

Conectar.php
Código PHP:
Ver original
  1. <?php
  2. $conexion = mysqli_connect(".............","..............",".................");
  3. mysqli_select_db($conexion, "............");
  4. ?>

Index.php
Código PHP:
Ver original
  1. <?php
  2. include ("conectar.php");
  3. ?>
  4. <?php
  5. // Verifica si el usuario y la contraseña es correcta //
  6. if(isset($_POST['enviar'])){
  7.     $nombre = "admin"; // Cambia aqui el nombre
  8.     $contraseña = "admin"; // Cambia aqui la contraseña
  9.     if($_POST['nombre'] == $nombre AND $_POST['contraseña'] == $contraseña){
  10.     setcookie("nombre","caca");
  11.     header('Location: index.php');
  12.     }else{
  13.     echo "La contraseña no es correcta";
  14.     }
  15. }
  16. ?>
  17. <?php
  18. // Crea la noticia y te desconecta //
  19. if($_COOKIE['nombre']){
  20.     if(isset($_POST['enviando'])){
  21. echo "<font color='red'>";
  22.         if(strlen($_POST['titulo']) <= "5"){
  23.         echo "El titulo debe tener como minimo 6 caracteres<br>";
  24.         }else{
  25.         if(strlen($_POST['contenido']) <= "19"){
  26.         echo "El contenido tiene que tener como minimo 20 caracteres<br>";
  27.         }else{
  28.         if($_POST['titulo'] == "" | $_POST['contenido'] == ""){
  29.         echo "Rellena todos los campos en blanco<br>";
  30.         }else{
  31.         mysqli_query($conexion, "INSERT INTO noticias(Id,Titulo,Contenido,Categoria,Fecha,Ip) VALUES ('', '$_POST[titulo]', '$_POST[contenido]', '$_POST[categoria]', NOW(), '$_SERVER[REMOTE_ADDR]')");
  32.         echo "<font color='green'>Noticia generada con exito</font><br>";
  33.         }}}
  34. echo "</font>";
  35.     }
  36.     if(isset($_POST['desconectar'])){
  37.     setcookie("nombre");
  38.     header('Location: index.php');
  39.     }
  40. ?>
  41.  
  42. <form action="" method="post">
  43.   Titulo: <input name="titulo"><br>
  44.   Contenido: <br> <textarea name="contenido" rows="6" cols="37"></textarea><br>
  45.   Categoria: <select name="categoria"><option>Futbol<option>Baloncesto</option></select><br>
  46.   <input name="enviando" type="submit" value="Publicar noticia">
  47. </form>
  48.  
  49. <form action="" method="post">
  50. <input name="desconectar" type="submit" value="Desconectar">
  51. </form>
  52.  
  53. <?php
  54. // Lo que sale si no estas registrado //
  55. }else{
  56. echo '
  57. <form action="" method="post">
  58.  Nombre: <input name="nombre"><br>
  59.  Contraseña: <input name="contraseña"><br>
  60.  <input name="enviar" type="submit">
  61. </form>
  62. <a href="noticias.php">Ver noticias</a>';
  63. }
  64. ?>

Noticias.php
Código PHP:
Ver original
  1. <?php
  2. include ("conectar.php");
  3. ?>
  4. <?php
  5. $noticias = mysqli_query($conexion, "SELECT Categoria FROM noticias");
  6.  
  7. if($_GET['noticia'] <> ""){
  8.     $noticia = mysqli_query($conexion, "SELECT Titulo,Contenido,Fecha FROM noticias WHERE Id = '$_GET[noticia]'");
  9.     if($not = mysqli_fetch_array($noticia)){
  10.     echo "<b>$not[Titulo]</b> $not[Fecha]<br><br> <div style='word-wrap:break-word; width:500px;'>$not[Contenido]<br></div>";
  11.     include ("comentarios.php");
  12.     }else{
  13.     echo "La noticia no existe.";
  14.     }
  15. }elseif($_GET['categoria'] == ""){
  16.     echo "¿De que te gustan las notcias? <br>";
  17.     if($not = mysqli_fetch_array($noticias)){
  18.     $noticia = mysqli_query($conexion, "SELECT DISTINCT Categoria FROM noticias");
  19.     while($not = mysqli_fetch_array($noticia)){
  20.     echo "<br> <a href='?categoria=$not[Categoria]'>$not[Categoria]</a>";
  21.     }}
  22. }elseif($_GET['categoria'] <> "'"){
  23.     $noticias = mysqli_query($conexion, "SELECT * FROM noticias WHERE Categoria = '$_GET[categoria]'");
  24.     echo "Aqui estan todas las noticias de <b>$_GET[categoria]</b>";
  25.     while($not = mysqli_fetch_array($noticias)){
  26.     echo "<br><a href='?noticia=$not[Id]'>$not[Titulo]</a>";
  27.     }
  28. }else{
  29.     mysqli_query($conexion, "INSERT INTO ip(Ip) VALUES ('$_SERVER[REMOTE_ADDR]')");
  30. }
  31. ?>

Última edición por PepeF; 16/08/2012 a las 18:10
  #2 (permalink)  
Antiguo 16/08/2012, 18:20
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 14 años
Puntos: 155
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI [APORTE]

Muy buen aporte
  #3 (permalink)  
Antiguo 17/08/2012, 01:25
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI [APORTE]

A simple vista:

Al ver una noticia en concreto, realizas dos conexiones a la bbdd... cuando con una seria suficiente!

Es decir, haces un include("conectar.php") en "Noticias.php", y después, con el include("comentarios.php") estás haciendo otro include("conectar.php")... cosa que no sería necesaria ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 17/08/2012, 02:13
 
Fecha de Ingreso: julio-2012
Mensajes: 276
Antigüedad: 11 años, 8 meses
Puntos: 27
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI [APORTE]

uy no me di cuenta. Pues el de comentarios.php se podria quitar.
  #5 (permalink)  
Antiguo 17/08/2012, 17:36
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Y sigues con problemas de seguridad, incluyendo info de $_GET y $_POST directamente en la consulta.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 17/08/2012, 17:37
 
Fecha de Ingreso: agosto-2012
Ubicación: Santiago
Mensajes: 124
Antigüedad: 11 años, 8 meses
Puntos: 60
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Cita:
Iniciado por Triby Ver Mensaje
Y sigues con problemas de seguridad, incluyendo info de $_GET y $_POST directamente en la consulta.
es porque mysqli es mejor que mysql y eso es mejor y no necesito pq es mysqli es mejor
__________________
~~Aprendiendo.
Become a Programmer, Moth*rf*cker
  #7 (permalink)  
Antiguo 17/08/2012, 17:53
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Carloosolrac, hoy estás de buen humor, cierto?

Mínimo hay que revisar un poco esto: http://www.php.net/mysqli_real_escape_string
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 18/08/2012, 04:28
 
Fecha de Ingreso: julio-2012
Mensajes: 276
Antigüedad: 11 años, 8 meses
Puntos: 27
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

mysqli_real_escape_string Esto que hace?
  #9 (permalink)  
Antiguo 18/08/2012, 12:15
 
Fecha de Ingreso: agosto-2012
Ubicación: Santiago
Mensajes: 124
Antigüedad: 11 años, 8 meses
Puntos: 60
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Cita:
Escapa los caracteres especiales de una cadena para usarla en una sentencia SQL, tomando en cuenta el conjunto de caracteres actual de la conexión
__________________
~~Aprendiendo.
Become a Programmer, Moth*rf*cker
  #10 (permalink)  
Antiguo 18/08/2012, 22:06
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Cita:
Iniciado por PepeF
mysqli_real_escape_string Esto que hace?
Te permite incluir caracteres dentro de un campo que, de otra forma, generarían error en la consulta o permitirían a otros usuarios abusar de la falta de seguridad de tu script, por ejemplo, supongamos que tu consulta es:

INSERT INTO usuarios SET nombre = '$nombre'

Sin mysqli_real_escape_string y con los siguientes valores para $nombre:

"James O'Neal" - La comilla simple generará un error de sintáxis... por cadena no terminada
"Triby'; UPDATE usuarios SET admin = 1 WHERE nombre = 'Triby'; '" - Se inserta el usuario y, de paso, obtiene permisos de administrador... claro, tus tablas pueden tener otra estructura, pero es sólo un ejemplo para que veas la fragilidad de un script sin esta pequeña función.
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 22/08/2012, 06:02
 
Fecha de Ingreso: julio-2012
Mensajes: 276
Antigüedad: 11 años, 8 meses
Puntos: 27
Respuesta: [APORTE] Sistema de Noticias y Comentarios Con MYSQLI

Muchas gracias para la proxima vez lo pondre.

Etiquetas: mysql, mysql+db, mysqli, mysqli+db, php+formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 21:11.