Foros del Web » Programando para Internet » PHP »

Sistema de noticias + comentarios + paginacion en PDO

Estas en el tema de Sistema de noticias + comentarios + paginacion en PDO en el foro de PHP en Foros del Web. Aqui os traigo este sistema de noticias + comentarios + paginacion realizado en PDO DB @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original -- -- Estructura de ...
  #1 (permalink)  
Antiguo 13/09/2013, 09:36
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Sistema de noticias + comentarios + paginacion en PDO

Aqui os traigo este sistema de noticias + comentarios + paginacion realizado en PDO

DB
Código SQL:
Ver original
  1. --
  2. -- Estructura de tabla para la tabla `comments`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `comments` (
  6.   `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  7.   `id_news` text NOT NULL,
  8.   `user` VARCHAR(20) NOT NULL,
  9.   `comments` text NOT NULL,
  10.   `date` VARCHAR(19) NOT NULL,
  11.   `ip` VARCHAR(10) NOT NULL,
  12.   PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).
  14.  
  15.  
  16. -- --------------------------------------------------------
  17.  
  18. --
  19. -- Estructura de tabla para la tabla `news`
  20. --
  21.  
  22. CREATE TABLE IF NOT EXISTS `news` (
  23.   `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  24.   `user` VARCHAR(20) NOT NULL,
  25.   `title` text NOT NULL,
  26.   `content` text NOT NULL,
  27.   `date` VARCHAR(19) NOT NULL,
  28.   `ip` VARCHAR(10) NOT NULL,
  29.   PRIMARY KEY (`id`)
  30. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).
  31.  
  32.  
  33. -- --------------------------------------------------------
  34.  
  35. --
  36. -- Estructura de tabla para la tabla `user`
  37. --
  38.  
  39. CREATE TABLE IF NOT EXISTS `user` (
  40.   `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  41.   `username` VARCHAR(20) NOT NULL,
  42.   `password` VARCHAR(60) NOT NULL,
  43.   `date` VARCHAR(19) NOT NULL,
  44.   `ip` VARCHAR(10) NOT NULL,
  45.   PRIMARY KEY (`id`),
  46.   UNIQUE KEY `id` (`id`),
  47.   KEY `id_2` (`id`)
  48. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).

/config/index.php
Código PHP:
<?php
    $connection 
= new PDO("mysql:host=localhost;dbname=base de dato","usuario","contraseña");
    
$connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
?>
Index.php
Código PHP:
<?php
session_start
();
require(
'/config/index.php');
if(isset(
$_SESSION['username'])):
    if(isset(
$_POST['news'])):
        if(empty(
$_POST['title']) || empty($_POST['content'])):
            echo 
'Hay campos en blanco';
        else:
            
$title $connection->prepare("SELECT title FROM news WHERE title = :title");
            
$title->bindParam(':title',$_POST['title']);
            
$title->execute();
            if(
$title->fetchColumn() == $_POST['title']):
                echo 
'Existe una noticia con el mismo titulo';
            else:
                
$news $connection->prepare("INSERT INTO news(id,user,title,content,date,ip) VALUES ('', '".$_SESSION['username']."', :title, :content, '".date('H:i:s d/m/Y')."', :ip)");
                
$news->bindParam(':title',$_POST['title']);
                
$news->bindParam(':content',$_POST['content']);
                
$news->bindParam(':ip',$_SERVER['REMOTE_ADDR']);
                
$news->execute();
                    echo 
'Noticia creada correctamente';
            endif;
        endif;
    endif;
    echo 
'<form action="" method="post">
    <input name="title" placeholder="Titulo de la noticia"><br>
    <textarea name="content" placeholder="Contenido de la noticia" rows="10" cols="40"></textarea><br>
    <input name="news" type="submit" value="Crear noticia">
</form>
<a href="/news.php">Noticias</a> | <a href="/logout.php">Logout</a>'
;
else:
    if(isset(
$_POST['login'])):
        if(empty(
$_POST['username']) || empty($_POST['password'])):
            echo 
'No dejes campos en blanco';
        elseif(
strlen($_POST['username']) > 20):
            echo 
'El usuario no puede tener mas de 20 caracteres';
        elseif(
strlen($_POST['password']) > 20):
            echo 
'La contraseña no puede tener mas de 20 caracteres';
        else:
            
$login $connection->prepare("SELECT username FROM user WHERE username = :username AND password = :password");
            
$login->bindParam(':username',$_POST['username']);
            
$login->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
            
$login->execute();
            if(
$login->fetchColumn() > 0):
                
$_SESSION['username'] = $_POST['username'];
                
header('Location: /');
                exit();
            else:
                echo 
'Datos incorrectos';
            endif;
        endif;
    endif;
    echo 
'<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="login" type="submit">
    </form>
    
    <a href="/register.php">Registrate</a>'
;
endif;
?>
Register.php
Código PHP:
<?php
session_start
();
require(
'/config/index.php');
if(isset(
$_SESSION['username'])):
    
header('Location: /');
    exit();
else:
    if(isset(
$_POST['register'])):
        if(empty(
$_POST['username']) || empty($_POST['password'])):
            echo 
'No dejes campos en blanco';
        elseif(
strlen($_POST['username']) > 20):
            echo 
'El usuario no puede tener mas de 20 caracteres';
        else:
            
$user $connection->prepare("SELECT username FROM user WHERE username = :username");
            
$user->bindParam(':username',$_POST['username']);
            
$user->execute();
            if(
$user->fetch(PDO::FETCH_ASSOC)):
                echo 
'El usuario ya existe';
            elseif(
strlen($_POST['password']) > 20):
                echo 
'La contraseña no puede tener mas de 20 caracteres';
            elseif(
$_POST['password'] <> $_POST['password2']):
                echo 
'Las contraseñas no coinciden';
            else:
                
$register $connection->prepare("INSERT INTO user(id,username,password,date,ip) VALUES ('', :username, :password, '".date('H:i:s d/m/Y')."', :ip)");
                
$register->bindParam(':username',$_POST['username']);
                
$register->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
                
$register->bindParam(':ip',$_SERVER['REMOTE_ADDR']);
                
$register->execute();
                    
$_SESSION['username'] = $_POST['username'];
                    
header('Location: /');
                    exit();
            endif;
        endif;
    endif;
    echo 
'<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="password2" placeholder="Vuelve a ingresar la contraseña"><br>
        <input name="register" type="submit">
    </form>'
;
endif;
?>
News.php
Código PHP:
<?php
session_start
();
require(
'/config/index.php');
if(isset(
$_GET['id'])):
    
$news $connection->prepare("SELECT user,title,content,date FROM news WHERE title = :title");
    
$news->bindParam(':title',urldecode($_GET['id']));
    
$news->execute();
    if(
$news1 $news->fetch(PDO::FETCH_ASSOC)):
        echo 
'<h1>'.$news1['title'].'</h1>'.$news1['content'].'<br> <strong>Autor:</strong> '.$news1['user'].' <strong>Fecha:</strong> '.$news1['date'].'<hr>';

            if(isset(
$_SESSION['username'])):
                if(isset(
$_POST['send'])):
                    if(empty(
$_POST['comments'])):
                        echo 
'No puedes dejar el comentario en blanco';
                    else:
                        
$comments $connection->prepare("INSERT INTO comments(id,id_news,user,comments,date,ip) VALUES ('', :id_news, '".$_SESSION['username']."', :comments, '".date('H:i:s d/m/Y')."', :ip)");
                        
$comments->bindParam(':id_news'urldecode($_GET['id']));
                        
$comments->bindParam(':comments'$_POST['comments']);
                        
$comments->bindParam(':ip'$_SERVER['REMOTE_ADDR']);
                        
$comments->execute();
                        
header('Location: /news.php?id='.urlencode($_GET['id']).'');
                        exit();
                    endif;
                endif;
                echo 
'
                <form action="" method="post">
                    <textarea name="comments" placeholder="Comentario" rows="10" cols="40"></textarea><br>
                    <input name="send" type="submit" value="Publicar comentario">
                </form>'
;
            else:
                echo 
'Para comentar tienes que iniciar session <br>';
            endif;

        
$comments $connection->prepare("SELECT user,comments,date FROM comments WHERE id_news = :id_news ORDER BY date DESC");
        
$comments->bindParam(':id_news',urldecode($_GET['id']));
        
$comments->execute();
        while(
$comments1 $comments->fetch(PDO::FETCH_ASSOC)):
            echo 
'<strong>Comentario escrito por:</strong> '.$comments1['user'].' <strong>Fecha:</strong> '.$comments1['date'].'<br>'.$comments1['comments'].'<br><br>';
        endwhile;

        
$comments $connection->prepare("SELECT COUNT(*) user,comments,date FROM comments WHERE id_news = :id_news");
        
$comments->bindParam(':id_news',urldecode($_GET['id']));
        
$comments->execute();
        if(
$comments->fetchColumn() == 0):
            echo 
'No hay comentarios';
        endif;
    else:
        echo 
'La noticia no existe';
    endif;
else:

    
$desde = @$_GET['pag'] * 10;
    
$hasta = (@$_GET['pag'] * 10) + 10;

    
$news $connection->prepare("SELECT id,title FROM news LIMIT $desde,$hasta");
    
$news->execute();
    while(
$news1 $news->fetch(PDO::FETCH_ASSOC)):
        echo 
'<h1><a href="/news.php?id='.urlencode($news1['title']).'">'.$news1['title'].'</a></h1>';
    endwhile;
    
    
$count_news $connection->query("SELECT COUNT(*) title FROM news")->fetch(PDO::FETCH_ASSOC);
    for(
$i 0$i round($count_news['title'] / 10 1); $i++):
        echo 
'<a href="/news.php?pag='.$i.'">'.$i.'</a>';
    endfor;
endif;
?>
Logout.php
Código PHP:
<?php
    session_start
();
    
session_destroy();
    
header('Location: /');
    exit();
?>
Si veis alguna forma de mejorar el codigo, comentalo porfavor.
  #2 (permalink)  
Antiguo 13/09/2013, 12:07
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Lo primero separa el codigo html del php.

Segundo introduce esto tal cual en el formulario donde introduces las noticias como si introducieras una noticia ya sea en el contenido de la noticia o el titulo ... ok <script>alert("protegete contra xss cross site scripting")</script> y la guardas y despues vas a la pagina que muestras las noticias y veras que sucede.
  #3 (permalink)  
Antiguo 13/09/2013, 12:59
Avatar de neorazorx  
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 8
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

¿Por qué no subes el código a github? Es más fácil de distribuir que pegarlo aquí.

http://www.github.com
  #4 (permalink)  
Antiguo 13/09/2013, 13:02
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Hola amigo justo ahora necesito hacer un miniframework con pdo, me va a servir de base

gracias!
  #5 (permalink)  
Antiguo 13/09/2013, 14:42
Avatar de CesarHC  
Fecha de Ingreso: junio-2011
Ubicación: localhost
Mensajes: 566
Antigüedad: 12 años, 10 meses
Puntos: 56
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Veo que usas el archivo index donde se encuentra la conexion en todos de mas archivos siendo necesario solo hacerlo en uno solo,lee sobre el patron MVC y sobre la seguridad lee este post, esta bueno como base para mejorar.
__________________
Solo la práctica no te traicionara ¡¡¡¡¡¡

Seguir el camino tu debes PHP The Right Way.
  #6 (permalink)  
Antiguo 13/09/2013, 18:24
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Como voy hacer el php sin juntarlo con html? Me di cuenta del xss cuando lo publique
  #7 (permalink)  
Antiguo 13/09/2013, 19:04
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Yo igual eatoy haciendo uno pero con mysqli, buen aporte
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #8 (permalink)  
Antiguo 14/09/2013, 03:19
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Pues recuerda filtrar las variables y como dice el usuario de arriba no juntes el php con el html aunque no se como se hara eso
  #9 (permalink)  
Antiguo 14/09/2013, 04:04
Avatar de neorazorx  
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 8
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Para separar el html hay que usar un motor de plantillas, yo recomiendo raintpl -> http://www.raintpl.com

Aquí tienes un ejemplo: https://github.com/NeoRazorX/kelinux-php
  #10 (permalink)  
Antiguo 14/09/2013, 05:07
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Yo he utilizado archivos tpl y sistema de plantillas, pero para un sistema de noticias simple no hace falta
  #11 (permalink)  
Antiguo 14/09/2013, 07:36
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

nO me refiero a ningun tipo de template tan solo a separar el codigo en el documento

Código PHP:
Ver original
  1. <?php
  2.  
  3. if(isset($_POST['username']))
  4. {
  5.  
  6. $salida = 'existe';
  7.  
  8. }else{
  9.  
  10. $salida = 'no existe';
  11.  
  12. }
  13.  
  14. ?>
  15.  
  16. // este seria el template del documento
  17. <html>
  18. <?php echo $salida; ?>
  19. </html>

como dijiste en el post que te dijieramos alguna forma de mejorarlo , pues esa es una , hace el codigo mas legible y ademas mas facil de mantener , ademas mezclarlo es una mala practica.
  #12 (permalink)  
Antiguo 14/09/2013, 07:59
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Muchisimas gracias, entonces por ejemplo en la zona de
Código PHP:
Ver original
  1. echo '
  2.                <form action="" method="post">
  3.                    <textarea name="comments" placeholder="Comentario" rows="10" cols="40"></textarea><br>
  4.                    <input name="send" type="submit" value="Publicar comentario">
  5.                </form>';

Seria mejor que lo guardaze en una variable y despues lo muestro en el html cierto? Muchisimas gracias
  #13 (permalink)  
Antiguo 14/09/2013, 08:31
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

bueno te dejo unos links que te va ayudar muchisimo

http://jacobo.tarrio.org/es/tech/php_claro

Cita:
http://desarrolladorsenior.blogspot....olador-en.html

Una buena regla general para determinar si la parte de la vista está suficientemente limpia de código es que debería contener una cantidad mínima de código PHP, la suficiente como para que un diseñador HTML sin conocimientos de PHP pueda entenderla. Las instrucciones más comunes en la parte de la vista suelen ser echo, if/else, foreach/endforeach y poco más. Además, no se deben incluir instrucciones PHP que generen etiquetas HTML.
ya se que para un simple sistema de comentarios no es necesario realizar tantos procesos pero es bueno , asi creamos , creas scripts con mas calidad y los que usen tu sistema u otro vayan adquiriendo buenas practicas

Última edición por webankenovi; 14/09/2013 a las 08:44
  #14 (permalink)  
Antiguo 04/12/2014, 08:26
Avatar de Dragon_Mandarin  
Fecha de Ingreso: marzo-2005
Ubicación: Santiago de Chile
Mensajes: 231
Antigüedad: 19 años, 1 mes
Puntos: 14
Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Tu script es muy interesante, me gustó. Lástima que cuando uno se sale del sistema, luego éste no deja ingresar.

Última edición por Dragon_Mandarin; 29/01/2015 a las 16:12
  #15 (permalink)  
Antiguo 30/01/2015, 15:42
Avatar de Dragon_Mandarin  
Fecha de Ingreso: marzo-2005
Ubicación: Santiago de Chile
Mensajes: 231
Antigüedad: 19 años, 1 mes
Puntos: 14
Pregunta Respuesta: Sistema de noticias + comentarios + paginacion en PDO

Habría sido interesante continuar con el desarrollo del script. Por mi parte, hice mejoras en lo que atañe al login. Separé los formularios, o sea, el html, del código mismo y funciona de lo más bien el publicar una noticia.

Saludos!

Ricardo

Última edición por Dragon_Mandarin; 02/02/2015 a las 07:42

Etiquetas: comentarios, mysql, paginacion, select, sistema, sql, tabla
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.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 16:54.