epelpad

Como hacer un Sistema de Noticias con PHP y MySQL

En este tutorial desarrollaremos un sistema de noticias (tipo blog) que puede ser implementado en cualquier proyecto web en el que estéis trabajando. Este sistema incluye un archivo para mostrar las noticias, otro para añadir una nueva noticia, otro para modificarla y, por último, uno para eliminarlas

Paso 1.

Creamos la tabla en la base de datos. Copia, pega y ejecuta el siguiente código SQL:


CREATE TABLE `noticias` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`titulo`  varchar(100) NOT NULL ,
`fecha`  datetime NOT NULL ,
`texto`  text NOT NULL ,
PRIMARY KEY (`id`)
)


Paso 2.

Creamos el archivo de conexión con la base de datos.


<?php
// Realizamos la conexión con la base de datos
 
$db_host "";                    // Servidor donde está alojada la base de datos
$db_name "";                    // Nombre de la base de datos
$db_user "";                    // Usuario de la base de datos
$db_password "";                // Contraseña de la base de datos
$db_table "noticias";           // Nombre de la tabla de la base de datos
$conexion mysql_connect($db_host$db_user$db_password) or die("No se ha podido realizar la conexión con la base de datos. Error: ".mysql_error());
mysql_select_db($db_name$conexion);
 
?>


Paso 3.

Ahora vamos a crear el archivo que incluya todas las noticias. Este consta de dos partes. Mediante una condicional (if) haremos que muestre una noticia según la id que recibe por medio de GET. Si no GET no recibe ningún valor, se muestran todas las noticias. Para entenderlo mejor, veamos el código.


<?php
include("conexion.php"); // Incluimos nuestro archivo de conexión con la base de datos
 
if(isset($_GET['noticia']))
{
    if(!empty(
$_GET['noticia'])) // Si el valor de "noticia" no es NULL, continua con el proceso
    
{
        
$id_noticia = (int) mysql_real_escape_string($_GET['noticia']);
        
$query_noticias mysql_query("SELECT titulo, fecha, texto FROM ".$db_table." WHERE id = '".$id_noticia."' LIMIT 1"); // Ejecutamos la consulta
        
if(mysql_num_rows($query_noticias) > 0// Si existe la noticia, la muestra
        
{
            while(
$columna mysql_fetch_assoc($query_noticias)) // Realizamos un bucle que muestre todas las noticias, utilizando while.
            
{
                echo 
'
                <table>
                    <tr>
                        <td>'
.$columna['titulo'].'</td>
                        <td>'
.$columna['fecha'].'</td>
                    </tr>
                    <tr>
                        <td colspan="2">'
.$columna['texto'].'</td>
                    </tr>
                    <tr>
                        <td><a href="./">Atrás</a></td>
                    </tr>
                </table>
                '
;
            }
        }
        else
        {
            echo 
'La noticia que solicitas, no existe.'// Si no, muestra un error
        
}
    }
    else
    {
        echo 
'Debes seleccionar una noticia.'// Si GET no recibe ningún valor, muestra un error
    
}
}
else
{
    
$query_noticias mysql_query("SELECT * FROM ".$db_table.""); // Ejecutamos la consulta
    
$limite 100// Número de carácteres a mostrar antes de el "Leer más"
    
while($columna mysql_fetch_assoc($query_noticias)) // Realizamos un bucle que muestre todas las noticias, utilizando while.
    
{
        echo 
'
        <table>
            <tr>
                <td>'
.$columna['titulo'].'</td>
                <td>'
.$columna['fecha'].'</td>
            </tr>
            <tr>
                <td colspan="2">'
.substr($columna['texto'], 0$limite).' [...]</td> <!-- Utilizamos la función substr para mostrar un determinado número de carácteres. Ver Ver http://www.php.net/manual/es/function.substr.php -->
            </tr>
            <tr>
                <td colspan="2"><a href="?noticia='
.$columna['id'].'">Leer más</a></td> <!-- Incluimos un enlace para leer la noticia entera -->
            </tr>
        </table>
        '
;
    }
}
?>



Paso 4.

Ahora tenemos que crear los archivos que añadan, modifiquen y eliminen las noticias. Dejo los respectivos códigos:


nueva_noticia.php:

Con este archivo lo que hacemos es, mediante INSERT de SQL, insertar un nuevo registro en la base de datos que contendrá la noticia.


<?php
include("conexion.php"); // Incluimos nuestro archivo de conexión con la base de datos
 
if(isset($_POST['añadir'])) // Si el boton de "añadir" fué presionado ejecuta el resto del código
{
    
$titulo mysql_real_escape_string($_POST['titulo']); // Recibimos el valor del <input name="titulo"...
    
$texto mysql_real_escape_string($_POST['texto']);   // Recibimos el valor de la <textarea name="titulo"...
    
if(!empty($titulo) && !empty($texto)) // Comprobamos que los valores recibidos no son NULL
    
{
        
$query_NuevaNoticia mysql_query("INSERT INTO ".$db_table." SET titulo = '".$titulo."', fecha = NOW(),texto = '".$texto."'"); // Realizamos una consulta a la base de datos para insertar la nueva notica
 
        
if($query_NuevaNoticia)
        {
            echo 
'La noticia se añadió correctamente a la base de datos.'// Si el registro (la noticia) se insertó en la base de datos, mostramos este mensaje
        
}
        else
        {
            echo 
'La noticia no pudo ser insertada en la base de datos'// Si el registro (la noticia) no se insertó en la base de datos, mostramos este mensaje
        
}
    }
    else
    {
        echo 
'Los campos no pueden estar vacios. Rellénalos para insertar la noticia en la base de datos'// Si los valores recibidos por los campos de texto están vacios, no inserta el registro y muestra este mensaje
    
}
}
 
?>
 
<form action="nueva_noticia.php" method="post"> <!-- Creamos el formulario, utilizando la etiqueta form, cuyo atributo action="" indicará donde se procesará el formulario -->
    Título de la noticia: <input name="titulo" type="text" /> <br />
    Texto de la noticia:  <textarea name="texto"></textarea> <br />
    <input type="submit" name="añadir" value="Añadir noticia" />
</form>



modificar_noticia.php:

Para modificar una noticia utilizaremos este archivo, que hace uso de UPDATE para actualizar un registro.


<?php
include("conexion.php"); // Incluimos nuestro archivo de conexión con la base de datos
 
$query_MostrarTitulos mysql_query("SELECT id, titulo, fecha FROM ".$db_table.""); // Ejecutamos la consulta
 
while($columna_MostrarTitulos mysql_fetch_assoc($query_MostrarTitulos)) // Realizamos un bucle que muestre todas las noticias, utilizando while.
{
    echo 
'<a href="?noticia='.$columna_MostrarTitulos['id'].'">'.$columna_MostrarTitulos['titulo'].' / '.$columna_MostrarTitulos['fecha'].'</a> <br />';   // Mostramos un enlace para modificar cada noticia
}
 
if(isset(
$_POST['modificar'])) // Si el boton de "modificar" fúe presionado ejecuta el resto del código
{
    
$id = (int) mysql_real_escape_string($_POST['id']);
    
$titulo mysql_real_escape_string($_POST['titulo']);
    
$texto mysql_real_escape_string($_POST['texto']);
 
    
$query_modificar mysql_query("UPDATE ".$db_table." SET titulo = '".$titulo."', fecha = NOW(), texto = '".$texto."' WHERE id = '".$id."'"); // Ejecutamos la consulta para actualizar el registro en la base de datos
 
    
if($query_modificar)
    {
        echo 
'La noticia se modificó corectamente'// Si la consulta se ejecutó bien, muestra este mensaje
    
}
    else
    {
        echo 
'La noticia no se modificó'// Si la consulta no se ejecutó bien, muestra este mensaje
    
}
}
 
if(isset(
$_GET['noticia']))
{
    
$id_noticia = (int) mysql_real_escape_string($_GET['noticia']); // Recibimos el id de la noticia por medio de GET
    
$query_NoticiaCompleta mysql_query("SELECT id, titulo, texto FROM ".$db_table." WHERE id = '".$id_noticia."' LIMIT 1"); // Ejecutamos la consulta
    
$columna_MostrarNoticia mysql_fetch_assoc($query_NoticiaCompleta);
    echo 
'
    <form action="modificar_noticia.php" method="post"> <!-- Creamos el formulario, utilizando la etiqueta form, cuyo atributo action="" indicará donde se procesará el formulario -->
        Título de la noticia: <input name="titulo" type="text" value="'
.$columna_MostrarNoticia['titulo'].'" /> <br />
        Texto de la noticia:  <textarea name="texto">'
.$columna_MostrarNoticia['texto'].'</textarea> <br />
 
        <input type="hidden" name="id" value="'
.$columna_MostrarNoticia['id'].'" /> <!-- Creamos un campo de texto oculto para pasar el id de la noticia -->
        <input type="submit" name="modificar" value="Modificar noticia" />
    </form>
    '
;
}
?>


eliminar_noticia.php:

Este archivo lo utilizaremos para eliminar una noticia de la base de datos, utilizando DELETE.


<?php
include("conexion.php"); // Incluimos nuestro archivo de conexión con la base de datos
 
$query_MostrarTitulos mysql_query("SELECT id, titulo, fecha FROM ".$db_table.""); // Ejecutamos la consulta
 
while($columna_MostrarTitulos mysql_fetch_assoc($query_MostrarTitulos)) // Realizamos un bucle que muestre los títulos de las noticias, utilizando while.
{
    echo 
$columna_MostrarTitulos['titulo'].' - <a href="?noticia='.$columna_MostrarTitulos['id'].'">Eliminar</a> <br />';  // Mostramos el titulo y un enlace para eliminar la noticia
}
 
if(isset(
$_GET['noticia']))
{
    
$id = (int) mysql_real_escape_string($_GET['noticia']);
 
    
$query_eliminar mysql_query("DELETE FROM ".$db_table." WHERE id = '".$id."'"); // Ejecutamos la consulta para eliminar el registro de la base de datos
 
    
if($query_eliminar)
    {
        echo 
'La noticia se eliminó corectamente'// Si la consulta se ejecutó bien, muestra este mensaje
    
}
    else
    {
        echo 
'La noticia no se eliminó'// Si la consulta no se ejecutó bien, muestra este mensaje
    
}
}
?>


estilos.css

Esta parte es opcional, es solo para añadirle un poco de CSS:


body {
background-color: #D7D8DA;
font-family:Georgia, "Times New Roman", Times, serif;
}
 
a, a:visited { color: #5D5E60; text-decoration:none; }
a:hover { text-decoration: underline; }
 
#menu {
background-color: #DCDCDC;
border:1px solid #A7A7A7;
width: 260px;
margin: auto;
padding: 10px;
margin-bottom: 10px;
border-radius: 4px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
#menu a{
color: #434444;
text-decoration:none;
}
#menu a:hover{
text-decoration: underline;
}
 
#contenido {
background-color: #B7B9C0;
width: 900px;
margin: auto;
padding: 20px;
border-radius: 4px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}




aclaro, el estilo no esta bien trabajado esta echo muy básico, recomiendo que prueben con un servidor local " localhost "
cualquier problema no duden en consultar esto es un sistema básico que se necesita en cualquier web

34 comentarios - Como hacer un Sistema de Noticias con PHP y MySQL

FrancoSpam +1
La verdad sencillo pero eficaz! Muchas gracias por compartir!
manuel1240
anoche me descarge uno igual hehe
calimio6
que bueno me sirvio de a mucho y funciona perfecto +10
Majestik21 +1
HOLA QUE TAL... MUY BUENO EL CÓDIGO... LES COMPARTO... LA PARTE DE COMO "CACHAR U OBTENER LAS VARIABLES PARA PODER VER LA NOTICIA COMPLETA


<!DOCTYPE html>
<html>
<head>
</head>
<body>
<?php
$id= isset($_GET['id']) ? $_GET['id'] : NULL; //DECLARACIÓN DE VARIABLE ID...
require("conexion.php"; //CONEXION A LA BASE DE DATOS
$instruccion=mysql_query("select * from noticias WHERE id='".$id."'";//SELECCIONAMOS NUESTRA TABLA Y VARIABLE EN ESTE CASO SERIA NUESTRA ID
while ($f=mysql_fetch_array($instruccion)){
?>
<!-- EN ESTA PARTE LA PUEDEN HACER COMO GUSTEN.. APLICAR LOS STYLES.. Y LAS POSICIONES EN LA QUE QUIEREN Q SU TEXTO APAREZCA-->
<f1><label for="id" >No.: </label><!--ESTA PARTE NO ES NECESARIA. SOLO LO USE PARA DAR REFERENCIA-->
<f2><?PHP echo $f['id']; ?><br></f2><!-- AQUI LLAMO LA VARIABLE ID. ME TIENE Q MOSTRAR EL NUMERO DE NOTICIA 1, 2 ,3 DEPENDIENDO CUAL QUIEREN VER-->


<f1><label for="titulo">titulo</label></f1><!--ESTA PARTE NO ES NECESARIA. SOLO LO USE PARA DAR REFERENCIA-->
<f2><?PHP echo $f['titulo']; ?></f2><br><!--MANDAMOS A LLAMAR LA VARIABLE TITULO, LA CUAL MOSTRARA EL TITULO DE NUESTRA NOTICIA-->

<f1><label for="texto">texto</label></f1><!--ESTA PARTE NO ES NECESARIA. SOLO LO USE PARA DAR REFERENCIA-->
<f2><?PHP echo $f['texto']; ?></f2><!--EL CONTENIDO DE NUESTRA NOTICIA-->
<?Php //CERRAMOS NUESTRO CORCHETE DE ESTA FORMA
} //CORCHETE
?> <!-- Y LISTO... -->
</body>
</html>




ESPERO LES SIRVA COMO AYUDA...
Y GRACIAS @bladwer POR CONTRIBUIR CON SU SABIDURÍA
Temporalito -6
sin dudas los programadores de PHP son los mas malos e ignorantes del sector
bladwer
@CrapTank es simple no sabe !
Temporalito -2
@bladwer
no tengo que demostrarle nada a ustedes, simplemente he mencionado porque los programadores PHP son los mas malos de todos, y bladwer le ha dado en el clavo, el cree que omitiendo esos puntos que he mencionado en su codigo hara de este mas facil de entender a los rookies, pero el problema es que esos puntos que omite son esenciales, no puede obviarse, es como NO enseñarle a un cirujano que antes de una operacion debe lavarse bien las manos
Norant2011
@Temporalito mysql_real_escape_string es una función de sanitización.
papuchyn +3
La gente como Temporalito, me da risa, desdeñan desde que entran porque necesitan desdeñar para sentirse que estan vivos, lo cual quiere decir que de eso estan hechos, de desdeño y de egoismo puro y de "porque no estudian como yo en una Universidad Privada", por eso es que el dice "no tenog nada que demostrarles "a ustedes" Osea ? que hace aca? repito, "si no desdeña no vive" por eso viene a buscar los que considera inferiores, pobrecito, el inferior es el, que habiendo aprendido tanto en alguna Universidad, cree que el nada mas es el unico que ha estudiado.... ji ji jiiii Que demuestre que sabe , porque gente que desdeña aca no sirve... y si insiste BOTENLO... o acaso aporta algo bueno ?? LO QUE HACE ES PONERSE A DECIR "ESTO ESTA MAL ESTO TAMBIEN Y AQUELLO " pero no da las soluciones porque? porque es egoista y desdeñoso y porque no quiere tomarse el tiempo... en cambio EL QUE PUSO EL TUTORIAL SI SE DIO EL TIEMPO, ASI QUE DEBERIAMOS CONVERSAR MAS CON EL Y NO CON ESTE CASI TRISTEMENTE CELEBRE "TEMPORALITO" YO ME DECIDO A VOTAR POR QUE LO BOTEN DE UNA VEZ !!!!!!!!!! Y estoy agradecido con el que publico este excelente Post, no digo que sea la ultima chupada del mango, digo que uno comprueba, analiza y va aprendiendo mas y mas y luego va perfeccinando su experiencia y aprendizaje nadie te da TODO LISTO HECHO Y PERFECTO, no cierto Temporalito?????
SoyBillGatesBack
Tampoco mando cualquiera, es decir, hay muchos programadores PHP que son malisimos, pero hay otros que la tienen clara y hacen las cosas prolijas. En Wordpress, por ejemplo, tienen todo el testamento de codigo PHP en un archivo aparte del HTML... etc... En este caso, como es algo "pequeño" no veo necesidad de hacer esto.
walter_ahumada
Hola amigo, sabes que hice todo como esta y quedo funcionando de 10! El único problema es que las noticias nuevas me las tira abajo, cuando tendrían que ir arriba e ir desplazando las mas antiguas. Te pido por favor que me des una mano. Gracias
bladwer
[code]

<?php
include("conexion.php"; // Incluimos nuestro archivo de conexión con la base de datos

if(isset($_GET['noticia']))
{
if(!empty($_GET['noticia'])) // Si el valor de "noticia" no es NULL, continua con el proceso
{
$id_noticia = (int) mysql_real_escape_string($_GET['noticia']);
$query_noticias = mysql_query("SELECT titulo, fecha, texto FROM ".$db_table." WHERE id = '".$id_noticia."' LIMIT 1"; // Ejecutamos la consulta
if(mysql_num_rows($quer
bladwer
te lo paso por MP porque me parece que sale mal el comentario
walter_ahumada
Lo hice tal cual me lo dices aqui y me da este error: Parse error: syntax error, unexpected ';' in /home3/morado/public_html/noticias.php on line 40

Luego le quite la ; y me da este error Parse error: syntax error, unexpected T_VARIABLE in /home3/morado/public_html/noticias.php on line 41

La verdad ya no se que cambiar. Ayuda por favor!!
bladwer
@walter_ahumada pasame tu mail o facebook y te paso el archivo completo por correo
johancontrerasco
me sale ste error y noo entiendo por que
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:xampphtdocsmedia_animeelimi.php on line 6
respuesta por fa
bladwer
estas usando localhost o en un servidor online?
xinoterbg
esta muy bien pero tengo un error puse para que se muestren las noticias en el index pero al intentar hacer que solo se muestren X me da error es decir en el query...
$query_noticias = mysql_query("SELECT * FROM ".$db_table." order by DESC limit 4"; //
Ejecutamos la consulta
bladwer
agregame al facebook y te ayudo
xinoterbg
@bladwer dimele, aunque en realidad ya lo consegui pero ahora me da otro error (
javo_capo
men la verdad eta buenisimo sigue asi oye me interesaria saber como hace run top 5
GMUU
como le agrego una imagen ??? osea imagen a la izquiera descripcion a la derecha
GMUU
@bladwer sii !! vengo buscando eso exactamente hace mil! ,gracias!
matias22rhcp
@bladwer Hola, quiero ver el link pero me lleva a otro post...podrias pasarme el mismo o si tienes los scripts? saludos!
bladwer
@matias22rhcp hablame por MP porque no lo tengo publicado el otro script mas actualizado
fernandolondono3 +1
buen día quisiera saber para que se utiliza mysql_real_escape_string, ya probé y funciono bien todo pero algunos términos son nuevos para mi.
JonathanMedina0
funca sin errores? estoy cansado de los codigos mal escritos , y no tengo ganas de probar este al pedo ...
bladwer
probalo a muchos usuarios le fue de 10 y algunos tuvieron problemas
JonathanMedina0
@bladwer tuve problemas xD
Norant2011 +1
PHP como lenguaje es muy permisible, tanto que un mal uso puede acarrear imprudencias al momento de desarrollar una aplicación tipo esta de Administración de Noticias, el post es bueno para aprender, pero si lo haces comercial, no es recomendable, si lo es usar un ORM tipo doctrine o PDO para conectarse a la base de datos, evitar XSS, Sqlinjection, Blind Sql, truncate db, usar regenerador de sesion, validar las imagenes por los tipos mime, lista blanca de extensiones permitidas, peso, renombrar el archivo, mysql_connect ha sido desaconsejado por PHP.NET, entre otras medidas que hará que desarrollemos en serio, sé un desarrollador PHP muy preocupado por la optimización, la seguridad, usa Programación Orientada a Objetos, Patrones de Diseño, hazlo como si alguien a quien temes mantendrá tu código luego, usa Git, documenta tu código.

Saludos a todos.
GeovannyOrellana
Si tienen razón sobre el PDO, pero para comenzar esta bueno este script de noticias.
Yo prefiero PDO, pero si algunos no pueden usarlo, les recomiendo aprender.
Y buen post
YonierEspinosa +1
Gracias men!, esto es lo que estaba buscando desde hace mucho. Muy buenisimo post!, esta muy completo, muchas Gracias!.

Saludos. 1+
Dhescargare
De antemano gracias, funciona 99% bien; sera posible corregir el error de las noticias(si me lo explicas aunque sea un poquito), se publican pero la noticia principal queda por abajo, [email protected]
DientedeDragon +1
Bueno, los que critican y me refiero a quienes lo hacen sanamente y en onda de ayudar, por qué no hacen un tutorial, modificando el script aportado acá por Bladwer, incluyendo todo lo relacionado a PDO y seguridad.

De veras lo agradecería mucho!

A todo esto, sugiero separar las cosas, o sea, hacer un backend o sistema de gestión de contenidos aparte incluyendo los documentos php que sirven para publicar-modificar-borrar noticias, con acceso de login. Y luego, en el front-end el documento que sirve para mostrar cada noticia. Es lo que estoy haciendo y queda de lo más bien.

Saludos,

Ricardo
DientedeDragon
@bladwer Ya modifiqué todo e introduje una serie de mejoras. Quien quiera el script, que me envíe un correo a [email protected] Saludos!
bladwer
@DientedeDragon pasamelo a mi asi lo miro como quedo
DientedeDragon
@bladwer Dame tu casilla
DientedeDragon
Ya lo enchulé y hasta le agregué la alternativa de foto y generar miniatura desde el administrador de contenidos.

Escríbeme a mi casilla [email protected] y te mando tu script enchulado
Dhescargare +1
$query_noticias = mysql_query("SELECT * FROM ".$db_table." ORDER BY id DESC "; // Ejecutamos la consulta

Le puse el order by id desc y me publica las publica bien
enriquejmarrerom
Hola amigo te haz planteado actualizarlo a mysqli ??
bladwer +1
si . tengo echa la actualización. y agregue muchísimas funciones y mejore el tema de seguridad
enriquejmarrerom
@bladwer Y me lo podrias pasar ? No es para nada que me beneficie monetariamente es solo para aprender... xd Estoy empezando en esto de php
DavidValdezlopez +1
@bladwer buenas tardes y si quisiera acomodar las noticias de la mas recientes a la ultima como seria?
leo640
Buen post, te voy a seguir, por el momento estoy aprendiendo php y mysql , espero conseguir laburo de eso
leo640
@bladwer Donde lo encuentro?
bladwer +1
@leo640 no lo publique, pero cuando estés desarrollando un sist asi te puedo ayudar con cosas nuevas
leo640
@bladwer Dale, todavia estoy aprendiendo, mi idea es hacer una tienda online, por lo que veo me falta mucho
basic5
necesito un sisterma de comentarios sencillo que comenten cada articulo o noticia..
dramye01
que tal amigo empiezo en el mundo de la programacion me gustaria saber como incluir los css que dejaste y tambien a la hora de subir una nueva noticia como poder incluir una imagen gracias espero una respuesta grata