Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/08/2008, 04:37
Avatar de Dundee
Dundee
 
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
De acuerdo Paginando con una sola consulta

Bueno antes de todo gracias a tod@s por la ayuda que siempre he recibido de estos foros y que me ha ayudado en muchas ocasiones a resolver mis dudas; creo que es hora de contribuir con mi granito de arena un poquillo.

Hace mucho creé un script para paginar resultados de una consulta a la Db . pero el inconveniente era que cada vez que pasabas de página tenías que hacer una consulta tipo
$query_anuncios = "SELECT Location ,Title l FROM posts WHERE
CatCode='$cat' AND SubCatCode='$subcat $limit,5' ";

Es decir que tenías que definir un rango cada vez , cosa que no estaba del todo mal púes solo buscaba esa cantidad de filas que le indicabas y no todas; despúes de ver una pila de scripts que hacían los mismo , pensé en mejorar el tema realizando una sola consulta; del siguiente modo. (voy a poner los dos archivos que tengo).



//Aquí solo recibimos los resultados iniciales a mostrar y los pasamos a una función
muestra.php
Código:
    <div id="adds">
    	
       <? 
	 if (!isset($_GET['page']) )
		$page=1;
	
	else
		$page=$_GET['page'];
		
	    show_adds( $_GET['cat'],$_GET['subcat'],$page); ?>

           
     </div>
Función

Código:
function show_adds($cat,$subcat,$city,$page) {

//Guardamos la consulta entera en una variable de sesión
if (!$_SESSION['adds'])
$_SESSION['adds']=select_adds($cat,$subcat,$city);

  //numero de anucnios por página
	   	$tamaño_pag=4;
		
		//Calculamos el anuncio primero y último a mostrar
		//Si es la primera vez
		if ($page==1)
			{
			$lastAdd=5;
			$beginAdd=0;
			}
		else
			{	
			$lastAdd=$page+5;
			$beginAdd=$page;
			$forward=$beginAdd-5;
			}

echo "Resultados de $beginAdd <> $lastAdd";
if ($page>1)
echo "<a href='$PHP_SELF?page=$forward'>Atras</a>";
if (count($_SESSION['adds'])>$lastAdd )
echo "-<a href='$PHP_SELF?page=$lastAdd'>Siguiente</a>";

for ($i=$beginAdd;$i<$lastAdd;$i++) {

	if ($_SESSION['adds'][$i][0] != NULL ) { //MOSTRMOS SOLO LOS RESULTADOS SI HAY DATOS
echo "<p><span class='items_city'>Ciudad". $_SESSION['adds'][$i][0]."<br></p>" ;
echo "<p><span class='items_city'>".$_SESSION['adds'][$i][1]."</span><br>" ;
echo "<span class='items_texto'>".nl2br(ltrim(ucfirst($_SESSION['adds'][$i][2]))) ."</span><br>" ;
echo "<br><span class='items_email'>Email:".$_SESSION['adds'][$i][3] ."</span><br></p>" ;
	
	}
}

}
Bueno resumiendo , con solo poner en la página que queramos paginar lo que muestro en mostrar.php podemos paginar cualquier resultado. (logicamente dentro de la función indicar la consulta a vuestra Bd etc etc).

Seguramente para algunos esto era ya obvio pero para muchos creo que les puede servir mi ejemplo púes como he dicho antes casi todos los scripts que hasta ahora he visto hacen la consulta una y otra vez y eso para una bd puede resultar un poco duro cuando hay muchas conexiones simultáneas.

Nota: A cada página que enlace la página donde mostráis los resultados es necesario destruir la sesión , púes si el usuario hace otro tipo de consulta es necesario destruir esta variable de sesión para que se llene otra nueva con los resultados actualizados.
Código:
//Si tenemos cargada una sesión anterior de resultados la eliminamos
if ($_SESSION['adds']) 
			unset ($_SESSION["adds"] );
Un saludo y espero os sirva esto de algo.

Cualquier sugerencia para mejorar esto (que es muy muy mejorable seguro) será muy bien aceptada.