Foros del Web » Programando para Internet » PHP »

[Pedido] Paginador para noticias formato blog.

Estas en el tema de [Pedido] Paginador para noticias formato blog. en el foro de PHP en Foros del Web. Hola, ¿qué tal? soy nuevo tanto en el foro como en el mundo del PHP. Hace tiempo construí un sitio muy estático a puro HTMLy ...
  #1 (permalink)  
Antiguo 25/06/2015, 15:57
Avatar de mayhemarg  
Fecha de Ingreso: junio-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
[Pedido] Paginador para noticias formato blog.

Hola, ¿qué tal? soy nuevo tanto en el foro como en el mundo del PHP. Hace tiempo construí un sitio muy estático a puro HTMLy CSS con los conocimientos básicos que fui aprendiendo de distintas webs y lo que pude aprender en la universidad (soy diseñador gráfico). Utilicé un poco de PHP, pero solo para un formulario de contacto y algunos 'includes' para las páginas que se repetían (botoneras, footer, header...), de bases de datos, MySQL, etc, no tenía ni idea.

Estoy intentando renovarlo dándole un poco de vida al mismo, nuevo diseño, y un formato de blog de noticias en el inicio que sea dinámico. La idea de esto surge en que el sitio nace de una comunidad que comenzó como un foro de foroactivo y se fue expandiendo. El foro tiene varios usuarios, entre ellos 3 administradores (uno soy yo). La idea era que, los otros dos administradores también pudieran actualizar la página web agregándole noticias y no tengan que depender todo el tiempo de mí y mis conocimientos de HTML para estar actualizándola.

Hasta ahora seguí una guía paso por paso para poder crear una base de datos, con cuatro tablas (usuarios, categorías, noticias, comentarios). Logré hacer un formulario de registro y un panel de control para admins con el que llenando formularios las noticias se agreguen a la base de datos y se muestren en el index.php y que clickeando en el título se acceda a la nota completa que también se muestra según el ID de la misma.

El problema es que yo sigo agregando noticias, pero llega un punto en el que necesito hacer un paginado de las mismas, no quiero tener una web donde el usuario tenga que scrollear hasta el infinito para encontrar una noticia vieja. Es muy tedioso. Intenté seguir varias guías para poder armar el dichoso paginado pero no puedo hacer que funcione. Siempre termino con algún error de variable no definida en algún lado. Por eso les pido su ayuda, si le podrían dar una mano a este novato con el armado de un paginado para las noticias. Les dejo aquí abajo los campos de la tabla de noticias y del index.php (si necesitan algún otro, me avisan y lo agrego).

De antemano, muchísimas gracias por molestarse.

CAMPOS DE TABLA NOTICIAS
idNoticia
titulo
copete
cuerpo
idUsuario
idCategoria
fPublicacion
fCreacion
fModificacion



INDEX.PHP

Código:
<?php

// iniciamos session
session_start ();

// archivos necesarios
require_once 'admin/config.php';
require_once 'admin/conexion.php';
require_once 'admin/esUsuario.php';

// obtengo puntero de conexion con la db
$dbConn = conectar();

// vemos si el usuario quiere desloguar
if ( !empty($_GET['salir']) ) {
	// borramos y destruimos todo tipo de sesion del usuario
	session_unset();
	session_destroy();
}

// verificamos que no este conectado el usuario
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
	$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );		
}

// listado de noticias
// traemos listado de noticias
$arrNoticias = array();
$query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion < '".date('Y-m-d H:i:s')."' ORDER BY fPublicacion DESC";
$resultado = mysql_query ($query, $dbConn);
while ( $row = mysql_fetch_assoc ($resultado)) {
	array_push( $arrNoticias,$row );
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Blog Personal</title>
</head>

<body>

	<h1>Blog Personal</h1>
	
	<?php if ( !empty($_GET['registro']) ) { ?>
	<div>El registro ha sido exitoso.</div>
	<?php } ?>
	
	<?php if ( empty($arrUsuario['usuario']) ) { ?>
	<ul>
		<li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li>
		<li><a href="registrar.php">Reg&iacute;strate gratis</a></li>
	</ul>
	<?php } else { ?>
	<p>Bienvenido <?php echo $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p>
		<?php if ( $arrUsuario['tipo'] == 'admin' ) { ?>
		<ul>
			<li><a href="admin/index.php">Panel de administraci&oacute;n</a></li>
		</ul>
		<?php } ?>
	<?php } ?>

	<h2>Noticias</h2>
	<?php foreach ( $arrNoticias as $noticias ) { ?>
	<div>
		<h3><a href="vernoticia.php?idNoticia=<?php echo $noticias['idNoticia']; ?>"><?php echo $noticias['titulo']; ?></a></h3>
		<p><?php echo $noticias['copete']; ?></p>
	</div>
	<?php } ?>
</body>
</html>
  #2 (permalink)  
Antiguo 25/06/2015, 22:57
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: [Pedido] Paginador para noticias formato blog.

Realmente no es tan difícil, solo necesitas:

1- Definir cuántas noticias mostrarás por página
2- Contar el total de noticias para saber el número máximo de páginas
3- Detectar la página actual y limitar la consulta
4- Crear los enlaces para navegar entre páginas

Código PHP:
Ver original
  1. // Total de noticias por página, cámbialo de acuerdo a tu gusto/necesidad
  2. $por_pag = 10;
  3.  
  4. // Variable para página actual
  5. $pag_actual = 1;
  6.  
  7. // Variable para máximo de páginas
  8. $pag_max = 1;
  9.  
  10. // Cuenta las noticias:
  11. $consulta = 'SELECT COUNT(*) FROM noticias WHERE fecha = CONDICION';
  12. $res = mysql_query($consulta) or die('Error en consulta: ' . mysql_error);
  13. list($total_noticias) = mysql_fetch_row($res);
  14.  
  15. // Calculas el total de páginas
  16. $pag_pax = ceil($total_noticias / $por_pag);
  17.  
  18. // Buscas en $_GET la página a mostrar, si no existe, será la 1
  19. if(isset($_GET['pag'])) {
  20.     $pag_actual = (int) $_GET['pag']; // Forzamos a que sea un valor entero
  21.     // Verifica que la página esté dentro de los límites permitidos
  22.     if($pag_actual < 1) { $pag_actual = 1; }
  23.     if($pag_actual > $pag_mag) { $pag_actual = $pag_max; }
  24. }
  25.  
  26. // Ya tienes la página actual, ahora hay que limitar la consulta
  27. $inicio = ($pag_actual * $por_pag) - $por_pag;
  28.  
  29. // La parte del LIMIT es lo que "hace la magia" xD
  30. $consulta = "SELECT * FROM noticias WHERE fecha = CONDICION ORDER BY fecha DESC LIMIT $inicio, $por_pag";
  31.  
  32. // Después de mostrar las noticias creas los enlaces de páginas:
  33. for($i = 1 to $pag_max) {
  34.     echo "<a href=\"index.php?pag=$i\">$i</a>";
  35. }

Por favor no copies y pegues el código, seguramente habrá errores de tecleo, cambios en nombres de variables, campos y funciones; analízalo, entiéndelo y aplícalo en tu proyecto.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 26/06/2015, 06:23
Avatar de mayhemarg  
Fecha de Ingreso: junio-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: [Pedido] Paginador para noticias formato blog.

Hola, primero que nada, muchas gracias por tu respuesta y por haberte tomado el tiempo.

Probé con lo que me sugeriste pero cuando cargo el index obtengo este resultado:

Notice: Use of undefined constant mysql_error - assumed 'mysql_error' in C:\xampp\htdocs\just-blog-it\index.php on line 47
Error en la consulta: mysql_error

En la linea 47 tengo esto.

Código:
$res = mysql_query($consulta) or die ('Error en la consulta: ' . mysql_error);
Después cambié algunos campos como "fecha" por "fPublicacion" y había una variable que decía $page_mag que supuse que quisiste escribir "$page_max", y en las consultas encerré la tabla noticias entre los ``.

¿Tendrías idea de cómo solucionarlo? ¡Gracias nuevamente!
  #4 (permalink)  
Antiguo 26/06/2015, 09:17
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 10 meses
Puntos: 28
Respuesta: [Pedido] Paginador para noticias formato blog.

mayhermarg,

Si entras en el enlace que aparece en el código te lleva a la documentación de mysql_error y en los ejemplos puedes ver el correcto uso.

Tal como dijo Tribi, no se trata de copiar y pegar, debes analizar un poco el código e investigar los métodos, clases o código que no entiendas.

Saludos.
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 27/06/2015, 09:49
Avatar de mayhemarg  
Fecha de Ingreso: junio-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: [Pedido] Paginador para noticias formato blog.

Ya logré hacer que no haya errores en las variables ni constantes y tampoco en las consultas. Pero sigo teniendo un problema. Por ejemplo, limito el registro a 3 por página. Creo 1, 2 o 3 noticias y un 1 aparece en el paginador. Cuando creo la cuarta y quinta noticia, aparece un 2 en el paginador, pero se siguen mostrando las 5 noticias en vez de que las noticias 1 y 2 vayan a parar a la segunda página. Y si voy a la página 2, se siguen mostrando todas las noticias. Es decir, las páginas las crea, pero muestran todas lo mismo: todos los registros.

El código es este:

Código:
<?php

// iniciamos session
session_start ();

// archivos necesarios
require_once 'admin/config.php';
require_once 'admin/conexion.php';
require_once 'admin/esUsuario.php';

// obtengo puntero de conexion con la db
$dbConn = conectar();

// vemos si el usuario quiere desloguar
if ( !empty($_GET['salir']) ) {
	// borramos y destruimos todo tipo de sesion del usuario
	session_unset();
	session_destroy();
}

// verificamos que no este conectado el usuario
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
	$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );		
}

// listado de noticias
// traemos listado de noticias
$arrNoticias = array();
$query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion < '".date('Y-m-d')."' ORDER BY fPublicacion DESC";
$resultado = mysql_query ($query, $dbConn);
while ( $row = mysql_fetch_assoc ($resultado)) {
	array_push( $arrNoticias,$row );
}

//paginador
//Total de noticias por página
$por_pag = 2;

// Variable para página actual
$pag_actual = 1;

//variable para máximo de páginas
$pag_max= 2;

//CUenta las noticias:
$consulta = "SELECT COUNT(*) FROM noticias WHERE fPublicacion < '".date('Y-m-d')."' ";
$res = mysql_query($consulta) or die ('Error en la consulta');
list ($total_noticias) = mysql_fetch_row($res);

//Calcular el total de páginas
$pag_max = ceil($total_noticias / $por_pag);

// Buscar en GET la página a mostrar, si no exista, será la 1
if (isset($_GET['pag'])) { 
$pag_actual = (int) $_GET['pag']; //Forzamos a que sea un valor entero
// Verifica que la página esté dentro de los límiites permitidos
if ($pag_actual < 1) {$pag_actual = 1;}
if ($pag_actual > $pag_max) {$pag_actual = $pag_max;}
}

//Ya tienes la página actual, ahora hay que limitar la consulta
$inicio = ($pag_actual * $por_pag) - $por_pag;

// Limitamos la consulta
$consulta = "SELECT * FROM noticias ORDER BY fPublicacion WHERE fPublicacion < '".date('Y-m-d')."' DESC LIMIT $inicio, $por_pag";


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Blog Personal</title>
</head>

<body>

	<h1>Blog Personal</h1>
	
	<?php if ( !empty($_GET['registro']) ) { ?>
	<div>El registro ha sido exitoso.</div>
	<?php } ?>
	
	<?php if ( empty($arrUsuario['usuario']) ) { ?>
	<ul>
		<li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li>
		<li><a href="registrar.php">Reg&iacute;strate gratis</a></li>
	</ul>
	<?php } else { ?>
	<p>Bienvenido <?php echo $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p>
		<?php if ( $arrUsuario['tipo'] == 'admin' ) { ?>
		<ul>
			<li><a href="admin/index.php">Panel de administraci&oacute;n</a></li>
		</ul>
		<?php } ?>
	<?php } ?>

	<h2>Noticias</h2>
	<?php foreach ( $arrNoticias as $noticias ) { ?>
	<div>
		<h3><a href="vernoticia.php?idNoticia=<?php echo $noticias['idNoticia']; ?>"><?php echo $noticias['titulo']; ?></a></h3>
		<p><?php echo $noticias['copete']; ?></p>
	</div>
	<?php } ?>
    
<?php for($i = 1; $i < $pag_max; $i++) { ?>

<table><tr>
   
    <?php  echo "<td><a href=\"index.php?pag=$i\">$i</a></td>"; ?>
    </tr></table>
<?php } ?>
	
</body>
</html>
Ahora bien, creo que el problema mayor recide aquí:

Código:
<h2>Noticias</h2>
	<?php foreach ( $arrNoticias as $noticias ) { ?>
	<div>
		<h3><a href="vernoticia.php?idNoticia=<?php echo $noticias['idNoticia']; ?>"><?php echo $noticias['titulo']; ?></a></h3>
		<p><?php echo $noticias['copete']; ?></p>
	</div>
	<?php } ?>

Con el foreach estoy trayendo todas las noticias de la primer consulta que hago al traer el Id, título y copete de la noticia. Y yo solo quiero que se muestren 3 por página. ¿Cómo tendría que proseguir para poder limitar a solo 3 registros por página?
  #6 (permalink)  
Antiguo 27/06/2015, 11:14
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: [Pedido] Paginador para noticias formato blog.

Sigues cargando todas las noticias, incluso antes del paginador:

Código PHP:
Ver original
  1. // listado de noticias
  2. // traemos listado de noticias
  3. $arrNoticias = array();
  4. $query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion < '".date('Y-m-d')."' ORDER BY fPublicacion DESC";
  5. $resultado = mysql_query ($query, $dbConn);
  6. while ( $row = mysql_fetch_assoc ($resultado)) {
  7.     array_push( $arrNoticias,$row );
  8. }

Más abajo tienes la consulta para paginar, pero con dos errores:

Código PHP:
Ver original
  1. // Limitamos la consulta
  2. $consulta = "SELECT * FROM noticias ORDER BY fPublicacion WHERE fPublicacion < '".date('Y-m-d')."' DESC LIMIT $inicio, $por_pag";

1- Tienes solo DESC, falta ORDER BY y el nombre de campo
2- No la estás ejecutando... podrías hacerlo en la misma forma en que cargas todas las noticias

Al final, hay que trabajar un poco el diseño, cuando generas los links de paginación tienes una tabla por cada link y sería mejor que uses CSS para aplicar colores, márgenes, alineación, etc.... pero eso ya no es tema de PHP.
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: blog, paginador, paginar
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




La zona horaria es GMT -6. Ahora son las 13:35.