entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Como paginar resultados (php y mysql) ?

Buenas noches!, alguien podría echarme una mano para poder paginar mis resultados?, esta es la manera en que me traigo los resultados de acuerdo al catalogo que se eligió previamente:

  <?php
                $bienes_array = $obj->get_catalogos_dep($idcat);

                if (is_array($bienes_array) && count($bienes_array) > 0) {
                    ?>

                        <table width ="100%" class="table">
                                <?php
                                foreach ($bienes_array as $row) {
                                    $url = "detalles_catalogo.php?num_inv=" . $row['num_inv'];
                                    ?>
                                <tr>

                                    <td width="100">
                                        <a href="<?php echo $url; ?>">
                                            <img src="<?php echo $row['img']; ?>" border="0" class="img-thumbnail">     
                                        </a>
                                    </td>

                                    <td>    
                                        <?php
                                        $title = $row['titulo'];
                                        Generales::do_html_URL($url, $title);
                                        ?>  
                                    </td>

                                </tr>

                                <?php
                            }
                        } else {
                            echo "<strong>No Hay Catalogos para este municipio.</strong><br><br><br>";
                            echo "<a href='insertar_catalogo.php'>
        <img src='images/agregar.png' border=0></a>";
                        }

Si consideran que necesito darles algún otro dato andaré por aquí, gracias!

1voto

antonio comentado

hola amigo creo que esto te podria ayudar con tu problema.
aca un tutorial desde cero a como crear un paginador con php mysql y ajax desde 0.
Espero ayudar con tu problema.
http://www.cesarcancino.com/videotutorial-27-del-curso-de-php-poo-n202.html

0voto

iphp comentado

Gracias! ya habia intentado descargar el mismo video para cuando no tuviera conexion pero no se podia, lo checare :)

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola iPHP,

en tu código hay un enfoque mixto entre Programación Orientada a Objetos y Programación Estructurada, en la que los Objetos parecen devolver vectores y hacer querys a la base de datos.

Para paginar, creo que vas a tener que optar por soluciones en Objetos, que trabajarán con una colección a través de un ORM por lo general, o por una solución Estructurada en la que trabajarás con querys.

Para abordar el problema con querys, te recomiendo este código. Se encuentra completo y con ejemplos en http://www.phpclasses.org/package/1233-PHP-query-with-pagination-and-previous-next.html. Nosotros lo usamos hace mucho para el software construido con la metodología de Programación Estructurada, es fácil de adaptar y funciona muy bien. Fijate que como parámetro para trabajar usa directamente un query:

    <?php
    /**
    ** Author: Oliver Susano ([email protected])
    ** Class queryList

** Query with paginations and previous next links.
** syntax: queryList($sql, $link, $page, [$rowsPerPage [, $pageLimit ]])

Return the variables:

    $this->result = The page browser
    $this->start  = First result on this page
    $this->start  = Last result on this page
    $this->total  = Total results on this page
    $this->pages  = Number of pages
    $this->sql      = The query to get the actual page

**/

class queryList {

    function queryList($sql, $link, $page, $rowsPerPage='10', $pageLimit='10') {

        // check the numbers of pages
        $result        = mysql_query($sql);
        $totalRows    = mysql_num_rows($result);
        $totalPages = ceil($totalRows / $rowsPerPage);

        // verify the given values
        $page = $page*1; $rowsPerPage = $rowsPerPage*1; $pageLimit = $pageLimit*1; 
        if(!is_int($rowsPerPage) || $rowsPerPage < 1) { $rowsPerPage = 10; }
        if(!is_int($pageLimit)   || $pageLimit   < 1) { $pageLimit   = 10; }
        if($page > $totalPages) { $page = $totalPages; }
        if(!is_int($page) || $page < 1) { $page = 1; }

        // build the starting values
        if($totalPages > $pageLimit ) { $value = $pageLimit; } 
            else { $value = $totalPages; }
        if($page > $pageLimit) { $i = $page - $pageLimit; $value = $pageLimit+$i; }
        $pages = "";

        // section for Previous Record
        if($page > 1){
            $pages .= '&nbsp;<b>[ <a href="'.$link.'&page='.($page-1).'">prev</a> ] &nbsp;</b>';
        }

        // build the Pages Browser
        while ($i < $value){
            $i++;
            if ($i == $page){
                $pages .= "<b>[ $i ]</b> ";
            } else { 
                if($i <= $totalPages) { $pages .= '<a href="'.$link."&page=$i\">$i</a> "; }
            }
        }

        // section for Next Record
        if($i <= $totalPages){
            if($totalPages != $page){
                $pages .= '&nbsp;<b>[ <a href="'.$link.'&page='.($page+1).'">next</a> ]</b>';
            }
        }

        // make the return values
        $this->result = $pages;
        $this->start  = (($page-1) * $rowsPerPage) + 1;
        $this->total  = $totalRows;
        $this->pages  = $totalPages;
        $this->sql      = $sql." LIMIT ".($page-1)*$rowsPerPage.",".$rowsPerPage;
        if($page==$totalPages) 
             { $this->stop = ($page-1)*$rowsPerPage+($totalRows-(($page-1)*$rowsPerPage)); }
        else { $this->stop = $page * $rowsPerPage; }

    } // end of query()

} // end of Class 

En tu enfoque de desarrollo híbrido, tal vez puedas integrar este código con el que hace las querys a la DB, y agregar un método que devuelva el paginador ya armado.

Saludos

0voto

iphp comentado

Interesante @Leonardo-Tadei no me di cuenta por completo que mi desarrollo se pudiera considerar hibrido, dime algo eso es malo? o no recomendable? , lo que me sugieres me parece bien, sin embargo me gustaría optar por una solución orientada a objetos, de hecho como le comente al otro compañero, ya había consultado en diversas fuentes en google y de todas escogí la que me gusto más y considere la mejor, que por cierto tengo entendido que es orientada a objetos, pero a la hora de hacer la implementación de acuerdo a mis necesidades no logre completar la paginación, entonces que me recomiendan que haga les muestro como estoy intentarlo hacerlo o abro una nueva pregunta??

Saludos y gracias!!

0voto

Leonardo-Tadei comentado

Hola @iphp,

no nos mostraste la estructura de clases de tu diseño, pero a juzgar por

$bienes_array = $obj->get_catalogos_dep($idcat);

en dónde un Objeto del que no sabeos la clase devuelve un array en vez de Objetos de clase Catálogo, pareciera que sí. La línea:

Generales::do_html_URL(...)

también apunta para ese lado, porque estás usando una llamada a un método estático, lo que es una mala práctica en POO (salvo para implementar un singleton y pocos casos más), ya que así estás usando el operador :: solo para determinar un espacio de nombres; si fuere este el caso podrías definir NAMESPACES y no mezclarlo con los objetos.

Escribir código que funciona es siempre bueno! Respecto a hibridar, hay que tener una conducta extrema y un muy buen conocimeinto de ambos paradigmas para poder decidir con seguridad si vale la pena o no.

Salvo que seas un experto, yo lo desaconsejo, porque crea muy malos hábitos de programación.

Para hacer esto como Objetos puros, deberías cambiar mucho el código. Tal vez sea buena idea hacer esto para tu próximo proyecto. Para trabajar solo con POO deberías usar para manejar la persistencia un Mapeador Objeto/Relacional (ORM) ya que desde el punto de vista de la POO ninca debería ser responsabilidad del propio Objeto el guardarse.

Para tomar ese camino, te recomiendo este enlace con una presentación de lo que es la Persistencia, las malas prácticas asociadas y la solución en un ORM que hace persistencia no invasiva y por alcance en PHP. Al final de la presentación está el URL para descargar el código.: http://www.pegasusnet.com.ar/difusion/2012-10-ORM/index.html

Podemos seguir en otra pregunta sobre un buen diseño para resolver el problema. Tendrías que describirlo y mostrarnos un UML de cómo es ahora.

Saludos!

0voto

iphp comentado

Que onda @Leonardo-Tadei,

La estructura de mi clase Catalogo es la siguiente:

class Catalogo {

public function get_catalogos() {
    $conn = Conexion::db_connect();

    $sql = "SELECT * FROM numeros_cat";
    $result = $conn->query($sql);

    if (!$result)
        return false;

    $mun_array = array();

    while ($reg = $result->fetch_assoc()) {
        $mun_array[] = $reg;
    }
    return $mun_array;
}

public function get_nombre_dep($idcat) {
    $conn = Conexion::db_connect();

    $sql = "SELECT dependencia FROM numeros_cat where id_cat=$idcat";

    $result = $conn->query($sql);

    if (!$result)
        return false;

    $num_mun = $result->num_rows;

    if ($num_mun == 0)
        return false;

    $row = $result->fetch_object();
    return $row->dependencia;
}

public function get_catalogos_dep($idcat) {
    $conn = Conexion::db_connect();

    $sql = "SELECT * FROM bienes WHERE id_cat=$idcat";
    $result = $conn->query($sql);

    if (!$result)
        return false;

    $prod_array = array();

    while ($reg = $result->fetch_assoc()) {
        $prod_array[] = $reg;
    }
    return $prod_array;
}

Tengo una clase llamada Generales que solo utilizo para mostrar datos:

class Generales {

//Metodo estatico que muestra en forma de enlaces lo que se le pase como parametro.
public static function do_html_URL($url, $name) {
    ?>
    <a href="<?php echo $url; ?>"><?php echo $name; ?></a>
    <?php
}

}

Tal como lo dices creo que lo dejare para mi proximo proyecto debido a que no estoy trabajando con un patron arquitectonico como el MVC u.u y me doy cuenta que lo que me pasaste aplica para trabajar de esta manera, ciertamente no soy un experto, de hecho empeze a trabajar con php estructurado y este es mi primer proyecto donde intento utilizar POO.

Tu presentación me parece muy interesante y lo contemplare como un detalle muy importante, pero como lo dijiste tendría que cambiar mucho mi código, por lo que considero dejarlo como una próxima nueva versión de mi aplicación! ademas de que sera una nueva experiencia.

Por lo pronto quisiera saber si podríamos seguir con esto de la paginacion de la manera en que lo llevo, si requiere algunos ajustes se que no caerían mal.

Saludos!

1voto

Leonardo-Tadei comentado

Hola iPHP,

Usar la arquitectura MVC es posible tanto en Programación Esstructurada como en POO. También es algo áltamente recomendable, pero no obligatorio.

Respecto al código de la clase Catalogo, no represetna a un Catálogo como un Modelo de tu software, sino que simplemente lo planteaste como un wrapper para encapsular querys. No es lo mismo escribir Objetos que pensar en Objetos.

Sobre qué es un Objeto y cómo diseñarlos, te recomiendo que leas Designing Object-Oriented Software de Rebecca Wirfs-Brock. Es un libro viejo pero tiene la mejor explicación que haya visto por ahí sobre el tema.

Respecto a la paginación, podrías perfectamente integrar la clase que te menciono al principio con las querys en los get_* de tus "clases", que necesitan la query como parámetro. Luego agregar por ejemplo por GET la página actual (y 1 si no está seteada) con lo que ya tendrías funcionando el paginador.

Saludos!

1voto

lladruc Puntos760

Lo mas normal para páginar resultados sql sobre una web es crear una variable que trabaje sobre $_GET con el num de página.

por ejemplo:

$page=$_GET['page']; //página en la que estamos, empezamos en pg. 0
$limit = 100;
$range=$page*$limit; // limite de resultados a buscar(0 a 100, de 100 a 200...)
//$bienes_array = $obj->get_catalogos_dep($idcat);
$bienes_array = $obj->query("SELECT * FROM catalogos WHERE idcat=$idcat LIMIT $range $limit");

Recuerda que esto es un pseudo código, tendrás que adaptarlo a tu BD y a tu sistema de cosnultas!!! (:

Bién, vamos a por los botones....

<!-- si trabajamos sobre html5 puro: -->

<a href="<? echo'"http://'.$_SERVER['HTTP_HOST'].'/idcat='.$idcat'.'&page='.$page.'"': ?> ><input type="button" value="<? echo $page+1;?>"/></a>
<!-- Si trabajamos sobre un framework con parser: -->

<a href="<? echo'"http://'.$_SERVER['HTTP_HOST'].'/categoria/='.$idcat'.'&page='.$page.'"': ?> ><input type="button" value="<? echo $page+1;?>"/></a>

Recuerda que todo esto son indicaciones base para trabajar con paginación de forma básica e intuitiva. Lógicamente si trabajas con frameworks tienes opciones (librerias) para agilizar dicho proceso.

También te dejo un par de url's de referencia para que puedas leer mas sobre el tema:

http://www.desarrolloweb.com/articulos/1035.php
http://ricardogeek.com/paginar-resultados-con-php/
y el mas importante:
https://www.google.es/search?/click/para/acceder/a_la/busuqeda

0voto

iphp comentado

Igual gracias @marcel_olsina los links que me mandaste también los había consultado de hecho ya los tengo en mis marcadores :) y el mas importante pues fue con el que llegue a los demas xD, creo que debí hacer mi pregunta mas especifica debido a que por lo que había leído tengo una idea de como es este rollo de la paginacion, que es precisamente como lo dijiste, una disculpa por haber lanzado mi pregunta de esa manera, pero espero y me sigan ayudando en la implementacion que haré que es mas bien donde esta mi problema

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta