Errores en paginación en PHP

  • Autor Autor Die Katze
  • Fecha de inicio Fecha de inicio
D

Die Katze

Curioso
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Tengo un problema con el siguiente código. Lo que debería hacer es mostrar una paginación en la que se muestren nueve productos por página. Eso lo hace. El problema está en las páginas que genera. Tal y como tengo el código y los productos ahora mismo (11 productos), me hace la paginación bien, pero en vez de mostrarme dos páginas, me muestra tres, y la tercera la muestra en blanco, pero es que si le cambio el número de elementos a mostrar por 6, me salen 5 páginas y sólo me muestra los productos en las dos primeras (que vuelvo a decir que salen bien, 6 y 5, respectivamente). ¿Cuál es el error que tengo para que me salgan tantas páginas?

HTML:
 <section class="filtro">
    <form method="post">
        <h3>Ordenar por:
            <select name="ordenar">
                <option value="1">Orden alfabético (A-Z)</option>
                <option value="2">Orden alfabético inverso (Z-A)</option>
                <option value="3">Precio más bajo a más alto</option>
                <option value="4">Precio más alto a más bajo</option>
                <option value="5">Orden predeterminado</option>
            </select>
            <button type="submit" class="btn btn-danger"><b>Aplicar</b></button>
        </h3>
    </form> 
</section>

<div class="mostrar_productos">
    <?php 
        //Muestra los productos y contiene las funcionalidades del filtro
        $conexion = mysqli_connect($servidor, $usuario_BD, $contrasena_BD, $basedatos);
        mysqli_set_charset($conexion, "utf8");

        //Paginación
        $elementos = 6; 

        if (isset($_GET['pagina_numerada'])) {
            $pagina_numerada = $_GET['pagina_numerada'];
        }else{
            $pagina_numerada = 1;
        }

        $empieza = ($pagina_numerada-1) * $elementos;

        //Condiciones del filtro y de la paginación
        if(!isset($_POST['ordenar'])){
            $consulta = "SELECT * FROM producto WHERE categoria = 'cuerda' LIMIT $empieza, $elementos";
        }else{
            if ($_POST['ordenar'] == "1"){
                $consulta = "SELECT * FROM producto WHERE categoria='cuerda' order by nombre_producto asc ";
                echo "<h4>Productos ordenados alfabéticamente (A-Z)</h4>";
            }
            if ($_POST['ordenar'] == "2"){
                $consulta = "SELECT * FROM producto WHERE categoria='cuerda' order by nombre_producto desc";
                echo "<h4>Productos ordenados alfabéticamente de forma inversa (Z-A)</h4>";
            }
            if ($_POST['ordenar'] == "3"){
                $consulta = "SELECT * FROM producto WHERE categoria='cuerda' order by precio asc";
                echo "<h4>Productos ordenados de precio más bajo a más alto</h4>";
            }
            if ($_POST['ordenar'] == "4"){
                $consulta = "SELECT * FROM producto WHERE categoria='cuerda' order by precio desc";
                echo "<h4>Productos ordenados de precio más alto a más bajo</h4>";
            }
            if ($_POST['ordenar'] == "5"){
                $consulta = "SELECT * FROM producto WHERE categoria='cuerda'";
            }
        }

        $resultado = mysqli_query($conexion, $consulta);

        //Muestra productos
        while ($fila = mysqli_fetch_assoc($resultado)) {         
            echo "<div class='col-md-3 col-xs-5 producto_individual'>";
            $consulta2 = "SELECT * FROM producto WHERE id_producto = " .$fila["id_producto"] ."";
            $resultado2 = mysqli_query($conexion, $consulta2);

            echo "<h2>" . $fila['nombre_producto'] . "</h2>";
            echo "<img src='imagenes/" .$fila["imagen"] . "' width = 100px>";
            echo "<p>" . $fila['descripcion_corta'] . "</p>";
            echo "<p>Precio: " . $fila['precio'] . " €</p>";
            echo "<a class='btn btn-danger' href='producto_individual.php?id_producto=" .$fila["id_producto"]. "'><b>Ver más</b></a> ";

            //Formulario oculto que reoge los datos del producto para guardarlos en el carrito.
            echo "<form action='carrito.php' method='post' name='compra' style='display:inline;'>"; 
            echo "<input name='id_producto' type='hidden' value='".$fila["id_producto"]."'/>";
            echo "<input name='nombre_producto' type='hidden' value='".$fila["nombre_producto"]."'/>";
            echo "<input name='precio' type='hidden' value='".$fila["precio"]."'/>";

            echo "<button type='submit' class='btn btn-danger' name='comprar' value='comprar'><b>Comprar</b></button> ";
            echo "<input style='width:35px' name='cantidad' type='number' value='1'/>";

            echo "</form></div>";           
        }


        $consulta3 = "SELECT * FROM producto";
        $resultado3 = mysqli_query($conexion, $consulta3);
        $total_registros = mysqli_num_rows($resultado3);

        $total_paginas = ceil($total_registros / $elementos);
        echo "<center><a href='cuerda.php?pagina_numerada=1'>". 'Primera '."</a>";

        for ($i=1; $i <= $total_paginas; $i++) { 
            echo "<a href='cuerda.php?pagina_numerada=".$i."'>".$i."</a>";
        }

        //Link a última página
        echo "<a href='cuerda.php?pagina_numerada=$total_paginas'>".' Última'."</a></center>";
        mysqli_close($conexion);
    ?>                  
</div>
 
Hallo [MENTION=196533]Die Katze[/MENTION], oder ist es der Kater?

Bueno para comenzar verifica el calculo de los productos que quieres mostrar por pagina, dices que quieres mostrar 9 pero a $elementos le asignas 6.

Verifica los ciclos y para verificar pon mensajes a las variables para estar seguro que este asiendo los cálculos bien.

Sin correr es difícil.
 
Eso del 6 ha sido un error al estar trasteando, pero vamos, lo mismo da 9 que 6. Digo yo que si el proceso estuviera bien bastaría con cambiar eso para cambiar el número de elementos.
 
Lo que veo así de rápido es que haces llamado por la categoría cuerdas pero en la cantidad total buscas todos, ahí tienes el error.

Por eso te genera más páginas, haz de cuenta que tienes 50 registros, pero solo tienes 20 de categoría cuerda.

Saludos
 
Lo que veo así de rápido es que haces llamado por la categoría cuerdas pero en la cantidad total buscas todos, ahí tienes el error.

Por eso te genera más páginas, haz de cuenta que tienes 50 registros, pero solo tienes 20 de categoría cuerda.

Saludos

Era eso. He cambiado la consulta del final por $consulta3 = "SELECT * FROM producto WHERE categoria = 'cuerda'"; y ya me sale bien. Muchas gracias ^-^
 
Era eso. He cambiado la consulta del final por $consulta3 = "SELECT * FROM producto WHERE categoria = 'cuerda'"; y ya me sale bien. Muchas gracias ^-^

Gracias por dar la solucion al problema.

El gracias se da al cliquear el boton "me agrada" en este foro. 🙂
 
Atrás
Arriba