[TUTORIAL] Crear sistema de novedades/noticias del tipo pagina.php?id=

Efectivamente lo probé en el momento en que lo hice y funcionaba, de todos modos tengo pensado actualizar el tema modificando los códigos y añadiéndole alguna que otra cosa :D
Muchas gracias por el sistema, voy a integrarlo a un sitio web, espero no de problemas y funcione excelente.

Saludos cordiales.
Hola, estoy intentando crear una web basada en este sistema pero no hay forma de solucionar este error en los documentos comentarios.php y noticia.php. No se que es lo que pasa y no tengo mucho conocimiento de PHP por lo que no entiendo muy bien el error que me devuelve. Si pudierais ayudarme. Gracias

Warning: Cannot modify header information - headers already sent by (output started at C:\AppServ\www\wip\moderacion\comentarios.php:8) in C:\AppServ\www\wip\moderacion\comentarios.php on line 15
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\Temp\root\Noticias\noticias.php on line 20
Valla tiene muchos errores esto.. no he logrado echarlo a andar [:?]
Hola Buenos dias!

no puedo ver las imagenes para poder crear las tablas, ojala me puedas enviar las pantallas a mi correo gracias! [correo eliminado]

Saludos.
Soy nuevo en este foro y en lo que a desarrollo web se refiere, de todas formas, he utilizado el código que aparece al comienzo y como he visto que hay gente que dice que no funciona o faltan las BBDD, pues espero que al autor no le parezca mal, pero aquí va mi aportación y mi granito de arena, en principio use el código para aprender acerca de como hacer algo similar y ya que funciona, por si a alguien mas le vale de algo. La explicación esta dada en la primera página, me voy a limitar a solo copiar el código aquí, no se si es lo mas correcto, ante lo cual si esta mal, solo díganmelo y lo corregiré :D

Empezamos con la BBDD:

--
-- Estructura de tabla para la tabla `comentarios`
--

CREATE TABLE IF NOT EXISTS `comentarios` (
`id` int(11) NOT NULL,
  `id_noticia` int(11) NOT NULL,
  `nick` varchar(20) COLLATE utf8_spanish2_ci NOT NULL,
  `email` varchar(60) COLLATE utf8_spanish2_ci NOT NULL,
  `fechaComentario` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `comentario` text COLLATE utf8_spanish2_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `comentarios`
--
ALTER TABLE `comentarios`
 ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id` (`id`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `comentarios`
--
ALTER TABLE `comentarios`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

--
-- Estructura de tabla para la tabla `noticias`
--

CREATE TABLE IF NOT EXISTS `noticias` (
`id_noticia` int(11) NOT NULL,
  `autor` varchar(30) NOT NULL,
  `fecha` varchar(20) NOT NULL,
  `textoNoticia` text NOT NULL,
  `categoria` varchar(20) NOT NULL,
  `titulo` varchar(50) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `noticias`
--
ALTER TABLE `noticias`
 ADD PRIMARY KEY (`id_noticia`), ADD UNIQUE KEY `id_noticia` (`id_noticia`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `noticias`
--
ALTER TABLE `noticias`
MODIFY `id_noticia` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

Y ahora con los archivos de php dentro de la carpeta raiz:
noticias.php
<!DOCTYPE html>
<html lang ="es">
	<head>
		<title>Lista de noticias publicadas</title>
		<meta charset="iso-8859-1" />
	</head>
	<body>

		<?php

			include_once("config.php");

			

			$query=("SELECT * FROM $tabla ORDER BY id_noticia DESC");

			$result = $conexion->query($query);
			
			if(!mysqli_num_rows($result)){
				echo "Todavía no ha sido publicada ninguna noticia";
			}else{

				while($row = mysqli_fetch_array($result)){

					$fechaNoticia = date_create($row['fecha']);

					$fechaBD = date_format( $fechaNoticia, "d/m/Y H:i");

					echo "$row[titulo]</br>
					<small>Publicado por $row[autor] el día $fechaBD</small></br>
					$row[textoNoticia]</br><small>Publicado en $row[categoria] / <a href='noticia.php?id=".$row['id_noticia']."'>Dejar un comentario</a></small>";

				}
			}

		?>

	</body>
</html>

config.php
<?php

	#Sistema de noticias por Doodleo para la comunidad CCTW. Todas las líneas con # al principio pueden ser borradas ya que son solamente comentarios.

	# Servidor donde se aloja la base de datos.
	$servidor = "localhost";
	# Base de datos
	$db = "pruebas";
	# Usuario de la base de datos
	$db_usuario = "root";
	# Contraseña del usuario
	$db_pass = "root";
        # Tabla de la BBDD
	$tabla='noticias';
	

	# Selección y conexion a la base de datos
	$conexion = mysqli_connect($servidor,$db_usuario,$db_pass, $db) or die( "Error: " . mysqli_error($conexion));


?>

noticia.php
<!DOCTYPE html>
<html lang="es">
<head>
	<title> Comentarios de la noticia</title>
	<meta charset="iso-8859-1" />
</head>
<body>

	<?php

		include_once("config.php");
		//Almacenamos en la variable la ID de la noticia que queremos ver y comprobamos que es valido 
		//$id= strip_tags($_GET["id"]); 
		// if(!isnumeric($id) or $id<=0){
		//		header("location: noticias.php");
		//		return false;
		//}

		$id = $_GET['id'];

		$query = ("SELECT * FROM $tabla WHERE id_noticia=$id");

		$result=$conexion->query($query);

		if(mysqli_num_rows($result)){
			while ($row = mysqli_fetch_array($result)){

					echo "$row[titulo]</br>
					<small>Publicado por $row[autor] el día $row[fecha]</small></br>
					</br>
					$row[textoNoticia]</br>
					<h1><u>Comentarios</u></h1>";

					
					$comentarios_query= ("SELECT * FROM comentarios WHERE id_noticia=$id ORDER BY fechaComentario ASC ");

					$comentarios = $conexion->query($comentarios_query);


					//Compruebo si hay algun comentario
					if (!mysqli_num_rows($comentarios)){
						echo "Sin comentarios";
					}else{
						//Si hay algun comentario, los voy cargando uno a uno.
						while($comentario = mysqli_fetch_array($comentarios)){
							

							//Importante que los campos se carguen en el orden que aparecen en la base de datos.
							$nick = $comentario['nick'];
							//Guardo la variable TimeStamp de la BBDD y le indico a php que es una fecha.
							$fechaComentario = date_create($comentario['fechaComentario']);
							$comentario = $comentario['comentario'];
							
							//Creo la variable fechaBD, para almacenar la fecha despues de ser formateada al estilo deseado.
							$fechaBD = date_format( $fechaComentario, "d/m/Y H:i");


											

							echo "$nick dijo... </br>
							$comentario</br>
							<small>Publicado el $fechaBD  </small></br>";
						}
					}
			}

			//Liberamos los lectores de registros 
			mysqli_free_result($comentarios);
			mysqli_free_result($result);
			//Guardamos la hora actual en una variable
			$fechaActual = time();
			echo "</br></br>
				  <form method='post' action='comentar.php'>
				  <input type='hidden' name='id_noticia' id='id_noticia' value='$id'>
				  <label>Nick</br>
				  <input type='text' name='nick' id='nick' maxlength='20' /></label></br>
				  <label>Tu email (No será publicado)</br>
				  <input type='email' name='email' id='email' maxlength='60' /></label></br>
				  <label>Tu comentario</br>
				  <textarea name='comentario' id='comentario' ></textarea></label></br>
				  <input type='hidden' name='fecha' id='fecha' value=$fechaActual></br>
				  <button type='submit'>Enviar comentario</button></form>  ";
		} 

	?>

</body>
</html>

comentar.php
<?php
#Configuramos la zona horaria para que sea la de España
date_default_timezone_set('Europe/Madrid');
#Guardamos en las variables de fecha y hora de envío del comentario
$fecha = date("Y/m/d/ H:i:s");

#Información enviada por el ususario
$id = strip_tags($_POST['id_noticia']);
$nick = strip_tags($_POST['nick']);
$email = strip_tags($_POST['email']);
$comentario = strip_tags($_POST['comentario']);

include_once("config.php");
#Validamos el comentario
if(!is_numeric($id) or $id<=0 or !$id or !$nick or !$email or !$comentario)
{
	echo "Te faltó por completar algo!";
	return false;
}

#Ingresamos el comentario en la BBDD
$query = ("INSERT INTO comentarios (id_noticia, nick , email , comentario, fechaComentario) VALUES ('$id', '$nick', '$email', '$comentario', '$fecha' )");
$conexion->query($query);

#Volvemos a la noticia

header ("location: noticia.php?id=$id");

?>

publicar.php
<?php

echo '
<html>
<head>
</head>
<body>
<form method="post" action="enviar.php">
<label>Autor de la noticia<br/><input type="text" name="autor" maxlength="255" /></label><br/><br/>
<label>Título de la noticia<br/><input type="text" name="titulo" maxlength="255" /></label><br/><br/>
<label>Categoría<br/><input type="text" name="categoria" maxlength="255" /></label><br/><br/>
<label>Noticia<br/><textarea name="textoNoticia"></textarea></label><br/><br/>
<button type="submit">Publicar noticia</button>
</form>
</body>
</html>
';

?>

enviar.php
<?php

//Declaramos la variable para guardar la fecha en la que se publicó la noticia
$fecha = date("Y/m/d/ H:i:s");

//Conectamos con la BBDD
include_once('config.php');

//Recogemos las variables
$autor = $_POST['autor'];
$titulo = $_POST['titulo'];
$categoria = $_POST['categoria'];
$textoNoticias = $_POST['textoNoticia'];

//Comprobamos que han cubierto los datos de la nueva noticia
if( !$autor || !$titulo || !$categoria || !$novedad)
{
	echo '¡Tienes que completar todos los campos para publicar tu noticia!';
}else{
	//Ingresamos la noticia en la BBDD
	$query = ("INSERT INTO noticias (autor, titulo, categoria, fecha, textoNoticia) VALUES ('$autor', '$titulo', '$categoria', '$fecha', '$textoNoticia')");
	$conexion->query($query);
}

?>

Y ahora dentro de la carpeta de moderacion, los siguientes archivos php:

index.php
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="es-ES" >
<head>
	<meta http-equiv= "Content-Type" content="text/html; charset=iso-8859-1" />
	<meta name="robots" content="noindex,nofollow" />
	<title> Sistema de noticias en PHP</title>
<?php
	//Conectamos a la BBDD
	include_once("../config.php");

	//hacemos las consultas
	$query=("SELECT * FROM noticias");
	$result = $conexion->query($query);
	$totalRegistros = mysqli_num_rows($result);
?>
</head>
<body>
	<?php
		$query = ("SELECT * FROM noticias ORDER BY id_noticia");
		$result = $conexion->query($query);

		if (mysqli_num_rows($result))
		{
			while ($row = mysqli_fetch_array($result))
			{
				echo " $row[titulo]</br>
				Publicado por $row[autor] el día $row[fecha]</br></br>
				$row[textoNoticia]</br></br>
				Publicado en $row[categoria]</br>
				<a href='../noticia.php?id=$row[id_noticia]'> Deja tu comentario</a></br>
				<a href='borrar.php?id=$row[id_noticia]'>Borrar</a></br>
				<a href='editar.php?id=$row[id_noticia]'>Editar</a></br></br></br>";
			}
		} 		

	?>
</body>
</html>

borrar.php
<?php
	
	//Declaramos la ID en la que recibimos la ID que pusimos en la URL, por tanto, recibimos el ID de la noticia que queremos borrar
	$id = $_GET['id'];

	//Conectamos a la BBDD
	include_once('../config.php');

	//Ahora creamo la sentencia SQL para borrar la noticia correspondiente
	$query = " DELETE FROM noticias WHERE id_noticia=$id" ;
	$conexion->query($query) or die(mysqli_error()) ; 

	header ("location: index.php");

?>

editar.php
</head>
<body>
	<?php
		// Declaramos la variable ID en la que recibimos el ID que pusimos en la URL, por tanto, recibimos el ID de la noticia que queremos borrar
		$id = $_GET['id'];

		//Conectamos a la BBDD
		include_once('../config.php');

		//Selecionamos la noticia correspondiente dependiendo del ID especificado en la URL
		$query = "SELECT * FROM noticias WHERE id_noticia=$id";
		$result = $conexion->query($query) or die (mysqli_error());

		if (mysqli_num_rows($result))
		{
			while ($row = mysqli_fetch_array($result))
				{
					//Mostramos un formulario con los datos de la noticia en inputs para poder modificarlos
					

					echo " <form method='POST' action='actualizar.php' >
							<input type='hidden' name='id' id='id' value='$id' />
							Titulo de la noticia: <input type='text' name='titulo' id='titulo' value='$row[titulo]' /></br>
							Autor de la noticia: <input type='text' name='autor' id='autor' value='$row[autor]' /></br>
							Categoría de la noticia: <input type='text' name='categoria' id='categoria' value='$row[categoria]' /></br>
							Texto de la noticia: <textarea name='textoNoticia' id='textoNoticia'>$row[textoNoticia]</textarea></br>
							<button type='submit'> Editar noticia</button>
							</form>
							";

					


				}
		}
	?>
</body>
</html>

actualizar.php
<?php

	//Declaramos las variables enviadas por el formulario
	$id = $_POST['id'];
	$titulo = $_POST['titulo'];
	$autor = $_POST['autor'];
	$categoria = $_POST['categoria'];
	$textoNoticia = $_POST['textoNoticia'];

	//Conectamos a la BBDD
	include_once('../config.php');


	//Creamos la sentencia SQL para editar los campos de la noticia seleccionada
	$query = "UPDATE noticias SET titulo='$titulo', autor='$autor', categoria='$categoria' , textoNoticia='$textoNoticia' where id_noticia=$id ";
	$conexion->query($query) or die (mysqli_error());

	header ("location: index.php");

?>

Espero que le sea de utilidad a alguien.
Si dices cuales son, igual si ... aunque mis conocimientos en php son muy cortitos, pero bueno de todas formas, igual otra persona sepa ;)
Hola, ¿podrian volver a subir la imagen de la base de datos que está iniciando el tema? Soy nuevo en esto y voy poco a poco aprendiendo...
y pensar que gracias a este pequeño sistema hize mi gran proyecto web, el cual tiene una seccion de videos, blog, memes y demas con url amigables, sistema de comentarios, paginas de error, redes sociales, con cientos de visitas diarias y etc etc etc, gracias al creador del post que hasta ahora no me creo que haya progresado tanto mi web gracias a este sistema :D, para los que se inician ahi les adjunto este sistema testeado con base de datos. Saludos
danny escribió:y pensar que gracias a este pequeño sistema hize mi gran proyecto web, el cual tiene una seccion de videos, blog, memes y demas con url amigables, sistema de comentarios, paginas de error, redes sociales, con cientos de visitas diarias y etc etc etc, gracias al creador del post que hasta ahora no me creo que haya progresado tanto mi web gracias a este sistema :D, para los que se inician ahi les adjunto este sistema testeado con base de datos. Saludos

Hola gracais por el archivo, ya lo descargado el archivo y creado las tablas en la base de datos, ¿qué tengo que hacer ahora para hacerlo funcionar?

saludos :)
A pesar de tener algunos años, un excelente tutorial para los que apenas empiezan a desarrollar. :)
Solo seria importante resubir la imagen donde especificas los campos que usas en la BD para seguirle dando vigencia al hilo.