Olá a todos que visitam a comunidade do iMasters! Este é o meu primeiro artigo por aqui e espero que ele possa atender às necessidades de quem trabalha com PHP e Oracle.
Recentemente tivemos dificuldades em elaborar uma paginação de dados do Oracle com o PHP, pois no Oracle não contamos com recursos como “LIMIT”, para limitar a quantidade de registros a serem mostrados na tela. Porém, depois de uma boa busca na internet (boa mesmo), achei um artigo no CookBook PHP da Oracle em que eles nos ensinam a fazê-lo, então eu o traduzi e estou disponibilizando para que outras pessoas possam ser benefiadas com o mesmo.
Começamos criando uma tabela no Oracle e depois populamos essa tabela com dados suficientes para fazer uma boa paginação.
Iniciamos então a codificação do PHP, na qual algumas funções precisarão ser criadas. Então as coloquei dentro do mesmo script. Mas se você já tiver o conhecimento suficiente e preferir, poderá criar um arquivo para armazenar as funções em separado e depois chamá-las no script de paginação.
Todas as explicações estão como comentários nos códigos abaixo.
No final deveremos ter uma paginação bem funcional, depois é só aplicar o designer desejado.
Abraços a todos.
DADOS DA TABELA E INSERÇÃO DE DADOS.
CREATE TABLE PAGINACAO (
DATA TIMESTAMP PRIMARY KEY,
NOME VARCHAR2(100));
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 10 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 20 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 30 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 40 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 50 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 60 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 70 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 80 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 90 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
INSERT INTO PAGINACAO VALUES (SYSTIMESTAMP, ´TESTE DE PAGINAÇÃO ORACLE 100 REGISTROS´);
DADOS DO SCRIPT PHP
PAGINAORA.PHP
<?php
//Dados para a conexão com o banco de dados
$ora_user = "USUARIO"; //USUÁRIO DO BANCO
$ora_senha = "SENHA"; //SENHA DO BANCO
$ora_bd = "(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)
(HOST=192.168.0.1)(PORT=1521)//ENDEREÇO DE IP E PORTA DE ACESSO AO BANCO
)
)
(CONNECT_DATA=(SERVICE_NAME=ORCL))//SERVICE NAME DO ORACLE
)";
//Executa a conecxão com o bando de dados.
if ($ora_conexao = @OCILogon($ora_user,$ora_senha,$ora_bd) );
//Nessa função iremos fazer a paginação dos dados
function desenha_paginacao($url, $total_paginas, $pagina_corrente = 1) {
if ( $pagina_corrente <= 0 || $pagina_corrente > $total_paginas ) {
$pagina_corrente = 1;
}
if ( $pagina_corrente > 1 ) {
printf( "<a href=´$url?pagina=%d´>[Inicial]</a> \n" , 1);
printf( "<a href=´$url?pagina=%d´>[Anterior]</a> \n" , ($pagina_corrente-1));
}
for( $i = ($pagina_corrente-5); $i <= $pagina_corrente+5; $i++ ) {
if ($i < 1) continue;
if ( $i > $total_paginas ) break;
if ( $i != $pagina_corrente ) {
printf( "<a href=´$url?pagina=%1\$d´>%1\$d</a> \n" , $i);
} else {
printf("<a href=´$url?pagina=%1\$d´><strong>%1\$d</strong></a> \n",$i);
}
}
if ( $pagina_corrente < $total_paginas ) {
printf( "<a href=´$url?pagina=%d´>[Proxima]</a> \n" , ($pagina_corrente+1));
printf( "<a href=´$url?pagina=%d´>[Última]</a> \n" , $total_paginas);
}
}
//Aqui criamos uma função que pega a quantidade de paginas.
function total_paginas($total_linhas, $linhas_por_pagina) {
if ( $total_linhas < 1 ) $total_linhas = 1;
return ceil($total_linhas/$linhas_por_pagina);
}
//Aqui nesta função geramos a quantidade de linhas na pagina
function linhas_paginacao($pagina_corrente, $linhas_por_pagina) {
$linha_inicial = ($pagina_corrente-1) * $linhas_por_pagina + 1;
return $linha_inicial;
}
//Nessa contamos a quantida de linhas vinda do select no banco.
function conta_linhas(& $conn, $select) {
$sql = "SELECT COUNT(*) AS num_linhas FROM($select)";
$stmt = oci_parse($conn,$sql);
oci_define_by_name($stmt,"NUM_LINHAS",$num_linhas);
oci_execute($stmt);
oci_fetch($stmt);
return $num_linhas;
}
//Aqui geramos o resultado a ser paginado.
function & resultado_paginado(& $conn, $select, $linha_inicial, $linhas_por_pagina) {
$sql = "SELECT
*
FROM
(
SELECT
r.*, ROWNUM as numero_linha
FROM
( $select ) r
WHERE
ROWNUM <= :linha_final
)
WHERE :linha_inicial <= numero_linha";
$stmt = oci_parse($conn,$sql);
oci_bind_by_name($stmt, ´:linha_inicial´, $linha_inicial);
//Calcula o número da última linha na pagina
$linha_final = $linha_inicial + $linhas_por_pagina - 1;
oci_bind_by_name($stmt, ´:linha_final´, $linha_final);
oci_execute($stmt);
//Pega a quantidade de linhas por pagina.
oci_set_prefetch($stmt, $linhas_por_pagina);
return $stmt;
}
//Aqui fazemos uma conexão com o banco, caso ele conecte continuara a executar as próximas linhas, caso não retornara o
//erro pelo or die.
$conn = @OCILogon($ora_user,$ora_senha,$ora_bd) or die ("Impossivel se conectar ao servidor meu brother");
//Nessa variavel especificamos a quantidade de linhas por página
$linhas_por_pagina = 10;
//Aqui especificamos a url de nossa pagina php para a paginação.
$url = ´pgora.php´;
//Aqui fazemos o selecte na tabela desejada, você poderá especificar os campos a apresentados
//ou poderá usar * para retornar todos os campos da tabela
$sql = ´SELECT NOME, DATA FROM PAGINACAO ORDER BY NOME ASC´;
//Aqui pegamos o total de linhas na consulta
$total_linhas = conta_linhas($conn, $sql);
//Aqui pegamos o total de paginas da consulta
$total_paginas = total_paginas($total_linhas, $linhas_por_pagina);
//Nesse if fazemos o controle da paginação.
if ( !isset($_GET[´pagina´]) ||
!preg_match(´/^[0-9]+$/´,$_GET[´pagina´]) ||
$_GET[´pagina´] < 1) {
$_GET[´pagina´] = 1;
} else if ($_GET[´pagina´] > $total_paginas ) {
$_GET[´pagina´] = total_paginas;
}
//Aqui pegamos a linha inicial retornada pela pesquisa.
$linha_inicial = linhas_paginacao($_GET[´pagina´], $linhas_por_pagina);
//Aqui pegamos o resultado a ser paginado.
$stmt = & resultado_paginado($conn, $sql, $linha_inicial, $linhas_por_pagina);
?>
<!-- Aqui iniciamos a contrução de nossa paginação no htmlentities
criamos uma simples tabela e apresentamos os dados na tela.-->
<table width="600" aling="left">
<thead>
<tr>
<th>Nome</th>
<th>Data</th>
</tr>
</thead>
<tbody>
<!-- Aqui pegamos os dados a serem apresentados na tabela vindos da consulta-->
<?php while (OCIFetchinto($stmt,$row,OCI_ASSOC)) { ?>
<tr valign="top" >
<td align="left"><?php echo htmlspecialchars($row[´NOME´]); ?></td>
<td>
<?php echo htmlspecialchars($row[´DATA´]); ?>
</a>
</td>
</tr>
<?php } ?>
</tbody>
<tfoot>
<tr>
<td colspan="3" align="center">
<?php echo desenha_paginacao($url, $total_paginas, $_GET[´pagina´]); ?>
</td>
</tr>
</tfoot>
</table>