Hola! que tal, verán estoy tratando de hacer un paginador de resultados de un buscador de usuarios, pero lamentablemente no me sale, tengo este codigo, que es el mostrar_resultados.php, pero al hacer la busqueda en vez de mostrar 5 resultados me muestra 6, y al pasar a siguiente, me muestra todos los usuarios de la bd.
Entonces la pregunta es cómo hago para poder paginarlo bien?, hay algo que estoy haciendo mal? cuando la pagina ya existe como hago para cargarla y que siga manteniendo la consulta?
<?php
include('header.inc');
if(!$_SESSION['usuario']=='usuario'){
header("Location: index.php");// si no es igual a nick te direcciona al inicio u a otra pagina
}
include_once ("connect.php");
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil;
$query = mysql_query($s) or die(mysql_error());
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM members");
list($total) = mysql_fetch_row($result);
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
$result = mysql_query("SELECT sexo, interestin, pais, estadocivil FROM members
LIMIT $reg1, $tampag");
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
while($row = mysql_fetch_array($query)) {
?>
en la parte del html, muestro los detalles del usuario haciendo <?php echo $row['estadocivil'];?>
por ejemplo
y en el final de la pagina hago lo siguiente
<?php echo paginar($pag, $total, $tampag, "mostrar_resultados.php?pag="); ?>
Gracias por leer.
Pues primeramente creo que el código este:
if(!$_SESSION['usuario']=='usuario'){
header("Location: index.php");// si no es igual a nick te direcciona al inicio u a otra pagina
}
Necesita corregirse en la parte del if... porque 'usuario' es constante.
Y hasta donde tengo entendido, el LIMIT lo aplicas solamente a una query que nunca consultas, al menos en el código asi lo veo....
Hola, quité esa parte del if, pero sigue igual. que debo cambiar en el $result ?
Si bueno, lo que pasa es esto... tu quieres limitar los resultados de tu primera consulta $s.
Porque tecnicamente estas haciendo el fetch_row con el query de $s. Y en ningun lugar estás limitando la consulta.
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil;
Aqui te das cuenta que no estás haciendo ningun limit a la consulta, puesto que nunca variable lo tiene.
Lo que necesitas hacer es poner este código arriba de la query.
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
Y también agregar el limit a la consulta.
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil
." LIMIT $reg1, $tampag";
Bueno, MinusFour, hice lo que me indicaste, lo puse asi:
<?php
include('header.inc');
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
include_once ("connect.php");
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil
." LIMIT $reg1, $tampag";
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM members");
list($total) = mysql_fetch_row($result);
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
$query = mysql_query($s) or die(mysql_error());
while($row = mysql_fetch_array($query)) {
pero al darle a buscar no sale nada, la pagina en blanco. deberia buscar. cual puede ser el error?
Pues $reg1 ni $tampag están definidos. Fijate en mi post anterior.
Si, ahi me di cuenta, ahora poniendolo asi funciona, pero lo que pasa es que al pasar a la pagina siguiente sigue mostrandome todos los usuarios de la bd, en la unica que respeta es en la primera. pero no asi en las siguientes. existe algun problema en la url? en la forma de paginarlo?
yo al final del codigo pongo esto:
<?php echo paginar($pag, $total, $tampag, "mostrar_resultados.php?pag="); ?>
<?php
include('header.inc');
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
include_once ("connect.php");
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM members");
list($total) = mysql_fetch_row($result);
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil
." LIMIT $reg1, $tampag";
$query = mysql_query($s) or die(mysql_error());
while($row = mysql_fetch_array($query)) {
?>
Imprime la variable $pag antes del if(i!sset($pag))... y verifica si la estás pasando correctamente.
Lo hago con var_dump ? o con echo?
Con cualquiera...
No pasa nada al hacerlo, es lo mismo, lo que yo me pregunto, es como se hace para "conservar" los datos que se filtraron en la búsqueda y para que aparezcan en las paginas siguientes los usuarios con las mismas caracteristicas.
En vez de poner <?php echo paginar($pag, $total, $tampag, "show_results.php?pag="); ?>
deberia poner algo como <?php echo paginar($pag, $total, $tampag, "show_results.php?pag=".$url.""); ?>
?
A que te refieres? Cuando imprimias la variable $pag no cambiaba el valor?
Puse algo asi:
<?php
include('header.inc');
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
include_once ("connect.php");
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
echo $pag;
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM members");
list($total) = mysql_fetch_row($result);
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil
." LIMIT $reg1, $tampag";
$query = mysql_query($s) or die(mysql_error());
while($row = mysql_fetch_array($query)) {
?>
y no pasa nada. aparece <1><2> pero al presionar en la pagina 2 me muestra los resultados no que yo filtré sino todos los usuarios de la bd
Ese <1> <2> lo ves en la misma pagina? Estás seguro que es el echo que pusiste?
echo "<h1>Estas en la pagina: $pag</h1>";
Después haces click en los links y fijate si $pag cambia o no. Si no cambia es problema de la variable, si cambia es problema de la query....
Haciendo lo que dijiste dice Estas en la pagina : 1, los links cambian pag=1 pag=2; pero el tema es que si yo presiono la 2 no mantiene el rango de usuarios que estoy buscando, me muestra todos.
El punto es, cuando los links cambian, y visitas la nueva pagina con el nuevo argumento en &pag, cambia el texto? Dice Estás en la Pagina 2, 3, 4?
Ah, no no cambia, o sea el numero si cambia pero el Estas en la pagina, siempre se mantiene en 1
Si siempre dice Estás en la pagina 1 es porque no estás pasando bien la variable post.
prueba hacer
$pag = $_POST['pag'];
Antes de que se use $pag por supuesto.
Pero $pag no viene del buscador si yo pongo esto
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
$pag=$_POST['pag'];
no entiendo como deberia ser.
Si haces eso, la variable $pag obtiene el valor directamente de la variable HTTP pag.
Pero es que haciendo esto:
<?php
include('header.inc');
error_reporting(E_ALL ^ E_NOTICE);
session_name('deemoLogin');
session_start();
session_set_cookie_params(2*7*24*60*60);
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
$pag=$_POST['pag'];
include_once ("connect.php");
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
sigue diciendome lo mismo estas en la pagina 1
Prueba $_GET['pag'] entonces.
Ahora si, me salió, muchisimas gracias de verdad, te agradezco!!!
Puse <?php $pag=$_REQUEST['pag']; ?>
Hola, disculpas por volver a reflotar el tema, pero la cuestion es que ayer me olvidé de probar cuando iba hacia atrás el buscador. hacia adelante no hay problemas, sigue respetando los filtros pero hacia atras, vuelve a mostrarme todos los usuarios.
Dejo el código que tengo:
<?php
include('header.inc');
$id=$_SESSION["id"];
$usuario=$_SESSION["usuario"];
$pag=$_GET['pag'];
include_once ("connect.php");
$sexo = (!empty($_POST["sexo"])
? " sexo='".trim($_POST["sexo"])."'"
: "");
$interestin = (!empty($_POST["interestin"])
? (!empty($sexo)
? " AND interestin='".trim($_POST["interestin"])."'"
: " interestin='".trim($_POST["interestin"])."'")
: "");
$pais = (!empty($_POST["pais"])
? (!empty($sexo) || !empty($interestin)
? " AND pais='".trim($_POST["pais"])."'"
: " pais='".trim($_POST["pais"])."'")
: "");
$estadocivil= (!empty($_POST["estadocivil"])
? (!empty($sexo) || !empty($interestin) || !empty($pais)
? " AND estadocivil='".trim($_POST["estadocivil"])."'"
: " estadocivil='".trim($_POST["estadocivil"])."'")
: "");
$where = (!empty($sexo) || !empty($interestin) || !empty($pais) || !empty($estadocivil)
? " WHERE "
: "");
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM members");
list($total) = mysql_fetch_row($result);
$tampag = 5;
$reg1 = ($pag-1) * $tampag;
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
$s = "SELECT * FROM members "
. $where
. $sexo
. $interestin
. $pais
. $estadocivil
." LIMIT $reg1, $tampag";
$query = mysql_query($s) or die(mysql_error());
while($row = mysql_fetch_array($query)) {
?>
Para mostrar la paginacion:
<?php echo paginar($pag, $total, $tampag, "mostrar_resultados.php?pag="); ?>
A que te refieres con atrás? Hablas del anterior en el código o el boton de atrás del navegador?
No deberías tener problema con eso, porque no se estan cargando variables de formularios por post o algo parecido....
Prueba hacer de nuevo el echo (Estás en la pagina: $pag) y revisa la url que concuerde.
Hola MinusFour, bueno gracias por responder, me refiero al link por ejemplo hay tres paginas 1|2|3 si de la 1 paso a la 2 todo bien o de la 2 a la 3 pero cuando vuelvo a la 1 me vuelve a mostrar todos los usuarios.
La url está bien.
Asi que no sé cual puede ser el error. :huh:
Si la url está bien, entonces el link esta bien :/
Quieres decir que cuando le das click en "«" en tu pagina, te lleva a otra pagina que no tiene filtrado?
Claro por ejemplo «1 2 » estoy en la 2 y vuelvo a la 1 me muestra todos los usuarios de la bd, y no los que yo habia especificado.
Debe ser asi?
Algo para agregar, comentar que en la paginacion de resultados todo el codigo de la pagina se repite, o sea no solamente las tablas con los datos, sino toda la pagina eso está bien?, será eso el problema que produce lo que comentaba antes?
Realmente a esto de la paginacion no le encuentro la solucion.
Hola amigos, les hago una pequeña pregunta, como hago para ponerle si no encuentra resultados un mensaje de no se han encontrado resultados?
Respecto a tu duda acerca de la paginación, vuelve al echo como te dije, para ver que valor toma pag cuando te salen todos los resultados.
Y acerca de tu otra duda, puedes hacerlo con
<?php
if(mysql_num_rows($query) != 0){
desplegarData();
}
else{
echo "No hay datos";
}
?>
Te hago una pregunta, puede ser que el error, sea que se repite toda la pagina siempre, o sea yo tengo una tabla y abajo de esa tabla pongo el <?php echo paginar($pag, $total, $tampag, "show_results.php?pag="); ?>
Pero la cuestion es que debajo de cada tabla con los datos aparecen siempre links, y no uno solo
o sea
la tabla
<1><2>
otra tabla
<1><2>
y asi sucesivamente, puede ser ese el error?, que se me repite toda la pagina?
Puede que sea el while($row = mysql_fetch_array($query)) {
que hace que se repita todo otra vez?, hay otra forma de mostrar los resultados?
La query se ve bien, si estás haciendo algo más, pega el código completo...
Hola, eso de que se repite la pagina ya lo arreglé, tenia que poner el echo paginar debajo del termino del while, pero sin embargo el buscador aparentemente no anda bien, me parece que voy a tener que hacer otro codigo, porque en la primer pantalla muestra los usuarios con filtro y en las siguientes todos los usuarios.
Por ejemplo si yo busco femenino, aparece en la primera bien, pero despues todos masculinos.
Entonces debe ser el codigo del buscador.
Veré que hago entonces.