Foros del Web » Programando para Internet » PHP »

Paguinación de un archivo php

Estas en el tema de Paguinación de un archivo php en el foro de PHP en Foros del Web. Hola! Tengo este archivo, me gustaria que si hay mas de 5 registros (ya que se pueden añadir parkines) pues que fueran dividiendo en paginas, ...
  #1 (permalink)  
Antiguo 24/02/2014, 09:15
Avatar de muchuelu93  
Fecha de Ingreso: noviembre-2013
Mensajes: 35
Antigüedad: 10 años, 4 meses
Puntos: 2
Exclamación Paguinación de un archivo php

Hola!

Tengo este archivo, me gustaria que si hay mas de 5 registros (ya que se pueden añadir parkines) pues que fueran dividiendo en paginas, es decir, si hay 13 registros, que debajo de todo salgan 3 botones (1, 2, 3) y que en el 1 salgan 5 registros, en el 2 5 registros mas y en la pagina 3 pues los registros restantes. Espero que me entiendan por que yo no tengo ni idea :(

operarParkings:

Código HTML:
<?php
  
// creem un objecte PDO que representa una connexió a una base de dades
$usuari='root';
$contrassenya='';
$db = new PDO('mysql:host=localhost;dbname=Parkings', $usuari, $contrassenya);
  
  
if(isset($_GET['codie']))     // Existirà la variable si em fet clic sobre un enllaç Esborrar
{                                        // al que li hem passat el paràmetre (utilitzant ?codie=valor) amb el valor de la clau del que volem esborrar
  
$sql = "delete from Parking where codi=:codi";
$ordre = $db->prepare($sql);
$ordre->bindParam(':codi',$_GET['codie']);
$ordre->execute();
  
}
  
if(isset($_POST['actualitzar'])) // Existirà la variable si em clicat al botó de submit del formulari d'actualitzar
{           
$sql = "Update Parking set cp=:cp,adreca=:adreca,preuMinut=:preuMinut where codi=:codi";
$ordre = $db->prepare($sql);
$ordre->bindParam(':codi',$_POST['codi']);
$ordre->bindParam(':cp',$_POST['cp']);
$ordre->bindParam(':adreca',$_POST['adreca']);
$ordre->bindParam(':preuMinut',$_POST['preuMinut']);
$ordre->execute();
  
}
  
if(isset($_POST['afegir']))   // Existirà la variable si em clicat al botó de submit del formulari d'alta
{
  
  
// versio 1: construim la cadena de l'ordre sql concatenant els valors enviats pel formulari. És fàcil cometre errors i es Poc Segur!
/*
$sql = "insert into Parking(cp,adreca,preuMinut) values
('".$_POST['cp']."','".$_POST['adreca']."','".$_POST['preuMinut']."')";
$ordre = $db->prepare($sql);
$ordre->execute();
*/
  
// versio 2: Lligam de paràmetres a través d'un array  associatiu
/*
$sql = "insert into Parking(cp,adreca,preuMinut) values (:cp,:adreca,:preuMinut)";
echo $sql;
$ordre = $db->prepare($sql);
$valors[':cp']=$_POST['cp'];
$valors[':adreca']=$_POST['adreca'];
$valors[':preuMinut']=$_POST['preuMinut'];
$ordre->execute($valors);
*/
// versio 3: lligam de paràmetres a través del mètode bindParam
  
$sql = "insert into Parking(cp,adreca,preuMinut) values (:cp,:adreca,:preuMinut)";
$ordre = $db->prepare($sql);
$ordre->bindParam(':cp',$_POST['cp']);
$ordre->bindParam(':adreca',$_POST['adreca']);
$ordre->bindParam(':preuMinut',$_POST['preuMinut']);
$ordre->execute();
  
}
  
// Generació d'una taula amb tots els pàrkings i amb les operacions a realitzar per cada registre
  
$consulta = $db->prepare("select codi,cp,adreca,preuMinut from Parking");
$consulta->execute();
$llistaP= $consulta->fetchAll();
echo "<table border=1>";
echo "<tr><td>Codi</td><td>cp</td><td>Adreça</td><td>Preu minut</td><td>Operacio</td></tr>";
foreach($llistaP as $p)
{
echo "<tr>";
echo "<td>".$p['codi']."</td><td>".$p['cp']."</td><td>".$p['adreca']."</td><td>".$p['preuMinut'].
"</td>";
echo "<td><a href='".$_SERVER['PHP_SELF']."?codie=".$p['codi']."'> Esborrar </a>";
echo "<a href='".$_SERVER['PHP_SELF']."?codia=".$p['codi']."'> Actualitzar </a>";
echo "<a href='operarPlaca.php'>Placa</a></td>";
echo "</tr>";
}
echo "</table>";
  
// S'ha clicat sobre l'enllaç d'actualitzar un registre
  
if(isset($_GET['codia'])) // Existirà la variable si em clickat sobre un enllaç d'actualitzar,
{                                      // al que li hem passat el paràmetre (utilitzant ?codia=valor) amb el valor de la clau que volem modificar
  
  // Obtinc el registre que es vol modificar
  
$sql = "Select codi,cp,adreca,preuMinut from Parking where codi=:codi";
$ordre = $db->prepare($sql);
$ordre->bindParam(':codi',$_GET['codia']);
$ordre->execute();
$p = $ordre->fetch();
  
// i el mostro en un formulari per a que es puguin canviar els seus valors
  
  
echo '<form method="POST" action='.$_SERVER['PHP_SELF'].' >';
  
echo ' <input type="hidden" name="codi" value="'.$p['codi'].'"><br>';
echo 'cp: <input type="text" name="cp" value="'.$p['cp'].'"><br>';
echo 'Adreça: <input type="text" name="adreca" value="'.$p['adreca'].'"><br>';
echo 'Preu Minut: <input type="text" name="preuMinut" value="'.$p['preuMinut'].'"><br>';
echo '<input type="submit" class="btn-info" name="actualitzar" value="actualitzar">';   // El nom del botó ens servirà per saber si l'usuari ha clicat al mateix
echo '</form> ';
  
}
else
{  
  
// Formulari per introduir les dades d'un nou parking
  
echo '<form method="POST" action'.$_SERVER['PHP_SELF'].' >';
echo 'cp: <input type="text" name="cp"><br>';
echo 'Adreça: <input type="text" name="adreca"><br>';
echo 'Preu Minut: <input type="text" name="preuMinut"><br>';
echo '<input type="submit" class="btn-info" name="afegir" value="Afegir">';     // El nom del botó ens servirà per saber si l'usuari ha clicat al mateix
echo '</form> ';
  
}
?>
  #2 (permalink)  
Antiguo 24/02/2014, 10:28
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paguinación de un archivo php

como mínimo necesitas pasar a una variable el número total de registros que tienes en la BD y el número de página actual.

a partir de ahí hacer el cálculo:

-dividir el número de registros entre los resultados que quieres mostrar por página para obtener todas las páginas posibles.

eso es para un paginador básico, se va complicando en el momento que comienzas a mostrar rangos de páginas tanto hacia adelante como hacia atrás, además de botones de atajo para descender de 20 en 20 páginas o números mayores y resolver el problema de que cuando borras un último registro de la última página que el programa retroceda una página y no dar el error de registros no encontrados en los límites indicados en la consulta a la BD.

recientemente he creado esta clase que soluciona la paginación excepto el último problema que acabo de describir (tengo que implementárselo) y botones de atajo que tampoco los he incorporado por necesidades propias. con un poco de imaginación sí se podría.

otro consejo que me dieron (estaría bien seguirlo) aunque no lo he seguido por también necesidades propias, es trabajar la clase como un singleton, para eso habría que modificarla.

tal cual está funciona y la puedes utilizar o bien cambiarla a tu gusto o también aprender de ella.

(te pongo la clase en el siguiente mensaje, no entra por completo en un solo post, así que partiré la clase en dos)

espero haberte ayudado.
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 24/02/2014, 10:29
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paguinación de un archivo php

Código PHP:
Ver original
  1. <?php
  2.  
  3. //  ==========================
  4. //  = Realiza calculos para paginar resultados =
  5. //  ==========================
  6.  
  7. /*
  8.  */
  9.  
  10.  /*
  11.   * sistema que consiste en una paginación partiendo desde la pagina 0
  12.   *
  13.   * crea un array que consta de los valores para la pagina actual, valores para botones circundantes anteriores a la pagina actual,
  14.   * valores para los botones circundantes posteriores a la pagina actual,
  15.   * un valor para el boton anterior a la pagina actual y un valor para un boton posterior a la pagina actual.
  16.   *
  17.   * tambien incluye el metodo currentPages por si el developer quisiera mostrar el conjunto de resultados
  18.   * que esta utilizando el usuario.
  19.   *
  20.   * ejemplo de resultado final con la configuracion por defecto
  21.   *
  22.   *     surround_before     before_button       page       after_button     surround_after     total_pages     current_pages
  23.   *     0 1 2 3 4               4                5             6            6 7 8 9 10              10         [a partir del registro] 500
  24.   */
  25.  
  26. class Paginator
  27. {
  28.     /*
  29.      * propiedades
  30.      */
  31.      
  32.     //resultados totales
  33.     private $totalResultsSet;
  34.      
  35.     //numero de resultados por pagina
  36.     private $resultsPage = 10;
  37.      
  38.     //numero de pagina actual
  39.     private $page;
  40.    
  41.     //registro actual que esta usando el usuario
  42.     private $currentPages;
  43.    
  44.     //numero de paginas totales
  45.     private $totalPages;
  46.      
  47.     //numero de paginas anteriores
  48.     private $pagesBefore    =   5;
  49.      
  50.     //numero de paginas siguientes
  51.     private $pagesAfter =   5;
  52.    
  53.     //pagina anterior
  54.     private $beforeButton;
  55.    
  56.     //pagina siguiente
  57.     private $afterButton;
  58.    
  59.     //botones circundantes anteriores
  60.     private $surroundBefore   =   array();
  61.    
  62.     //botones circundantes posteriores
  63.     private $surroundAfter  =   array();
  64.          
  65.     //resultado de un metodo
  66.     private $result =   array();
  67.    
  68.     // action URL, para los botones del paginador
  69.     private $url;
  70.    
  71.     //identificador, identifica el objeto que esta paginando
  72.     private    $id;
  73.    
  74.     /*
  75.      * para iniciar tanto las propiedades como los calculos basicos para toda la clase
  76.      *
  77.      *      los parametros son
  78.      * $totalResultsSet = numero total de resultados a paginar en la BD
  79.      * $page            = pagina que solicita el usuario
  80.      * $url             = la url donde se encuentra el usuario; por ejemplo: www.web.com?camisetas (es necesario haber iniciado la url con ?)
  81.      * $id              = id es el identificador del objeto a paginar; por ejemplo: www.web.com?camisetas&color=rojas&page_camisetas=2
  82.      *
  83.      *  (donde "page_camisetas" es el id y "2" es la pagina para mostrar al usuario)
  84.      */
  85.     function    __construct($totalResultsSet, $page, $url, $id)
  86.     {
  87.         $this->totalResultsSet    =   $totalResultsSet;
  88.        
  89.         $this->page =   $page;
  90.        
  91.         $this->totalPages   =   $this->calcTotalPages($totalResultsSet, $this->resultsPage);
  92.        
  93.         $this->currentPage  =   $this->currentPages($page, $this->resultsPage);
  94.        
  95.         $this->url  =   $url;
  96.        
  97.         $this->id   =   $id;
  98.     }
  99.    
  100.     /*
  101.      * calcula las paginas totales/page
  102.      */
  103.     public  function    calcTotalPages($totalResultsSet, $resultsPage)
  104.     {
  105.         //divide los resultados totales entre los resultados a mostrar por pagina
  106.         return  $this->totalPages   =  ceil($totalResultsSet    /   $resultsPage);
  107.     }
  108.    
  109.     /*
  110.      * calcula el conjunto de registros que esta empleando el usuario/currentPages
  111.      */
  112.     public  function    currentPages($page, $resultsPage)
  113.     {
  114.         //multiplica la pagina actual por los resultados por pagina
  115.         return  $this->currentPages  =   ceil($page   *   $resultsPage);
  116.     }
  117.    
  118.     /*
  119.      * calcula las paginas circundantes anteriores/surround_before
  120.      */
  121.     public  function    surroundPagesBefore()
  122.     {  
  123.         //resta la pagina menos el numero de paginas anteriores en el centro
  124.         $pagesBefore  =   $this->page   -   $this->pagesBefore;
  125.        
  126.         //comienza a crear botones hasta llegar a la pagina actual
  127.         for($i=$pagesBefore, $j=1; $i < $this->page AND $j<=$this->pagesBefore; $i++ AND $j++)
  128.         {
  129.             if($i>=0)
  130.             {
  131.                 array_push($this->surroundBefore,   array(
  132.                                                                                         'page'  =>$i,
  133.                                                                                         'url'      =>$this->createURL($this->url, $this->id, $i)
  134.                                                                                         ));
  135.             }
  136.         }
  137.        
  138.         //sino retorna false para que no muestre el boton anterior
  139.         if(empty($this->surroundBefore))
  140.         {
  141.             $this->surroundBefore   =   FALSE;
  142.         }
  143. ?>
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 24/02/2014, 10:33
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paguinación de un archivo php

Código PHP:
Ver original
  1. <?php
  2.         return  $this->surroundBefore;
  3.     }
  4.    
  5.     /*
  6.      * calcula las paginas circundantes posteriores/surroundAfter
  7.      */
  8.     public  function    surroundPagesAfter()
  9.     {  
  10.         //suma a la pagina actual las paginas configuradas para mostrar despues
  11.         $pageAfter  =   $this->page   +   1;
  12.        
  13.         //comienza a crear tantos botones como paginas sean posibles
  14.         for($i=$pageAfter, $ji=1; $i < $this->totalPages AND $ji<=$this->pagesAfter; $i++ AND $ji++)
  15.         {
  16.             if($i>$this->page)
  17.             {
  18.                 array_push($this->surroundAfter,   array(
  19.                                                                                         'page'  =>$i,
  20.                                                                                         'url'      =>$this->createURL($this->url, $this->id, $i)
  21.                                                                                      ));
  22.             }
  23.         }
  24.        
  25.         //asigna false para que no muestre botones posteriores
  26.         if(empty($this->surroundAfter))
  27.         {
  28.             $this->surroundAfter   =   FALSE;
  29.         }
  30.        
  31.         return  $this->surroundAfter;
  32.     }
  33.    
  34.     /*
  35.      * crea el boton anterior/beforeButton
  36.      */
  37.     public  function    beforeButtons()
  38.     {
  39.         //resta 1 a la pagina actual
  40.         $pageBefore  =   ceil($this->page  -   1);
  41.        
  42.         //si el resultado anterior indica que no da un valor negativo
  43.         if($pageBefore >=0)
  44.         {
  45.             $this->beforeButton  =   array(
  46.                                                                 'page'  =>$pageBefore,
  47.                                                                 'url'      =>$this->createURL($this->url, $this->id, $pageBefore)
  48.                                                                );
  49.         }
  50.        
  51.         //sino asigna false para no mostrar boton anterior
  52.         else
  53.       {
  54.             $this->beforeButton  =   FALSE;
  55.         }
  56.      
  57.         return $this->beforeButton;
  58.     }
  59.    
  60.     /*
  61.      * crea el boton siguiente/afterButton
  62.      */
  63.     public  function    afterButtons()
  64.     {  
  65.         //suma a la pagina actual 1
  66.         $afterButton    =   $this->page   +   1;
  67.        
  68.         //si el resultado anterior es menor o igual a las paginas totales posibles
  69.         if($afterButton <  $this->totalPages)
  70.         {
  71.             $this->afterButton  =   array(
  72.                                                              'page'  =>$afterButton,
  73.                                                              'url'      =>$this->createURL($this->url, $this->id, $afterButton)
  74.                                                             );
  75.         }
  76.         else
  77.         {
  78.             $this->afterButton  =   FALSE;
  79.         }
  80.        
  81.         return  $this->afterButton;
  82.     }
  83.    
  84.     /*
  85.      * crea el array definitivo con todos los valores necesarios para todos los botones/result
  86.      */
  87.     public  function    paginator()
  88.     {
  89.         //comprueba que la pagina que ha enviado el usuario no sea mayor que el total de resultados posibles
  90.         //tampoco que sea inferior a 0
  91.         if($this->page  <=  $this->totalPages   AND $this->page>=0)
  92.         {
  93.             $this->result   =   array(
  94.                                                         'page'=>$this->page,
  95.                                                         'surround_before'   =>$this->surroundPagesBefore(),
  96.                                                         'surround_after'    =>$this->surroundPagesAfter(),
  97.                                                         'before_button' =>$this->beforeButtons(),
  98.                                                         'after_button'  =>$this->afterButtons(),
  99.                                                         'total_pages'   =>$this->totalPages,
  100.                                                         'current_pages' =>$this->currentPages,
  101.                                                         'total_results_set' =>$this->totalResultsSet,
  102.                                                         'limit_since' =>$this->currentPages,
  103.                                                         'limit_result_set'  =>$this->resultsPage
  104.                                                     );
  105.                                                                                
  106.         }
  107.        
  108.         //si el usuario intentara romper el paginado poniendo páginas falsas entonces asigna FALSE
  109.         else
  110.       {
  111.             $this->result   =   FALSE;
  112.         }
  113.        
  114.         return  $this->result;
  115.     }
  116.  
  117.     /*
  118.      * busca y sustituye un patron dentro de una URL para
  119.      * eliminar ese patron y sustituirlo para crear una nueva URL
  120.      * evitando acumular paginaciones de un mismo objeto en la URL
  121.      *
  122.      * evita, por ejemplo:          ?page_camisetas=1&page_camisetas=2&page_camisetas=3
  123.      */
  124.     public  function    createURL($url, $id, $page)
  125.     {
  126.         //si el identificador no se encuentra en la url
  127.         if(substr_count($url, $id)  ==0)
  128.         {
  129.             //agrega al final de la url el identificador y el valor que le corresponde
  130.             $url  =   $url."&".$id."=".$page;
  131.         }
  132.        
  133.         //sino busca y reemplaza el identificador en la url por su nuevo valor
  134.         else
  135.       {
  136.           $url  =   preg_replace("/(".$id."=[[:digit:]]*)/i", $id."=".$page, $url);
  137.       }
  138.        
  139.         return  $url;
  140.     }
  141. }
  142. ?>

No olvides quitar del final del primer post que inicia la clase el cierre de PHP "?>"

y del segundo post que termina la clase la apertura de PHP "<?php" para así tener todo el código sin aperturas y cierres de PHP entre medias de la clase.
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: registro, select, sql, variable
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 08:20.