Foros del Web » Programando para Internet » PHP »

Problema con paginacion de resultados PHP-MySQL

Estas en el tema de Problema con paginacion de resultados PHP-MySQL en el foro de PHP en Foros del Web. Hola soy programador autodidacto y sigo aprendiendo dia con dia, de momento estoy estancado ya desde hace varios dias con este problema, espero que alguien ...
  #1 (permalink)  
Antiguo 13/11/2013, 13:05
Avatar de oz_on_fire  
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 10 años, 5 meses
Puntos: 1
Pregunta Problema con paginacion de resultados PHP-MySQL

Hola soy programador autodidacto y sigo aprendiendo dia con dia, de momento estoy estancado ya desde hace varios dias con este problema, espero que alguien se apiade de mi y me pueda ayudar con esto.
La cuestion es la siguiente: tengo una pagina index.php donde se muestra un listado de categorias y al darle click en una categoria te envia a una pagina llamada ver_categoria.php y se envia (metodo GET)el numero identificador de dicha categoria mostrando en la barra de direcciones algo asi --> ver_categoria.php?cat=3 y en esta pagina se hace una consulta que trae todos los resultados de esa categoria, si me muestra los primeros resultados pero al darle click en la paginacion para que muestre los siguientes resultados me da un error en mi SQL syntax. Ahora si pruebo el mismo codigo de la paginacion pero sin enviarle el parametro de la categoria me funciona perfecto(solo le pongo algun numero por defecto). Creo el problema radica al enviarle el parametro este de la categoria por que como menciono si no hago esto el codigo funciona bien, el problema es que si necesito enviarle este parametro para que asi me muestre los resultados de cada categoria..

Este es el codigo que estoy usando (el cual lo tome de internet por cierto)en la pagina ver_categoria.php:

<?php require_once('Connections/quid_pro_quo_connection.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}

$varCategoria_DatosProductos = "0";
if (isset($_GET["cat"])) {
$varCategoria_DatosProductos = $_GET["cat"]; /////AQUI ES DONDE CREO ESTA EL PROBLEMA <-- si a esto le pongo un numero por defecto en lugar de recibirlo por get la barra de direcciones deja de ser asi ver_categoria.php?cat=3 y solo queda asi ver_categoria.php y la paginacion funciona bien pero yo necesito enviarle este parametro de la categoria en orden de que la consulta corresponda a la categoria clickeada en la pagina anterior
}
mysql_select_db($database_quid_pro_quo_connection, $quid_pro_quo_connection);
$query_DatosProductos = sprintf("SELECT * FROM items WHERE items.categoria = %s ORDER BY items.idItem DESC", GetSQLValueString($varCategoria_DatosProductos, "int"));
$DatosProductos = mysql_query($query_DatosProductos, $quid_pro_quo_connection) or die(mysql_error());



///////////////////////////////////PAGINACION//////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
$nr = mysql_num_rows($DatosProductos); // Get total of Num rows from the database query

if (isset($_GET['pn'])) { // Get pn from URL vars if it is present
$pn = preg_replace('#[^0-9]#i', '', $_GET['pn']); // filter everything but numbers for security(new)
//$pn = ereg_replace("[^0-9]", "", $_GET['pn']); // filter everything but numbers for security(deprecated)
} else { // If the pn URL variable is not present force it to be value of page number 1
$pn = 1;
}
//This is where we set how many database items to show on each page
$itemsPerPage = 2;
// Get the value of the last page in the pagination result set
$lastPage = ceil($nr / $itemsPerPage);
// Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage
if ($pn < 1) { // If it is less than 1
$pn = 1; // force if to be 1
} else if ($pn > $lastPage) { // if it is greater than $lastpage
$pn = $lastPage; // force it to be $lastpage's value
}
// This creates the numbers to click in between the next and back buttons
// This section is explained well in the video that accompanies this script
$centerPages = "";
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
if ($pn == 1) {
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
} else if ($pn == $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
} else if ($pn > 2 && $pn < ($lastPage - 1)) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '">' . $sub2 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '">' . $add2 . '</a> &nbsp;';
} else if ($pn > 1 && $pn < $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
}
// This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query
$limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage;
// Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax
// $sql2 is what we will use to fuel our while loop statement below
$query_DatosProductos2 = sprintf("SELECT * FROM items WHERE items.categoria = %s ORDER BY items.idItem DESC $limit", $varCategoria_DatosProductos);
$sql2 = mysql_query($query_DatosProductos2) or die(mysql_error());
//////////////////////////////// END Pagination Logic ////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// Pagination Display Setup /////////////////////////////////////////////////////////////////////
$paginationDisplay = ""; // Initialize the pagination output variable
// This code runs only if the last page variable is ot equal to 1, if it is only 1 page we require no paginated links to display
if ($lastPage != "1"){
// This shows the user what page they are on, and the total number of pages
$paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '&nbsp; &nbsp; &nbsp; ';
// If we are not on page 1 we can place the Back button
if ($pn != 1) {
$previous = $pn - 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '"> Back</a> ';
}
// Lay in the clickable numbers display here between the Back and Next links
$paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>';
// If we are not on the very last page we can place the Next button
if ($pn != $lastPage) {
$nextPage = $pn + 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '"> Next</a> ';
}
}
///////////////////////////////////// END Pagination Display Setup ///////////////////////////////////////////////////////////////////////////
// Build the Output Section Here
$outputList = '';
while($row = mysql_fetch_array($sql2)){

$id = $row["idItem"];
$nombre = $row["nombre"];
$imagen = $row["imagen"];

$outputList .= '<h1>' . $nombre . '</h1><h2>' . $imagen . ' </h2><hr />';
} // close while loop

//////////////////////////////////////////////PAGINACION FIN//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
.pagNumActive {
color: #000;
border:#060 1px solid; background-color: #D2FFD2; padding-left:3px; padding-right:3px;
}
.paginationNumbers a:link {
color: #000;
text-decoration: none;
border:#999 1px solid; background-color:#F0F0F0; padding-left:3px; padding-right:3px;
}
.paginationNumbers a:visited {
color: #000;
text-decoration: none;
border:#999 1px solid; background-color:#F0F0F0; padding-left:3px; padding-right:3px;
}
.paginationNumbers a:hover {
color: #000;
text-decoration: none;
border:#060 1px solid; background-color: #D2FFD2; padding-left:3px; padding-right:3px;
}
.paginationNumbers a:active {
color: #000;
text-decoration: none;
border:#999 1px solid; background-color:#F0F0F0; padding-left:3px; padding-right:3px;
}
</style>
</head>
<body>
<div style="margin-left:58px; margin-right:58px; padding:6px; background-color:#FFF; border:#999 1px solid;"><?php echo $paginationDisplay; ?></div>
<div style="margin-left:64px; margin-right:64px;"><?php print "$outputList"; ?></div>
<div style="margin-left:58px; margin-right:58px; padding:6px; background-color:#FFF; border:#999 1px solid;"><?php echo $paginationDisplay; ?></div>
</body>
</html>
  #2 (permalink)  
Antiguo 14/11/2013, 16:21
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Problema con paginacion de resultados PHP-MySQL

<saludos>
Pues en primera, te invito a que edites tu post y pongas todo ese código en highlight php para hacerlo más legible
En segunda, el error que te da es porque al usar la paginación, no estás
enviando nuevamente la categoría (Es decir, por ej el link de Back o Next actualmente NO estan enviando la variable cat) pero al querer hacer el query
en este momento SIEMPRE se está usando la categoría como filtro de consulta

Solución? Agregar cat=$_GET['cat'] en TODOS los links de paginación
Para esto te sugiero empieces a buscar todos los pn=
y en cada resultado ir agregando lo que te comenté, y con eso ya
debería funcionar sin inconveniente

Igualmente no estaría de más revisar antes del query si la variable $varCategoria_DatosProductos tiene o no valor (que es lo que actualmente pasa cuando se usa alguna opción de paginación)

Revisa eso y nos cuentas, suerte con eso!

P.D: Sugiero algo así


Código PHP:
Ver original
  1. if (isset($_GET["cat"])) {
  2. $varCategoria_DatosProductos = $_GET["cat"]; /////AQUI ES DONDE CREO ESTA EL PROBLEMA <-- si a esto le pongo un numero por defecto en lugar de recibirlo por get la barra de direcciones deja de ser asi ver_categoria.php?cat=3 y solo queda asi ver_categoria.php y la paginacion funciona bien pero yo necesito enviarle este parametro de la categoria en orden de que la consulta corresponda a la categoria clickeada en la pagina anterior
  3. //variable de prueba para tener aquí lo que voy a enviar en cada link de paginación
  4. $addNew = '&cat='.$_GET['cat'];
  5. }
  6. else
  7. {
  8. //valor por defecto en caso que NO venga
  9. $varCategoria_DatosProductos = -1;
  10. $addNew = '&cat='.$varCategoria_DatosProductos;
  11. }
  12.  
  13. //ahora en las paginaciones por ej iría así
  14. if ($pn == 1) {
  15. $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
  16. $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 .$addNew. '">' . $add1 . '</a> &nbsp;';
  17. } else if ($pn == $lastPage) {
  18. $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 .$addNew. '">' . $sub1 . '</a> &nbsp;';
  19. $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
  20. }

</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 14/11/2013 a las 16:27
  #3 (permalink)  
Antiguo 15/11/2013, 11:15
Avatar de oz_on_fire  
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema con paginacion de resultados PHP-MySQL

Hola mortiprogramador, muchas gracias por tu respuesta y disculpa por no marcar el codigo como codigo php, soy nuevo en el foro y aun no se usarlo bien, de hecho no encuentro como editarlo. Pero bueno te agradesco por el ejemplo que pones, voy a probarlo y te aviso como me fue. Gracias!
  #4 (permalink)  
Antiguo 15/11/2013, 11:40
Avatar de oz_on_fire  
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Problema con paginacion de resultados PHP-MySQL

Mortiprogramador la respuesta que le diste a mi problema me ha funcionado perfecto y te lo agradesco un monton. Prometo ponerle el highlight a mis proximos posts. Saludos!

Etiquetas: paginacion, php-mysql
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 00:38.