Paginação de resultados com PHP/Oracle

Aqui está um pequeno script que criei para a cadeira de Base de Dados utilizando PHP e o motor de base de dados Oracle.

Provavelmente não é a solução óptima para o problema visto ter de fazer duas queries à base de dados, mas foi a maneira que encontrei de conseguir por isto a funcionar. Em MySQL a segunda query seria simplificada através da função LIMIT, que permitiria uma visualização mais fácil do código, mas visto tar a trabalhar em uma base de dados Oracle teve de ser assim mesmo…

Script em PHP que pega em resultados de uma query à tabela “table” e divide por páginas:

$nres = 5; // numero de resultados a mostrar por pagina

$c = ocilogon($user, $pass, $host); // ligação à base de dados

if(isset($_GET[‘page’])){

   $p_ant = $_GET[‘page’] -1; // página anterior

   $p_seg = $_GET[‘page’] +1; // página seguinte

   $s = oci_parse($c, “select * from table); // seleccionar todos os resultados

   oci_execute($s, OCI_DEFAULT);

   $cont = 1;

   while(oci_fetch($s)) $cont++; // conta o numero de resultados da query

   $pag_max = $cont/$nres;  // calcula o numero de paginas

   // se não estiver na primeira página, mostra o link para a anterior

   if($_GET[‘page’]>1)

      echo “<a href=’index.php?page=”. $p_ant . “‘>Pagina anterior</a> “;

   echo “<a href=’index.php’>Home</a> “;

  // semelhante ao anterior, se não estiver na última página, mostra um link para a página seguinte

   if($pag_max>$_GET[‘page’])

      echo “<a href=’index.php?page=”. $p_seg . “‘>Pagina seguinte</a>”;

   echo “<br/><br/>”;

   // query que trata de buscar os elementos que se encontram entre pagina-1*$nres e pagina*$nres

   $q = “select * from ( select a.*, rownum rnum 

                               from ( select * from table ) a

                               where rownum <= ” . $_GET[‘page’]*$nres . ” )

                               where rnum >” . ($_GET[‘page’]-1)*$nres;

   $s = OCI_Parse($c, $q);

   OCI_Execute($s, OCI_DEFAULT);

   while (OCI_Fetch($s)) {

      // efectuar acções com os dados

}

else header(“Location: ../index.php?page=1”);

Servidor Oracle em Mac OS X Leopard

Para a disciplina de Base de Dados somos vá, “encorajados” a instalar o Oracle para o acompanhamento das aulas. Ora bem, eu utilizando o Mac e recusando-me a fazer uma partição para o Windows, andei a procura de uma melhor solução, que passasse por exemplo pela utilização de uma máquina virtual. Pois bem, encontrei aqui a solução. Vai ser utilizada uma versão do Ubuntu virada para servidores, o JeOS (lê-se “Juice”) e o OracleXE.

NOTA: Antes de começar é preciso dizer uma coisa (deixaram isto bem claro, por isso deve ser importante). Para o OracleXE, é preciso pelo menos mais do dobro de memória SWAP do que a memória física que a máquina virtual vai ter disponível (que pode ser cerca de 256 ou 320 MB), por isso tenham esse espaço SWAP em memória quando alocarem espaço para o disco. Por exemplo, se tiverem 256 MB reservados para a RAM da máquina virtual, o OracleXE vai pedir pelo menos 512MB de SWAP.

Vamos lá então por partes:

1 – Instalar o Sistema Operativo

  • Fazer o download da imagem do SO aqui (Aprox. 100MB) (YA! 100! Também achei fantástico.)
  • Abrir o VMware Fusion (vou utilizar aqui a versão 1.1.1), e seleccionar “New” para criar um disco virtual.
  • Escolher o sistema operativo, “Linux” e “Ubuntu”
  • Dar um nome e escolher onde quer guardar a imagem do disco virtual
  • Escolher um tamanho a dar ao disco (não se esquecendo da nota acima)
  • Seleccionar a imagem sacada há bocado e começar a instalar o SO.
  • Durante a instalação, dizer ao SO para não detectar o layout do teclado
  • Na altura da partição, assegurarem-se de reservar o espaço para o disco no início do disco virtual, e deixar o restante para a SWAP
  • Depois disso o sistema deverá instalar normalmente, e vai pedir um username e uma password para o utilizador (o normal, não estou a reinventar a roda)

2 – Preparar o sistema

  • Começar por actualizar o sistema com apt-get update e dist-upgrade
  • Reboot, pois a actualização vai instalar um novo kernel

sudo shutdown -r now

  • Instalar os seguintes pacotes: build-essential, linux-headers-$(uname -r), psmisc e wget
  • Agora é preciso instalar o VMware Tools, para isso:
  • Escolher o menu Virtual Machine > Install VMware Tools
  • O passo anterior vai disponibilizar um CD virtual, que deve ser montado com

sudo mount /media/cdrom0

  • A seguir, copia-se o ficheiro necessário para a instalação para a directoria tmp, descompacta-se o ficheiro e procede-se à instalação

sudo cp -a /media/cdrom0/VMwareTools*.gz /tmp/
cd /tmp/
sudo tar -xzvf VMwareTools*.gz
cd vmware-tools-distrib/
sudo ./vmware-install.pl

Escolhe-se sempre a opção padrão na instalação do VMware Tools.

3 – Instalação do OracleXE

  • Primeiro é preciso adicionar a linha do repositório correspondente ao OracleXE

sudo vi /etc/apt/sources.list

  • Premir “G” (maiúsculo) para ir para o fim do ficheiro e “A” para poder adicionar a seguinte linha:

deb http://oss.oracle.com/debian unstable main non-free

  • Agora é preciso adquirir a chave para o repositório:

wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add –

  • Fazer update ao sistema e instalar o OracleXE

sudo apt-get update
sudo apt-get install oracle-xe

  • Correr o ficheiro de configuração do programa

sudo /etc/init.d/oracle-xe configure

Deve ser escolhida a porta 8080 para porta web e 1521 para o listener da base de dados. Escolhe-se uma password para a conta SYS e por fim, é escolher “y” para iniciar o servidor automaticamente no startup, e está configurado o servidor!

4 – Conectar-se ao servidor através do Mac

Para isso é preciso ter alguma ferramenta capaz de se conectar a um servidor Oracle, eu vou mostrar como se faz no Oracle SQL Developer.

  • Por baixo da tab “Connections” clicar no botão “New connection”
  • Introduzir os seguintes parâmetros
  1. Connection name: Qualquer um (localdb, p.e.)
  2. Username: SYS (depois podem ser criados mais utilizadores)
  3. Pass: Password definida quando foi corrido o ficheiro de configuração
  4. Hostname: Para isso é preciso aceder à máquina virtual (cuja rede deve estar configurada no modo NAT) e correr o comando ifconfig, copiar o IP e colar neste campo
  5. Port: default (1521)
  6. SID: xe

Se tudo correr bem, temos uma base de dados pronta a funcionar!