Foros del Web » Programando para Internet » PHP »

Paginación PHP y MS-SQL

Estas en el tema de Paginación PHP y MS-SQL en el foro de PHP en Foros del Web. Saludos señores... Me gustaria saber como pudiera hacer que una consulta con muchos registro me las muestre en varias páginas utilizando PHP con MS-SQL. Con ...
  #1 (permalink)  
Antiguo 15/12/2005, 17:30
 
Fecha de Ingreso: marzo-2005
Mensajes: 11
Antigüedad: 19 años, 1 mes
Puntos: 0
Exclamación Paginación PHP y MS-SQL

Saludos señores... Me gustaria saber como pudiera hacer que una consulta con muchos registro me las muestre en varias páginas utilizando PHP con MS-SQL. Con MySQL la he podido hacer utilizando LIMIT, pero no he podido con MS-SQL. Alguien pudiera ilustrarme al respecto?

Gracias anticipadas.
  #2 (permalink)  
Antiguo 16/12/2005, 06:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
MS-SQL dispone de su sentencia "TOP" en su SQL .. que no equivale a LIMIT pero en conjunto con sub-consultas podrías simular lo que en Mysql y su LIMIT lo hace con una simple instrucción.

Te recomiendo visitar el foro de "Base de datos" para concretar el SQL a emplear para arrojar una consulta SQL desde tal registro hasta registro_inicio+N registros más.

Un saludo,
  #3 (permalink)  
Antiguo 16/12/2005, 08:58
Avatar de pablod  
Fecha de Ingreso: abril-2004
Ubicación: Santiago
Mensajes: 118
Antigüedad: 20 años
Puntos: 0
Holas, el día de ayer realice la misma consulta en el foro. Le di muchas vueltas a este tema.

Cluster me oriento y logre realizar la paginación basada en un procedimiento almacenado el cual retorna los registros de forma paginada, desde PHP solo le envio los parametros y el procedure realiza, es decir simula una paginación.

Acá dejo el codigo del procedimiento almacenado, aún no lo he refinado tanto, pero funciona.

Código:
--SP QUE RETORNA UNA CONSULTA PAGINADA
--RECIBE PARAMETROS PARA LA PAGINACION

CREATE PROCEDURE paginacion_ejemplo
--NUMERO DE PAGINA A MOSTRAR
@index int,
--TOTAL DE REGISTROS POR PAGINA
@num_regs int

AS
    
    BEGIN

        --ESTOS SERNA LOS INDICES PARA LA PAGINACION
		DECLARE @maximo numeric
        DECLARE @minimo numeric

        SELECT @maximo = (@index * @num_regs)
        SELECT @minimo = @maximo - (@num_regs - 1)

        --CREACION DE LA TABLA TEMPORAL PARA LA PAGINACION
        --NUM_ORDEN SERVIRA DE INDICE PARA EXTRAER LOS REGISTROS

        CREATE TABLE #tmpListado(
            num_orden int IDENTITY(1,1),
            id_radio int,
            nombre_radio varchar(15)
        )

        --INSERTAR LOS DATOS A LA TABLA TEMPORAL DIRECTAMENTE DESDE EL SELECT
        INSERT #tmpListado SELECT id_radio, nombre_radio FROM tb_adm_radio ORDER BY nombre_radio

        --UNA VEZ CARGADOS LOS DATOS LOS EXTRAEMOS
        --CON UN SELECT FILTRADO POR LOS VALORES DE LA PAGINACION
        SELECT id_radio, nombre_radio 
        FROM #tmpListado
        WHERE num_orden BETWEEN @minimo AND @maximo

    END
--FIN--
Cualquier información sobre este tema, espero la hagan llegar.

Saludos.

P4blo.-
__________________
Pablod:-)
  #4 (permalink)  
Antiguo 16/12/2005, 09:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
pablod ..

Si implementastes la solución con PHP (para la gestión de los links y paginado) estaría bueno que pusieras un ejemplo completo de uso de ese procedimiento almacenado y de ahí .. incluso crear una FAQ para el foro PHP sobre pagina en MS SQL Server con PHP.

Un saludo,
  #5 (permalink)  
Antiguo 16/12/2005, 12:26
Avatar de pablod  
Fecha de Ingreso: abril-2004
Ubicación: Santiago
Mensajes: 118
Antigüedad: 20 años
Puntos: 0
OK. Acá dejo la paginación que realice con PHP y SQL Server.

Primero el procedimiento almacenado.
Código:
--SP QUE RETORNA UNA CONSULTA PAGINADA
--RECIBE PARAMETROS PARA LA PAGINACION

CREATE PROCEDURE paginacion_ejemplo
--NUMERO DE PAGINA A MOSTRAR
@index int,
--TOTAL DE REGISTROS POR PAGINA
@num_regs int

AS
    
    BEGIN

        --ESTOS SERNA LOS INDICES PARA LA PAGINACION
		DECLARE @maximo numeric
        DECLARE @minimo numeric

        SELECT @maximo = (@index * @num_regs)
        SELECT @minimo = @maximo - (@num_regs - 1)

        --CREACION DE LA TABLA TEMPORAL PARA LA PAGINACION
        --NUM_ORDEN SERVIRA DE INDICE PARA EXTRAER LOS REGISTROS

        CREATE TABLE #tmpListado(
            num_orden int IDENTITY(1,1),
            id_radio int,
            nombre_radio varchar(15)
        )

        --INSERTAR LOS DATOS A LA TABLA TEMPORAL DIRECTAMENTE DESDE EL SELECT
        INSERT #tmpListado SELECT id_radio, nombre_radio FROM tb_adm_radio ORDER BY nombre_radio

        --UNA VEZ CARGADOS LOS DATOS LOS EXTRAEMOS
        --CON UN SELECT FILTRADO POR LOS VALORES DE LA PAGINACION
        SELECT id_radio, nombre_radio 
        FROM #tmpListado
        WHERE num_orden BETWEEN @minimo AND @maximo

    END
--FIN--
Y aqui va la parte en PHP

Código PHP:
<?php
include("includes/abrir_conexion_db.php");

//COSTANTES PARA EL DESPLIEGUE DE RESULTADOS
define("LIMITE"3);
define("TAM_VENTANA"10);

//CALCULO EL NUMERO DE REGISTROS
$total 0;
//PROCEDIMIENTO ALMACENADO QUE DETERMINA EL NUMERO DE REGISTROS
$sql_sel mssql_init("sp_selecciona_registros"); 
$res_sel mssql_execute($sql_sel) ;
$row mssql_fetch_array($res_sel);
$total += mssql_num_rows($res_sel);
//NUMERO TOTAL DE REGISTROS
$numero_de_registros $total;

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Paginación PHP - SQL Server</title>
<style type="text/css">
<!--
.titulo{
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-weight: bold;
}
.texto
    {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; }

-->
</style>
</head>

<body>
<p class="titulo">Paginaci&oacute;n de Resultados PHP - SQL Server 2000 </p>
<span class="Estilo2">Número total de registros: <?php echo $numero_de_registros ?></span><br>
<span class="Estilo2">Número de registros por página: <?php echo LIMITE ?></span><br><br>

<table width="50%" border="0" cellspacing="2" cellpadding="2">
  <tr>
    <td bgcolor="#CCCCCC">ID RADIO</td>
    <td bgcolor="#CCCCCC">NOMBRE RADIO</td>
  </tr>
  <?php
    
    $pagina 
$_GET['pagina'];
    
$limite LIMITE;
    if( isset( 
$pagina ) ) {
    }
    else {
        
$pagina 1;
    }
    
    
//LLAMAR AL SP QUE EXTRAE LOS DATOS PAGINADOS
    
$sql_sel2 mssql_init("paginacion_ejemplo");
    
//ENVIAR PARAMETROS AL SP
    
mssql_bind($sql_sel2"@index"$paginaSQLINT2);
    
mssql_bind($sql_sel2"@num_regs"$limiteSQLINT2);
    
$res_sel2 mssql_execute($sql_sel2);
    
$num_rows_sel2 mssql_num_rows($res_sel2);
    
    
$num_paginas_float $numero_de_registros $limite//número total de páginas a mostrar (float)
    
$valor_redondeado ceil($num_paginas_float); //número total de páginas a mostrar (entero)
    
$inferior $pagina - ( ceilTAM_VENTANA ) );
    
$inicio_ventana 1;
    if( 
$valor_redondeado TAM_VENTANA ) {
        
$inicio_ventana = ( $inferior ) ? $inferior 1;
    }
    
$fin_ventana $inicio_ventana + ( TAM_VENTANA );
    if( ( 
$fin_ventana $valor_redondeado ) && ( $valor_redondeado TAM_VENTANA ) ) {
        
$inicio_ventana $valor_redondeado - ( TAM_VENTANA );
    }
    
$contador $inicio_ventana;
    
    if( 
$num_rows_sel2 ) {    
    
        while( 
$row_sel2 mssql_fetch_array($res_sel2) ) {
  
?>
          <tr>
            <td bgcolor="#FFFFF0"><?php echo $row_sel2['id_radio'?></td>
            <td bgcolor="#FFFFF0"><?php echo $row_sel2['nombre_radio'?></td>
          </tr>
  <?php
        
}
    }
    
?>
</table>
<br>
<table width="50%"  border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="10%" align="left">
        <?php
        
if( $pagina ) {
            
$numero_pagina $pagina 1;
        
?>
                <a href="paginacion_prueba.php?pagina=<?php echo $numero_pagina ?>">&laquo;&nbsp;Anterior</a>
            <?php
        
}
        else{                
        
?>
            &nbsp;
        <?php
        
}
        
?>
    </td>
    <td width="30%" align="center">
    <?php
    
if( ( $numero_de_registros ) && ( $valor_redondeado ) ) {
        
$nuevo_inicio = ($inicio_ventana $limite) - $limite;
        while ( ( 
$contador <= $valor_redondeado ) && ( $contador <= $fin_ventana) ) {
            
$string_contador "";
            if( 
$contador $inicio_ventana ) {
                
$nuevo_inicio += $limite;
            }
            if( 
$pagina == $contador ) {
                
$string_contador "<b>$contador</b>";
            }
            else {
                
$string_contador "$contador";
            }
            if( ( 
$pagina $contador ) || ( $pagina $contador ) ) {
            
?>
                &nbsp;<a href="paginacion_prueba.php?pagina=<?php echo $contador ?>"><?php echo $string_contador ?></a>&nbsp;<?php
            
}
            else {
                echo 
"&nbsp;" $string_contador "&nbsp;";
            }
            
$contador++;
        }
    }
    
?>
    </td>
    <td width="10%" align="right">
    <?php 
        
if( $pagina $valor_redondeado ) {
            
$numero_pagina $pagina 1;
        
?>
            <a href="paginacion_prueba.php?pagina=<?php echo $numero_pagina ?>">Siguiente&nbsp;&raquo;</a><?php
        
}
        else{                
        
?>
            &nbsp;
        <?php
        
}
    
?>
    </td>
  </tr>
</table>

</body>
</html>
Eso sería, si alguien refina el código no duden en enviar y postear la información.

Saludos.

P4blo.-
__________________
Pablod:-)
  #6 (permalink)  
Antiguo 16/12/2005, 13:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Ok, .. veamos si alguien puede probarlo y/o mejorarlo y si está todo OK .. lo publicamos como una FAQ (si das tu permiso claro, de hecho puedes hacerlo tu mismo si lo deseas).

Un saludo,
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.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:01.