entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Como se puede paginar registros mysql mostrándolos uno por uno?

Buenas hoy les vengo con una nueva inquietud... resulta que estoy mostrando en una sección de mi web (realizada con jquery mobile) una información del ultimo registro, cuyo código le pongo aquí abajo (zona donde esta el código php) y asi se ve en el cell: http://waybill.hyeride.com/index.php#info

<div id="info" data-role="page">

    <div data-theme="b" data-position="fixed" data-role="header">
        <div data-role="navbar">
            <ul>
                <li><a data-transition="slidefade" data-icon="home" href="#home">Home</a></li>
                <li><a data-transition="slidefade" data-icon="edit" href="#addwaybill">Add Way Bill</a></li>
                <li><a data-transition="slidefade" data-icon="bars" href="#listwaybill">Way Bill List</a></li>
                <li><a data-transition="slidefade" href="#info" data-icon="info" class="ui-btn-active ui-state-persist">Way Bill Show</a></li>
            </ul>
        </div>
    </div>

    <div data-role="content">

    <h4>Way Bill</h4>

    <?php

    include("conexion/conexion.php");

    ?>

    <?php
        $consulta=mysql_query("SELECT * FROM waybill ORDER BY id DESC LIMIT 1") or die(mysql_error());
        $registro=mysql_fetch_array($consulta);
        echo "<table id='cuadro' cellpadding='0' cellspacing='0'>";
        do{
            $ids=$registro['id'];
            $dat=$registro['date'];
            $amo=$registro['amount'];
            $com=$registro['company'];
            $tc=$registro['tcp'];
            $dri=$registro['driver'];
            $lic=$registro['licence'];
            $npe=$registro['npersons'];
            $pas=$registro['passenger'];
            $pic=$registro['pickup'];
            $cip=$registro['citypickup'];
            $dro=$registro['dropoff'];
            $cid=$registro['citydropoff'];
            $ter=$registro['terminal'];
            $fli=$registro['flight'];
            $tim=$registro['time'];
        echo "<bill><date><span2>Date:</span2><resultado>$dat</resultado></date> <amount><span2>Amount:</span2>  <resultado>$amo</resultado></amount></br> <company><span2>Campany Name:</span2> <resultado>$com</resultado></company> <tcp><span2>TCP#:</span2><resultado>$tc</resultado></tcp></br><driver><span2>Driver Name:</span2><resultado>$dri</resultado></driver><licence><span2>Veh. Licence Plate: </span2><resultado>$lic</resultado></licence></br><npersonas><span2>No.of Person in Group: </span2><resultado>$npe</resultado></npersonas><pasajero><span2>Passenger Name: </span2><resultado><b>$pas</b></resultado></pasajero></br> <pickup><span2>Pick-Up Location: </span2><resultado>$pic</resultado></pickup></br><citypickup><span2>City Pickup: </span2><resultado>$cip</resultado></citypickup></br> <dropoff><span2>Drop-off Location: </span2><resultado>$dro</resultado></dropoff></br> <citydropoff><span2>City Dropoff: </span2><resultado>$cid</resultado></citydropoff></br><terminales><span2>Airline/Terminal: </span2><resultado>$ter</resultado></terminales> <vuelo><span2>Flight #: </span2> <resultado>$fli</resultado></vuelo></br><times><span2>Time: </span2><resultado>$tim</resultado></times>";
        }while($registro=mysql_fetch_array($consulta));
        echo "</table>";
    ?>
    </div>

    <div data-role="footer" id="footer">
        <div id="corte"> </div>
        Pursuant to Public Utilities Commissions General Order 157-C, Section 3.01 # Waybills must be completed
        filled out and driver must have it in their possession when conducting business at Los Angeles.
        <center>International Airport</center>
    </div>
</div>

Ahora lo que necesitaría es poner dos botones uno sea BACK y otro que sea NEXT para pasar los registros uno por uno en dicha pagina, ahora la lista debería empezar desde el mas actual hasta el mas antiguo. (dicha referencia se tomaría desde el key 'id')

Espero este me entiendan lo explicado de lo que necesito y desde ya muchas gracias por su tiempo.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Chirola30,

paginadores para MySQL debe de haber cientos: mi primer sugerencia es que busques alguno, por ejemplo en www.phpclasses.org y lo uses.

De todas maneras, la cuestión de la paginación, independientemente de si vas de a 1 o de a100, es idéntica desde el código, y consiste en variar el valor del LIMIT de la consulta para que muestre la posición de la query que quieras. Esto además es independiente del ID de la tabla, ya que la "página" a mostrar será siempre consecutiva, pero el ID de la tabla no tiene por qué serlo.

Tenés que modificar tu query para que sea, para cada registro a mostrar, así:

SELECT * FROM waybill ORDER BY id DESC LIMIT 1, 1; -- Primera página
SELECT * FROM waybill ORDER BY id DESC LIMIT 2, 1; -- Segunda página
SELECT * FROM waybill ORDER BY id DESC LIMIT 3, 1; -- Tercera página
SELECT * FROM waybill ORDER BY id DESC LIMIT N, 1; -- Enésima página

Como se ve, el primer valor del LIMIT es desde que registro mostrar, y el segundo es cuantos registros devuelve la query.

Esto significa que tenés que pasarte como parámetro la página que quereés ver (no el ID del registro) para que tu query sea:

$consulta=mysql_query("SELECT * FROM waybill ORDER BY id DESC LIMIT $pagina 1") or die(mysql_error());

El valor de la variable $pagina, si no existe, lo podrás en 1 antes de la query, y si existe, el botón de "siguiente" enviará el valor $pagina+1 y el de "atrás" el valor de $pagina-1

Cómo tomes el valor de la paǵina dependerá de si lo enviás por GET o POST. Por proligidad, está bueno que si página es 0 el botón de "atrás" esté deshabilitado, y si vale la cantidad máxima de registros (cosa que tendrás que comprobar con otra query) el botón de "siguiente" esté deshabilitado.

Saludos cordiales!

0voto

chirola30 comentado

ya entendi todo lo que me has explicado pero como le haría en la parte de los botones en la parte de jquery, esto es lo que he echo:

$('#izq').click(function() {
alert('aprestaste el boton izquierdo');
});

$('#der').click(function() {
alert('aprestaste el boton derecho');
});

esta es la pagina: http://waybill.hyeride.com/#info

muchas gracias.

Nota: movido a comentario de la respuesta

0voto

Leonardo-Tadei comentado

Hola Chirola30,

no te compliques y no lo hagas desde JQuery!

El valor de $page está disponible en el servidor, así que el propio servidor puede generar el código HTML con los botones "anterior" y "siguiente", que son solamente un link (decorado como un botón por ejemplo) al mismo URL pero pasando como parámetro $pagina+1 o $pagina-1

Luego, no hace falta asociar el link del paginador a ningún evento click, porque eso es justamente lo que un link hace: ir a la página indicada en el <a href="... al clickear sobre ella.

Así como desde PHP generás el contenido a mostrar, generá también los dos enlaces!!!

0voto

chirola30 comentado

lo que pasa es que no da direccion arriba de url al cargar un nro de la pagina, esta realizada con jquerymobile, por eso lo estoy tratando de hacer desde el jquery, la informacion de registro que da la pagina es importacion de datos (por medio del 'id') para ser mostrados. Cuando aptra la tecla de 'Way Bill Show' (http://waybill.hyeride.com/#info) llama directamente a este php:

<?php
        $consulta=mysql_query("SELECT * FROM waybill ORDER BY id DESC LIMIT 1") or die(mysql_error());
        $registro=mysql_fetch_array($consulta);
        echo "<table id='cuadro' cellpadding='0' cellspacing='0'>";
        do{
            $ids=$registro['id'];
            $dat=$registro['date'];
            $amo=$registro['amount'];
            $com=$registro['company'];
            $tc=$registro['tcp'];
            $dri=$registro['driver'];
            $lic=$registro['licence'];
            $npe=$registro['npersons'];
            $pas=$registro['passenger'];
            $pic=$registro['pickup'];
            $cip=$registro['citypickup'];
            $dro=$registro['dropoff'];
            $cid=$registro['citydropoff'];
            $ter=$registro['terminal'];
            $fli=$registro['flight'];
            $tim=$registro['time'];
        echo "<bill><date><span2>Date:</span2><resultado>$dat</resultado></date> <amount><span2>Amount:</span2>  <resultado>$amo</resultado></amount></br> <company><span2>Campany Name:</span2> <resultado>$com</resultado></company> <tcp><span2>TCP#:</span2><resultado>$tc</resultado></tcp></br><driver><span2>Driver Name:</span2><resultado>$dri</resultado></driver><licence><span2>Veh. Licence Plate: </span2><resultado>$lic</resultado></licence></br><npersonas><span2>No.of Person in Group: </span2><resultado>$npe</resultado></npersonas><pasajero><span2>Passenger Name: </span2><resultado><b>$pas</b></resultado></pasajero></br> <pickup><span2>Pick-Up Location: </span2><resultado>$pic</resultado></pickup></br><citypickup><span2>City Pickup: </span2><resultado>$cip</resultado></citypickup></br> <dropoff><span2>Drop-off Location: </span2><resultado>$dro</resultado></dropoff></br> <citydropoff><span2>City Dropoff: </span2><resultado>$cid</resultado></citydropoff></br><terminales><span2>Airline/Terminal: </span2><resultado>$ter</resultado></terminales> <vuelo><span2>Flight #: </span2> <resultado>$fli</resultado></vuelo></br><times><span2>Time: </span2><resultado>$tim</resultado></times>";
        }while($registro=mysql_fetch_array($consulta));
        echo "</table>";
    ?>

Ahora como haría para que se actualice y cambie los datos al apretar back o next porque cada ves que aprieta un botón tendría que hacer el mismo proceso del php pero con el orden ascendente o descendente dependiendo del botón.

Muchas gracias por todo Leonardo tu tiempo y paciencia.

0voto

Leonardo-Tadei comentado

Pero Chirola!

sí que hay URL y le podés pasar un número de página!

Vos llamás a http://waybill.hyeride.com/#info pero el servidor web Apache, cuando no se pone un nombre de archivo, invoca sus defaults. En tu caso el default de archivo es index.php (y lo sabés porque así se llama al archivo que subiste por FTP), así que la llamada http://waybill.hyeride.com/index.php#info es la misma página.

Ahora bien, a index.php le podés pasar parámetros y a la vez un anchor con el # así http://waybill.hyeride.com/index.php?pagina=10#info que pasa por GET el parámetro pagina con valor 10 y si no querés ver el index.php, esto también funciona http://waybill.hyeride.com/?pagina=10#info

Así que con lo que respondo en primer lugar de poner la página como parte de la consulta en el LIMIT con dos parámetros, esto funciona... y podés mostrar los enlaces desde PHP:

...
$anterior = $pagina-1;
$siguiente = $pagina+1;
echo "<a href='?pagina=$anterior#info>anterior</a> - <a href='?pagina=$siguiente#info>siguiente</a>;
}while($registro=mysql_fetch_array($consulta));
...

El valor de página, lo aotenés por GET y si viene vacío, le asignás 1.

De paso, en una query es mucho mejor usar un bucle while en vez de un do, porque si la query no devuelve ningún valor falla, ya que do al menos se ejecuta una vez cuando debería ejecutarse cero veces.

Saludos!

0voto

chirola30 comentado

En que parte del index.php iría ese código? entre medio del php del código que ya tengo, o lo tengo que cambiar?

0voto

Leonardo-Tadei comentado

Hola Chirola30,

el código va en el mismo PHP que ya tenés, justo antes del cierre del do ... while

Previamente tenés que analizar si llega la variable $pagina por GET como te indico en la respuesta:

...
$pagina=1;
if(isset($_GET['pagina'])) {
   $pagina = intval($_GET['pagina']);
}
...

y no te olvides de modificar la query para que el LIMIT tenga el valor de $pagina correspondiente.

Saludos!

0voto

chirola30 comentado

Hola Leonardo... mira me sale el error, acá te paso un capture.

muchas gracias.

0voto

carlossevi comentado

La definición de la variable $pagina debe estar antes de la creación de la $consulta ya que la segunda utiliza el número de página.

0voto

Leonardo-Tadei comentado

Tal y como dice Carlos, tenés que definir las variables antes de usarlas...

0voto

chirola30 comentado

así lo he puesto y sigue sin funcionarme, ademas aparece el botón siguiente solamente, el anterior no aparece, que cosa estare haciendo mal en este código para que no me funcione ni responda?

 <?php

    include("conexion/conexion.php");

    ?>
<?php
        $pagina = 1;
        if(isset($_GET['pagina'])) {
        $pagina = intval($_GET['pagina']);
}
        $consulta=mysql_query("SELECT * FROM waybill ORDER BY id DESC LIMIT $pagina , 1") or die(mysql_error());
        $registro=mysql_fetch_array($consulta);
        echo "<table id='cuadro' cellpadding='0' cellspacing='0'>";
        do{
            $ids=$registro['id'];
            $dat=$registro['date'];
            $amo=$registro['amount'];
            $com=$registro['company'];
            $tc=$registro['tcp'];
            $dri=$registro['driver'];
            $lic=$registro['licence'];
            $npe=$registro['npersons'];
            $pas=$registro['passenger'];
            $pic=$registro['pickup'];
            $cip=$registro['citypickup'];
            $dro=$registro['dropoff'];
            $cid=$registro['citydropoff'];
            $ter=$registro['terminal'];
            $fli=$registro['flight'];
            $tim=$registro['time'];
        echo "<bill><date><span2>Date:</span2><resultado>$dat</resultado></date> <amount><span2>Amount:</span2>  <resultado>$amo</resultado></amount></br> <company><span2>Campany Name:</span2> <resultado>$com</resultado></company> <tcp><span2>TCP#:</span2><resultado>$tc</resultado></tcp></br><driver><span2>Driver Name:</span2><resultado>$dri</resultado></driver><licence><span2>Veh. Licence Plate: </span2><resultado>$lic</resultado></licence></br><npersonas><span2>No.of Person in Group: </span2><resultado>$npe</resultado></npersonas><pasajero><span2>Passenger Name: </span2><resultado><b>$pas</b></resultado></pasajero></br> <pickup><span2>Pick-Up Location: </span2><resultado>$pic</resultado></pickup></br><citypickup><span2>City Pickup: </span2><resultado>$cip</resultado></citypickup></br> <dropoff><span2>Drop-off Location: </span2><resultado>$dro</resultado></dropoff></br> <citydropoff><span2>City Dropoff: </span2><resultado>$cid</resultado></citydropoff></br><terminales><span2>Airline/Terminal: </span2><resultado>$ter</resultado></terminales> <vuelo><span2>Flight #: </span2> <resultado>$fli</resultado></vuelo></br><times><span2>Time: </span2><resultado>$tim</resultado></times>";

        $anterior = $pagina-1;
        $siguiente = $pagina+1;
        echo "<a href='?pagina=$anterior#info>anterior</a> - <a href='?pagina=$siguiente#info>siguiente</a>";

        }while($registro=mysql_fetch_array($consulta));
        echo "</table>";
    ?>

0voto

carlossevi comentado

Ahora tu página carga bien inicialmente pero los enlaces lo tienes mal creados. El fallo está en esta línea:

echo "<a href='?pagina=$anterior#info>anterior</a> - <a href='?pagina=$siguiente#info>siguiente</a>";

0voto

Leonardo-Tadei comentado

Hola @chirola30,

los enlaces los tenés ahora bien generados. Si te fijás cargar las páginas:

http://waybill.hyeride.com/index.php?pagina=2#info
http://waybill.hyeride.com/index.php?pagina=3#info
http://waybill.hyeride.com/index.php?pagina=4#info

te muestran los registro correctos.

Creo que no te anda porque debés tener previamente una directiva JavaScript que está anulando el comportamiento de los enlaces A, que es simplemente cargar una página.

Tal vez debas crear los enlaces poniendo las clases de JQueryMobile, como tenés en la cabecera con los controles, para que sí funcionen, pero esto depende de detalles de tu aplicación y no sabría decirte exactamente cómo escribirlos o si te conviene poner un formulario HTML con un botón para el "anterior" y el "siguiente"

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta