Comunidad de diseño web y desarrollo en internet online

Problema de Busqueda y Paginacion de Resultado

Citar            
MensajeEscrito el 24 Sep 2009 03:26 am
hola amigo tengo varios dia tratando de tener una buena paginacion de mi busqueda pero
no dominio hacerlo miren

tengo un index.php


este tiene su busqueda y funciona bien el codigo es :
index.php

Código PHP :

<form action="resultado.php" method="get">
Busqueda Por Sueldo:
<input type="text" name="condicion" size="22" maxlength="150">
<input type="submit" value="Buscar">
</form> 


bueno este envie perfecto los datos a mi resultado.php que es donde se encuentra mi
pgainacion, EL PRIMER envio funciona perfecto


mi primera busqueda funciona perfecta pero cuando
utilizo las paginacion [1] [2] se vuelve todo un desatre


bueno esto creo que me pasa por que en lo de la paginacion debiera poner algo
como <a href="resultado.php?pagina=<? echo $i; ?>&condicion=<? echo urlencode("$condicion");?>"><? echo $i; ?></a>
pero no se miren mi codigo

resultado.php

Código PHP :

<?php 

$link = mysql_connect("localhost","root","mypassword"); 
mysql_select_db("mypase", $link); 

if (!isset($_GET['pag'])) $pag = 1; // Por defecto, pagina 1
else $pag=$_GET['pag'];
$tampag = 5;
$reg1 = ($pag-1) * $tampag;

$condicion = urldecode ($_GET['condicion']);
$condicion = stripslashes($condicion);


$result = mysql_query("SELECT nombres, sueldo FROM empleado WHERE sueldo LIKE $condicion",$link); 
$total = mysql_num_rows($result);
if (mysql_num_rows($result)){ 
  echo "<table border = '1'> \n"; 
  echo "<tr><td>Nombre</td><td>Sueldo</td></tr> \n";
  for ($i=$reg1; $i<min($reg1+$tampag, $total); $i++) {
    mysql_data_seek($result, $i);
    $row = mysql_fetch_array($result);
    echo "<tr><td>".$row["nombres"].
      "</td><td>".$row["sueldo"]."</td></tr> \n"; 
  }
  echo "</table> \n"; 
}
else
  echo "¡ No se ha encontrado ningún registro !";
  
  echo paginar($pag, $total, $tampag,  "resultado.php?pag=");
  
function paginar($actual, $total, $por_pagina, $enlace, $maxpags=0) {
  $total_paginas = ceil($total/$por_pagina);
  $anterior = $actual - 1;
  $posterior = $actual + 1;
  $minimo = $maxpags ? max(1, $actual-ceil($maxpags/2)): 1;
  $maximo = $maxpags ? min($total_paginas, $actual+floor($maxpags/2)): $total_paginas;
  if ($actual>1)
    $texto = "<a href=\"$enlace$anterior$condicion\">&laquo;</a> ";
  else
    $texto = "<b>&laquo;</b> ";
  if ($minimo!=1) $texto.= "... ";
  for ($i=$minimo; $i<$actual; $i++)
    $texto .= "<a href=\"$enlace$i\">$i</a> ";
  $texto .= "<b>$actual</b> ";
  for ($i=$actual+1; $i<=$maximo; $i++)
    $texto .= "<a href=\"$enlace$i\">$i</a> ";
  if ($maximo!=$total_paginas) $texto.= "... ";
  if ($actual<$total_paginas)
    $texto .= "<a href=\"$enlace$posterior\">&raquo;</a>";
  else
    $texto .= "<b>&raquo;</b>";
  return $texto;
  
 }
?>


este es mi problema se que para algunos es facil resolver pero por favor
ayudenme con eso ya que no soy un master en esto de php

miren ahi esta en link del programita en php
le dejo este link por si quieren ver lo que le explico

http://vistacomercial.webcindario.com

Ayudenme Por Favor :cry:

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox
Citar            
MensajeEscrito el 24 Sep 2009 03:34 am
buscaste en google ?

http://www.codigolandia.com/art-Buscador+con+Paginacion+Incluida-php-17.tc

hay tienes algo como lo que necesitas leelo y arma el tuyo

Por talcual

686 de clabLevel



 

Colombia

firefox
Citar            
MensajeEscrito el 24 Sep 2009 03:54 am
esta mal la logica

primero obtén el numero de filas que te dara la consulta, esto haslo con una consulta especial

Código MySQL :

SELECT COUNT(nombres) FROM empleado WHERE sueldo LIKE numeromiserable


el resultado de esto guardalo en una variable de session

Código PHP :

$_SESSION['numeroEmpleados'] 


este numero lo divides por la cantidad de resultados que deseas por pagina osea por la variable $rango

el numero de la $pagina por $rango dara la fila del resultado desde el cual quieres ver, y $rango es el numero de filas que mostraras



Código PHP :

$filaActual= $pagina * $rango;
$sql="SELECT nombres, sueldo FROM empleado WHERE sueldo LIKE numeromiserable LIMIT $filaActual ,$rango";
 

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 24 Sep 2009 03:58 am
@tacual

gracias amigo pero habia visto ese tuto anterior mente
y en realidad me lo encuntro muy corto de info ademas
dice que es para no complicar a los novatos y creo que
ese hace todo lo contrario:: prefiero romperme la cabeza
con el que tengo i buscarla solucion.

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox
Citar            
MensajeEscrito el 24 Sep 2009 04:44 am
NO puede Hacer Nothing
Me arroja errores quise poner a funcionar la session pero la cague
:cry::cry::cry::cry::cry::cry::cry:

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox
Citar            
MensajeEscrito el 24 Sep 2009 04:56 am

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 24 Sep 2009 05:36 am
Con MySQL no hace falta hacer un query con COUNT para paginación.

Código PHP :

<?php  
 
$link = mysql_connect("localhost","root","mypassword");  
mysql_select_db("mypase", $link);  
 
$pag = (int) $_GET["pag"]; 

if ($pag < 1)
{
   $pag = 1;
}
$tampag = 5; 
$offset = ($pag-1) * $tampag; 
 
$condicion = urldecode ($_GET['condicion']); 
$condicion = stripslashes($condicion); 
 
 
$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS nombres, sueldo FROM empleado WHERE sueldo LIKE $condicion LIMIT $offset, $tampag ",$link); 

$result_total = mysql_query("SELECT FOUND_ROWS() as total");
$row_total = mysql_fetch_assoc($result_total);

$total = $row_total["total"];

while ( $row = mysql_fetch_assoc ($result))
{
     // imprime los registros
}
/*paginador*/
$total_pag = ceil($total/$tampag);
for( $i = 1; $i<= $total_pag; $i++ )
{
    // imprime los numeros de paginas
}
/*paginador*/
 

?>


saludos

PD: en PostgreSQL no hay un equivalente de SQL_CALC_FOUND_ROWS y FOUND_ROWS de MySQL, por lo que si hace falta hacer query con COUNT, de todas formas ya le di la vuelta y tampoco lo hago :P

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 24 Sep 2009 06:37 am
excelente funcion no la conocia gracias Maikel :D
http://dev.mysql.com/doc/refman/5.0/es/information-functions.html
[quote='referencias mysql']
FOUND_ROWS()

Un comando SELECT puede incluir una cláusula LIMIT para restringir el número de registros que el servidor retorna al cliente. En algunos casos, es deseable saber cuántos registos habría retornado el comando sin LIMIT, pero sin volver a lanzar el comando. Para obtener este conteo de registros, incluya la opción SQL_CALC_FOUND_ROWS en el comando SELECT , luego invoque FOUND_ROWS() :

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

El segundo SELECT retorna un número indicando cuantos registros habría retornado el primer SELECT sin la cláusula LIMIT . (Si el comando precendente no incluye la opción SQL_CALC_FOUND_ROWS , FOUND_ROWS() puede retornar un resultado distinto cuando se usa LIMIT y cuando no.)

Tenga en cuenta que si usa SELECT SQL_CALC_FOUND_ROWS, MySQL debe calcular cuántos registros hay en el conjunto de resultdos completo. Sin embargo, esto es más rápido que ejecutar la consulta de nuevo sin LIMIT, ya que el conjunto de resultados no necesita ser enviado al cliente.

SQL_CALC_FOUND_ROWS y FOUND_ROWS() pueden ser útiles en situaciones donde puede querer restringir el número de registros que retorna una consulta, pero también determinar el número de registros en el conjunto de resultados entero sin ejecutar la consulta de nuevo. Un ejemplo es el script Web que presenta una salida paginada conteniendo enlaces a las páginas que muestran otras secciones de un resultado de búsqueda. Usando FOUND_ROWS() puede determinar cuántas páginas necesita para el resto de resultados.
[/mysql]

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 24 Sep 2009 07:49 am
@ Maikel & @ Inyaka
Muchas Gracias

la selecion y busqueda de archivo funciona de maravilla pero cuando estube
poniendo mi paginacion pero al parecer me produce como un duplicacion de paginacion



Código PHP :

<?php    
   
$link = mysql_connect("localhost","rootl","mypasswordl");    
mysql_select_db("mybase", $link);    
   
$pag = (int) $_GET["pag"];   
  
if ($pag < 1)  
{  
   $pag = 1;  
}  
$tampag = 5;   
$offset = ($pag-1) * $tampag;   
   
$condicion = urldecode ($_GET['condicion']);   
$condicion = stripslashes($condicion);   
   
   
$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS nombres, sueldo FROM empleado WHERE sueldo LIKE $condicion LIMIT $offset, $tampag ",$link);   
  
$result_total = mysql_query("SELECT FOUND_ROWS() as total");  
$row_total = mysql_fetch_assoc($result_total);  
  
$total = $row_total["total"];  
//contruyendo mi tabla 
echo "<table border = '1'> \n";  
echo "<tr><td>Nombre</td><td>Sueldo</td></tr> \n"; 
while ( $row = mysql_fetch_assoc ($result))  
 
{  
  echo "<tr><td>".$row["nombres"]. 
      "</td><td>".$row["sueldo"]."</td></tr> \n";    // imprime los registros  
}  
echo "</table> \n"; 
 
  
/*paginador*/  
$total_pag = ceil($total/$tampag); 
for( $i = 1; $i<= $total_pag; $i++ ) 
 
echo paginar($pag, $total, $tampag,  "resultado.php?pag="); 
 
function paginar($actual, $total, $por_pag, $enlace, $maxpags=0) 
 {  
 $total_pag = ceil($total/$por_pag); 
  $anterior = $actual - 1; 
  $posterior = $actual + 1; 
  $minimo = $maxpags ? max(1, $actual-ceil($maxpags/2)): 1; 
  $maximo = $maxpags ? min($total_pag, $actual+floor($maxpags/2)): $total_pag; 
  if ($actual>1) 
    $texto = "<a href=\"$enlace$anterior$condicion\">&laquo;</a> "; 
  else 
    $texto = "<b>&laquo;</b> "; 
  if ($minimo!=1) $texto.= "... "; 
  for ($i=$minimo; $i<$actual; $i++) 
    $texto .= "<a href=\"$enlace$i\">$i</a> "; 
  $texto .= "<b>$actual</b> "; 
  for ($i=$actual+1; $i<=$maximo; $i++) 
    $texto .= "<a href=\"$enlace$i\">$i</a> "; 
  if ($maximo!=$total_pag) $texto.= "... "; 
  if ($actual<$total_pag) 
    $texto .= "<a href=\"$enlace$posterior\">&raquo;</a>"; 
  else 
    $texto .= "<b>&raquo;</b>"; 
  return $texto;   // imprime los numeros de paginas  
}  
/*paginador*/  
   
  
?>




me arroja todos asi << 1 2 >> << 1 2 >> doblemente y no funciona cuando le doy alguno link

!! tambien probe poniendo en el fin solo el codigo como me dijo inyaka
sin el codigo largo de paginacion

Código PHP :

/*paginador*/ 
$total_pag = ceil($total/$tampag); 
for( $i = 1; $i<= $total_pag; $i++ ): ?> 
<?php echo $i; ?>
  <resultado.php?pag=<?php echo $i; ?>> 
<?php endfor; 
/*paginador*/ ?>



este solo me presenta los numero y analizando por mi cuenta comence
le puse los link de esta forma

Código PHP :

<a href="resultado.php?pag=<?php echo $i; ?>"> 
   <?php echo $i; ?>
</a> 
  <?php endfor; 
/*paginador*/ ?>



pero ninguno no busca la paginacionm solamente del archivo de busqueda

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox
Citar            
MensajeEscrito el 24 Sep 2009 07:52 am
:cry::cry::cry:

Necesito ayuda como poner ese codigo de paginacion bien por favor Help

Llevo como casi dos semana en esto y no puedo resolver hasta me duele la

cabeza de tanto darle mento a este jodio codigo que me esta Frikiando

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox
Citar            
MensajeEscrito el 24 Sep 2009 04:01 pm

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 01 Oct 2009 02:53 pm
Bueno quizás sea tarde pero leí tu pregunta y tengo una respuesta, yo uso tu paginación en varias páginas aunque modifique algunas cosas, te pongo tu versión del código y luego el mio:

Primero las funciones:

Código PHP :

      public function paginar($actual, $total, $por_pagina, $enlace, $maxpags=0) {
      
         $total_paginas = ceil($total/$por_pagina); 
         $anterior = $actual - 1; 
         $posterior = $actual + 1; 
         $minimo = $maxpags ? max(1, $actual-ceil($maxpags/2)): 1; 
         $maximo = $maxpags ? min($total_paginas, $actual+floor($maxpags/2)): $total_paginas; 
         if ($actual>1){
            $texto = "<a href=\"$enlace$anterior$condicion\" class=\"numeros\">&laquo;</a> "; 
         }else{
            $texto = "<span class=\"activo\"><b>&laquo;</b></span>"; 
         }
         if ($minimo!=1){
            $texto.= "... "; 
         }
         for ($i=$minimo; $i<$actual; $i++){
            $texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> "; 
         }         
         $texto .= "<span class=\"activo\"><b>$actual</b></span>"; 
         
         for ($i=$actual+1; $i<=$maximo; $i++){
            $texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> "; 
         }         
         
         if ($maximo!=$total_paginas){
            $texto.= "... ";
         }
           
         if ($actual<$total_paginas){
            $texto .= "<a href=\"$enlace$posterior\" class=\"numeros\">&raquo;</a>"; 
         }else{
            $texto .= "<span class=\"activo\"><b>&raquo;</b></span>"; 
         }
         
         return $texto;          
      }
      
      public function totalpaginas($total, $por_pagina){
         $total_paginas = ceil($total/$por_pagina);
         return $total_paginas;
      }

      public function generarReporte($param="", $orden="", $reg="", $tampag=""){
         $query="select rpa.idanuncio, rpa.usuario, rpa.imagenprincipal, rpa.titulo, rpa.planta, rpa.dormitorios, rpa.precio, rpz.zona, rpa.tipo, rpa.metros2, rpa.preciom2, rpa.negociable, rpva.ventaalquiler, rpn.nuevoono, rpa.destacado, rpa.resumen, rpn.idestado, rpva.idestva from realpro_anuncio rpa, realpro_estado rpn, realpro_estva rpva, realpro_zona rpz where rpa.idestado=rpn.idestado and rpa.idestva=rpva.idestva and rpa.idzona=rpz.idzona";
         if($param!=""){
            $query.= "and rpva.idestva='".$param."'";
         }
         
         if($orden==""){
            $query.= " order by rpa.precio";
         }
         //if($reg!="" && $tampag!=""){
            $query.=" LIMIT ".$reg.", ".$tampag;
         //}
         $consulta=mysql_query($query);   
         return $consulta;
      }
      
      public function totalFilasReporte($param=""){
         $query="select count(rpa.idanuncio) from realpro_anuncio rpa, realpro_estado rpn, realpro_estva rpva, realpro_zona rpz where rpa.idestado=rpn.idestado and rpa.idestva=rpva.idestva and rpa.idzona=rpz.idzona";
         if($param!=""){
            $query.= "and rpva.idestva='".$param."'";
         }
         $consulta=mysql_query($query);   
         return $consulta;
      }

Luego los estilos que aplique:

Código HTML :

a.numeros{
   font-weight:bold;
   color:#000000;
   display:inline;
   text-decoration:none;
   background-color:#FFFFFF;
   border:groove 1px #000000;
   padding:2.5px;
   margin-right:1px;
   width:15px;
}

a.numeros:hover{
   color:#FFFFFF;
   background-color:#000000;
   text-decoration:none;
}

.activo{
   color:#0000FF;
   display:inline;
   text-decoration:none;
   background-color:#99CCCC;
   border:groove 1px #000000;
   padding:2.5px;
   margin-right:1px;
   width:15px;
}

Finalmente el código en la página implementada (reportes.php):

Código PHP :

<?php
   include "soporte.php";   
   if (!isset($_GET['pag'])){
      $pag = 1;
   }else{
      $pag = $_GET['pag'];
   } 
   $result = $fn->totalFilasReporte($param);
   list($total) = mysql_fetch_row($result);
   $tampag = 10;
   $reg1 = ($pag-1) * $tampag;      
   $query=$fn->generarReporte("","",$reg1, $tampag);
?>

Te muestro lo que hay en mi página de soporte basándome en patrones de diseño:

Código PHP :

<?php
   include "funciones/funciones.php";
   
   include "clases/conexion.php";   
   $cx=new Conexion;
   $cx->conectarDB();
   
   $fn=new Funciones;
        .
        .
        .
?>


Finalmente como llamo a la función paginar:

Código PHP :

<div align="left"><strong>Páginas </strong>
      <?php echo $fn->paginar($pag, $total, $tampag, "reportes.php?pag=");?>
    </div>


Me correo bien a nivel local espero te sirva, y esta es la versión modificada que sirve para que no aparezca tanto número en la paginación:

Código PHP :

      public function paginar($actual, $total, $por_pagina, $enlace) {
         $maximalista=28;
         //echo "TOTAL: ".$total."<p>";
         //echo "X PAGINA: ".$por_pagina."<p>";
         $totalpaginas = ceil($total/$por_pagina);
         if($totalpaginas<=$maximalista){$maximalista=($totalpaginas-1);}
         if($maximalista==0){$maximalista=1;}
         //echo "TOTAL PAGINAS: ".$totalpaginas."<p>";
         $anterior = $actual - 1;$posterior = $actual + 1;
         if ($actual>1){$texto = "<a href=\"$enlace$anterior\" class=\"numeros\">&laquo;</a> ";}else{$texto = "<span class=\"activo\"><b>&laquo;</b></span> ";}
         
         if($actual<=1){
            if($maximalista==1){$val1=1;}else{$val1=$maximalista+$actual;}
            if($totalpaginas<$val1){$val1=$totalpaginas;}
            for ($i=1; $i<=$val1; $i++){
               if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
            }
         }
         $entre2=ceil($maximalista/2);
         if($actual>1){
            if($actual>$maximalista){
               if($actual>=$totalpaginas){
                  //echo "p1<p>";
                  for ($i=($actual-$entre2); $i<=$actual; $i++){
                     if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
                  }   
               }else{
                  //echo "p2<p>";
                  if(($actual+$entre2)>=$totalpaginas){$val=$totalpaginas;}else{$val=$actual+$entre2;}
                  for ($i=($actual-$entre2); $i<=$val; $i++){
                     if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
                  }
               }

            }else{
               //echo "p3<p>";
               if(($actual-$entre2)<=0){$val=1;}else{$val=$actual-$entre2;}
               if(($actual+$entre2)>$totalpaginas){$val1=$totalpaginas;}else{$val1=$actual+$entre2;}
               if($actual<$maximalista){$val1=$maximalista;}
               for ($i=$val; $i<=$val1; $i++){
                  if($i==$actual){$texto .= "<span class=\"activo\"><b>$actual</b></span> ";}else{$texto .= "<a href=\"$enlace$i\" class=\"numeros\">$i</a> ";}
               }
            }
         }         
         if ($actual<$totalpaginas){$texto .= "<a href=\"$enlace$posterior\" class=\"numeros\">&raquo;</a>";}else{$texto .= "<span class=\"activo\"><b>&raquo;</b></span>";}
         return $texto;
      }
      
      public function totalpaginas($total, $por_pagina){
         $total_paginas = ceil($total/$por_pagina);
         return $total_paginas;
      }


Como te das cuenta en esta segunda no uso MAXPAG porque me parece innecesario, espero te sirva si todavía buscas una solución.

Atentamente,

Carlos Piñán.

Por AqU1LeS

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Oct 2009 06:00 pm
@carlos piñan

muchas gracias hermano me sera de buena utilidad

Por scowtmaster

21 de clabLevel



Genero:Masculino  

Rep Dom

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.