paginacion ejemplos busqueda php mysql limit offset

php - ejemplos - Paginación usando MySQL LIMIT, OFFSET



paginacion en php y mysql ejemplos (3)

Tengo algún código que LIMITA los datos para mostrar solo 4 elementos por página. La columna que estoy usando tiene alrededor de 20-30 artículos, por lo que debo hacer que se distribuyan en las páginas.

En la primera página, tengo:

$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4"); { echo "<tr>"; echo "<td align=''center''><img src=/"" . $row[''picturepath''] . "/" /></td>"; echo "<td align=''center''>" . $row[''name''] . "</td> <td align=''center''> <input type=''button'' value=''More Info''; onclick=/"window.location=''more_info.php?'';/"> </td>"; echo "<td align=''center''>" . $row[''price''] . "</td> <td align=''center''> <input type=''button'' value=''Add to Order'' onclick=''''> </td>"; echo "</tr>"; } echo "</table>"; mysqli_close($con); ?> <table width="1024" align="center" > <tr height="50"></tr> <tr> <td width="80%" align="right"> <a href="itempage2.php">NEXT</a> </td> <td width="20%" align="right"> <a href="">MAIN MENU</a> </td> </tr> </table>

Notarás que en la parte inferior de la página, mi etiqueta de ancla en las listas de la segunda página, "itempage2.php". En la página 2 del elemento, tengo el mismo código, excepto que mi declaración de selección enumera el desplazamiento de 4.

$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4 offset 4");

Esto funciona, de esta manera cuando hay un número predeterminado de elementos dentro de mi base de datos. Pero no es tan bueno. Necesito crear una nueva página solo si hay más elementos, no codificados en ella como lo es ahora.

¿Cómo puedo crear varias páginas sin tener que codificar cada nueva página y compensarlas?


En primer lugar, no tenga un script de servidor separado para cada página, eso es una locura. La mayoría de las aplicaciones implementan la paginación mediante el uso de un parámetro de paginación en la URL. Algo como:

http://yoursite.com/itempage.php?page=2

Puede acceder al número de página solicitado a través de $_GET[''page''] .

Esto hace que su formulación SQL sea realmente fácil:

// determine page number from $_GET $page = 1; if(!empty($_GET[''page''])) { $page = filter_input(INPUT_GET, ''page'', FILTER_VALIDATE_INT); if(false === $page) { $page = 1; } } // set the number of items to display per page $items_per_page = 4; // build query $offset = ($page - 1) * $items_per_page; $sql = "SELECT * FROM menuitem LIMIT " . $offset . "," . $items_per_page;

Entonces, por ejemplo, si la entrada aquí era page=2 , con 4 filas por página, su consulta sería "

SELECT * FROM menuitem LIMIT 4,4

Así que ese es el problema básico de la paginación. Ahora, tiene el requisito adicional de que desea comprender el número total de páginas (para poder determinar si se debe mostrar "PRÓXIMA PÁGINA" o si desea permitir el acceso directo a la página X a través de un enlace).

Para hacer esto, debe comprender el número de filas en la tabla.

Simplemente puede hacer esto con una llamada de base de datos antes de intentar devolver su conjunto limitado de registros real (digo ANTES, ya que obviamente desea validar que la página solicitada existe).

Esto es en realidad bastante simple:

$sql = "SELECT your_primary_key_field FROM menuitem"; $result = mysqli_query($con, $sql); if(false === $result) { throw new Exception(''Query failed with: '' . mysqli_error()); } else { $row_count = mysqli_num_rows($result); // free the result set as you don''t need it anymore mysqli_free_result($result); } $page_count = 0; if (0 === $row_count) { // maybe show some error since there is nothing in your table } else { // determine page_count $page_count = (int)ceil($row_count / $items_per_page); // double check that request page is in range if($page > $page_count) { // error to user, maybe set page to 1 $page = 1; } } // make your LIMIT query here as shown above // later when outputting page, you can simply work with $page and $page_count to output links // for example for ($i = 1; $i <= $page_count; $i++) { if ($i === $page) { // this is current page echo ''Page '' . $i . ''<br>''; } else { // show link to other page echo ''<a href="/menuitem.php?page='' . $i . ''">Page '' . $i . ''</a><br>''; } }


Si quieres que sea sencillo, sigue adelante y prueba esto.

$page_number = mysqli_escape_string($con, $_GET[''page'']); $count_per_page = 20; $next_offset = $page_number * $count_per_page; $cat =mysqli_query($con, "SELECT * FROM categories LIMIT $count_per_page OFFSET $next_offset"); while ($row = mysqli_fetch_array($cat)) $count = $row[0];

El resto depende de usted. Si ha obtenido resultados de dos tablas, le sugiero que pruebe un enfoque diferente.


Use .. LIMIT :pageSize OFFSET :pageStart

Donde :pageStart está vinculado al índice_página (es decir, 0 para la primera página) * number_of_items_per_pages (ej. 4) y :pageSize está vinculado a number_of_items_per_pages.

Para detectar "tiene más páginas", use SQL_CALC_FOUND_ROWS o use .. LIMIT :pageSize OFFSET :pageStart + 1 y detecte un último registro faltante (pageSize + 1). No hace falta decir que, para las páginas con un índice> 0, existe una página anterior.

Si el valor del índice de la página está incrustado en la URL (por ejemplo, en los enlaces de "página anterior" y "página siguiente"), se puede obtener a través del elemento $_GET apropiado.