Sei sulla pagina 1di 40

0

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

PHPO2_DB
FRAMEWORK DE ACESSO A DADOS
Framework integrante da plataforma de desenvolvimento web PHPO2

GUIA RPIDO
DIMAS F. VIDAL

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

DIMAS FERREIRA VIDAL

Framework de Acesso a Dados


PHPO2_DB
GUIA RPIDO

1 Edio

Rio de Janeiro
Edio do Autor
2015

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Direitos autorais 2015 - 1 Edio

Licena Creative Commons

Esta obra esta baseada na Licena Creative Commons,


Commons combinando as verses de
Atribuies (BY), No Comercial (NC) e No Obras Derivadas (ND).
O contedo desta licena pode ser obtido em:
http://creativecommons.org/licenses/by
http://creativecommons.org/licenses/by-nc-nd/4.0/

O autor
DIMAS FERREIRA VIDAL

Economista e Administrador, Especialista em Desenvolvimento de Sistemas Orientado a


Objetos, Mestre em Administrao e Desenvolvimento Empresarial.
Professor e pesquisador da Universidade Estcio de S.
dimasvidal@phpo2.org
ogao na Publicao
Dados Internacionais de Catalogao
V649p Vidal, Dimas F.
PHPO2_DB - Framework de acesso a dados: guia rpido. / Dimas
F. Vidal Queimados,
Queimados RJ. 2015.
40 f.: il.
Manual de referncia sobre Framework,
Framework acesso a dados
Universidade Estcio de S, Queimados, 2015.
1. Framework de Acesso a Dados.
Dados 2. PHP. 3. Programao Web
I. Ttulo.
CDD 004 V649p

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

SUMRIO

INTRODUO

FRAMEWORK DE ACESSO A DADOS

INTERFASES E CLASSES

DATAPROVIDER

DBCONFIG

CONNECTION

10

TRANSAES

12

STATEMENT

13

STATEMENTCOLLECTION

16

10

DATASET

17

11

TRATAMENTO DE EXCEES

21

12

APLICAES PRTICAS

22

13

TESTES UNITRIOS

30

14

CONSULTAS EM MLTIPLAS TABELAS

33

15

INSERINDO DADOS EM MLTIPLAS TABELAS

36

16

BIBLIOGRAFIA

39

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Framework de Acesso a Dados PHPO2_DB


GUIA RPIDO
INTRODUO
O PHP nasceu como uma linguagem de programao para a web. Suas caractersticas
mais relevantes sempre foram: simplicidade, cdigo aberto, desenvolvimento
colaborativo, integrao ao servidor web, dentre outras. Ao longo dos anos o PHP
evoluiu e cresceu exponencialmente, muito devido a contribuio de dezena de milhares
de colaboradores em todas as partes do mundo, representando hoje a maior infraestrutura
web disponvel, particularmente com a combinao do PHP, o servidor web Apache e o
servidor de banco de dados MySql.
Esta evoluo transformou o PHP em uma plataforma completa, flexvel, com um
volume de recursos sem igual na indstria de desenvolvimento, disponvel a qualquer
desenvolvedor em virtude de ter seu cdigo fonte aberto. No entanto, este crescimento
foi resultado de um desenvolvimento descentralizado e em boa parte das vezes, sem fazer
uso de padres de projetos maduros e disseminados no mercado.
Com relao aos recursos disponveis para gerenciar acesso a banco de dados relacional,
estes sofrem as consequncias deste processo. Apesar de poderosos e de uma diversidade
comparvel s grandes plataformas de desenvolvimento, estas padecem da falta de uma
interface padro, e estas, em sua maioria se apresentam confusas.
Com a verso 5, foram introduzidos no PHP recursos mais maduros de Orientao a
Objetos. Estes novos recursos criaram a condio do surgimento de frameworks e
ferramentas de abstrao dos diversos recursos disponveis no PHP, fazendo uso das
melhores prticas de desenvolvimento, padres de arquitetura e de projetos, minimizando
assim os efeitos deste crescimento desordenado.

PHPO2_DB FRAMEWORK DE ACESSO A FONTE DE DADOS


EM PHP.
O PHPO2_DB um dos frameworks integrantes da plataforma de desenvolvimento web
PHPO2 que est sendo desenvolvida. No entanto, ele foi projetado para funcionar
totalmente independente, podendo ser utilizado em qualquer aplicao web que faa uso
de PHP. Abaixo so apresentados objetivos e solues a que ele se prope:

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

1. Desacoplar qualquer necessidade de acesso a dados aos mecanismos que o


fazem.
2. Permitir que a fonte de dados seja trocada sem que isto afete a aplicao.
3. Disponibilizar uma interface de acesso aos recursos do framework que seja de
domnio da comunidade.
4. Permitir a integrao dos diversos recursos disponibilizados pelo PHP atravs de
uma interface amigvel e de fcil aprendizado.
5. Disponibilizar mecanismos de configurao dos recursos de acesso a dados
independentes da aplicao.
6. Implementar mecanismos de segurana que permitam aplicar as melhores
prticas de mercado.
A figura 1 representa a interface da camada de servio do framework. Esta interface
dever ser usada, independente da fonte de dados que o sistema fizer uso.

Figura 1 Interface da camada de servio do PhpO2_db.


Fonte: Elaborao prpria.

DataProvider: A partir de uma classe de configurao, este componente o responsvel


por retornar um objeto Connection selecionado dinamicamente em funo da
definio do Servidor de Banco de Dados. Para isso, ele fornece um mtodo esttico, o
qual permite acesso funcionalidade diretamente pela classe DataProvider.

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

DbConfig: Classe destinada a fornecer as configuraes necessrias aos provedores de


acesso a dados. As configuraes devero ser feitas diretamente nas propriedades da
classe, pois por uma necessidade de segurana, no esto disponveis mtodos para
adicionar ou alterar os valores de suas propriedades.
Dentre as propriedades disponveis se destacam as trs reservadas para os tipos de
usurios e suas respectivas senhas. O objetivo permitir ao desenvolvedor utilizar
usurios com as permisses adequadas aos requisitos de segurana, dependendo das
funcionalidades que sero utilizadas.
Esta classe no estar disponvel para ser utilizada pela aplicao, ficando reservada ao
Framework.
Connection: Interface responsvel por estabelecer conexo com o servidor de banco de
dados. A definio da classe concreta de conexo definida dinamicamente em funo
das definies disponibilizadas pela classe DbConfig. A interface Connection
disponibiliza, ainda, um mtodo abstrato responsvel por retornar objetos Statement ou
StatementCollection.
Statement: Interface responsvel executar strings Sql a partir de uma conexo
estabelecida. Esto disponveis duas classes concretas desta interface, para cada servidor
suportado. Uma para executar comandos nicos e outra para executar uma coleo de
strings Sql. Ao executar um comando de consulta, ambas as classes retornam Datasets,
seja diretamente, no caso de classes Statement, seja atravs da coleo, no caso de
classes StatementCollection.
Dataset: Interface responsvel por armazenar resultados de consultas Sql a banco de
dados. As classes concretas Dataset implementam mtodos de navegao, de iterao e
de acesso aos dados armazenados.

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

INTEFACES E CLASSES
DESCRIO

DataProvider
Classe destinada a selecionar e retornar o provedor de acesso a dados de acordo com as
configuraes definidas na classe DbConfig.

MTODOS
Public Static createConnection(

):

Return: [Objeto] Connection


Mtodo esttico destinado a criar e retornar uma instncia do objeto Connection
correspondente ao Servidor de Banco de Dados definido na configurao.
Param: void
No h parmetros para este mtodo
Obs: Por ser um mtodo esttico, este mtodo dever ser chamado diretamente pela
classe. Portanto, esta classe no dever possuir uma instncia de objeto.
Exemplo:

[Descrio]
Primeiramente inclumos o arquivo que possui a classe DataProvider como mostra a
linha 5.
Para fazer uso do framework PHPO2_DB, este o nico arquivo a ser includo, pois os
outros arquivos necessrios sero includos automaticamente em tempo de execuo.
Na linha 7, o componente DataProvider retorna uma instncia do objeto Connection
correspondente s informaes fornecidas pela configurao. Esta configurao estar
em um ponto central a toda aplicao atravs da classe DbConfig.

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

DbConfig
Classe destinada a fornecer os dados de configurao de acesso a dados. A configurao
ser feita atravs das propriedades da classe, no entanto, esta configurao dever ser
feita diretamente nas propriedades em tempo de desenvolvimento, pois por motivo de
segurana, esta classe no fornece mtodos sets para configurao atravs da aplicao.
Dentre as propriedades disponveis, a classe disponibiliza 3 (trs) usurios e respectivas
senhas, que devero ser utilizadas para definir nveis de acesso distintos. Assim o usurio
1 dever ser configurado como usurio de nvel 1, ou seja, usurios que tenham somente
permisso de leitura. Usurio 2 dever ser configurado como nvel 2, o qual dever ter
permisso de leitura e escrita, mas no dever possuir permisso de criar, alterar e deletar
tabelas ou o prprio banco de dados. O usurio 3, com permisso de nvel 3, dever ter
permisso completa ao banco de dados correspondentes, mas no devero ter permisso
de administrador no servidor.
Na outras propriedades sero definidos o servidor, o local de rede do servidor, a porta do
protocolo TCP, e o nome do banco de dados.
Est disponvel tambm uma propriedade para estabelecer o status para as mensagens de
erro e de excees. H duas possibilidades de configurao para esta propriedade
[DEV e PRO]. Na primeira, todas as mensagens de erro sero apresentadas ao
desenvolvedor, para que possa identificar de forma mais adequada as ocorrncias de erro
ou excees do framework. Na segunda opo, ou seja, quando a aplicao for colocada
em produo, as mensagem sero substitudas pelos respectivos cdigos de erro. Este
recurso permite adicionar um requisito a mais de segurana.

PROPRIEDADES
Private static Server
Propriedade responsvel por definir o servidor de banco de dados e o correspondente
provedor de acesso a ele.

Private static Host


Propriedade destinada a definir o local do servidor. Se o servidor estiver no mesmo host,
a configurao dever ser localhost, caso contrrio dever ser definido o endereo IP
do servidor na rede.

Private static Port


Propriedade destinada a definir a porta do protocolo de rede.

Private static Database


Propriedade destinada a definir o nome do banco de dados.

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Private static User1


Propriedade destinada a definir o usurio de nvel 1. conveniente que este usurio
tenha permisso de acesso de somente leitura.

Private static Password1


Propriedade destinada a definir a senha do usurio de nvel 1.

Private static User2


Propriedade destinada a definir o usurio de nvel 2. conveniente que este usurio
tenha permisso de acesso de leitura e escrita.

Private static Password2


Propriedade destinada a definir a senha do usurio de nvel 2.

Private static User3


Propriedade destinada a definir o usurio de nvel 3. conveniente que este usurio
tenha permisso de acesso completo para a database.

Private static Password3


Propriedade destinada a definir a senha do usurio de nvel 3.

Private static status_message


Propriedade destinada a definir o status de mensagens de depurao. H duas
configuraes possveis: DEV para desenvolvimento e PRO para produo.
Quando definido para desenvolvimento, todas as mensagens de depurao (erro e
excees) iro aparecer para o desenvolvedor. Quando definida como Produo, somente
os cdigos de erro sero mostrados.
Por padro ela vem configurada como DEV.

MTODOS
public static getServer(

Return: [String] O nome do servidor


Mtodo destinado a retornar o servidor que ser utilizado. Este servio ser utilizado
internamente pelo componente DataProvider.

public static getParam(

Return: [String] Parmetros de conexo ao banco de dados

10

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Este mtodo retorna os parmetros que sero utilizados pela classe Connection para abrir
conexo com o banco de dados. Este servio ser utilizado internamente pelo
componente connection.
Obs: Estes e outros mtodos desta classe no possuem servios destinados aplicao,
portanto no devem ser utilizados por ela.
Exemplo de configurao de DbConfig.

Connection
Classe abstrata destinada a estabelecer conexo com banco de dados. Por fazer uso do
design pattern Abstract Factory, o framework fornece o objeto da classe concreta
correspondente ao servidor de banco de dados configurado em DbConfig.

MTODOS
public connect($nivel

= NIVEL1)

Return: Void
Mtodo destinado a abrir conexo com o servidor de banco de dados. Este mtodo possui
um nico parmetro NIVEL o qual pode ser definido por trs constantes de
configurao.

11

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

NIVEL1: Para estabelecer permisso de acesso a nvel 1.


NIVEL2: Para estabelecer permisso de acesso a nvel 2.
NIVEL3: para estabelecer permisso de acesso a nvel 3.
Por padro o mtodo configurado em NIVEL1.
Por ter sido desenvolvido pelo design pattern Singleton se o desenvolvedor solicitar
outra conexo com o banco de dados em um outro nvel, a conexo atual ser fechada e
uma nova ser aberta.

public createStatement($type

= "default")

Return: [objeto] Statement


Param: [String] $type
O mtodo createStatement tem a funo de retornar uma instncia de objeto Statement.
O mtodo possui um nico parmetro, responsvel por definir o tipo de objeto que ser
retornado. At a presente data, esto disponveis 2 (dois) tipos disponveis:

Statement (default)

StatementCollection

O primeiro responsvel por executar 1 (um) comando SQL de cada vez, j o segundo
capaz de executar mltiplos comando SQL.
Este mtodo no faz uso do design pattern Singleton, portanto, pode retornar mais de
uma instncia de um objeto Statement. Na verdade, em muitas circunstncias, mltiplas
instncias podem ser teis no desenvolvimento de determinada lgica.
Exemplos do mtodo createStatment:

Exemplo1 Retorna um objeto Statement default.

12

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Exemplo2 Retorna um objeto StatementCollection.

TRANSAES
Tirando proveito dos recursos disponveis no PHP, o framework disponibiliza recursos
de transao a partir dos Servidores de Bancos de Dados que os implementam.
Para usar os recursos de transao do framework ser necessrio fazer uso do mtodo
Begin.

Public begin()
Return: void
Param: void
Abre uma transao no servidor de banco de dados. Este mtodo permite que se faa uso
dos mtodos COMMIT E ROLLBACK.

Public commit()
Return: [Bollean]
Param: void
Este mtodo efetiva uma transao, caso no haja algum problema. Retorna true ou
false no caso de sucesso ou insucesso na transao.

Public rollback()
Return: void
Param: void
Este mtodo retorna o status anterior do banco de dados antes da transao, desfazendo
possveis alteraes sofridas por este. .

13

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Exemplo:

Statement
Classe abstrata destinada a executar e preparar comandos SQL no servidor de banco de
dados.
At o presente momento esto disponveis duas classes Statement para cada servidor
suportado. Uma default [padro] responsvel por executar um comando SQL de cada
vez, e outra, StatementCollection, responsvel por executar mltiplos comandos
armazenados em uma coleo. Por fazer uso de uma mesma interface, possuem os
seguintes mtodos em comum:

MTODOS
Public prepare(String

$str)

Return: Void
Param: [String] String SQL
Mtodo destinado a preparar uma String SQL para receber parmetros de aplicao que
sero filtrados pelo mtodo setParam.

14

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Public setParam(String $param, Constante $type, Boolean

$encode)
Return: Void
Param: [String] Parmetro que far parte da string SQL.
Param: [Constante] Tipo do parmetro sob a tica do SGDB {default} STRING.
Param: [Boolean] $encode {default} true
Mtodo destinado a filtrar e inserir um atributo passado como parmetro na string SQL
preparada pelo mtodo prepare. O mtodo prepare dever ser executado antes do uso do
mtodo setParam.
O parmetro $encode definido como true (default) ir filtrar tags HTML e PHP e
Javascript.
Este mtodo ainda executa uma filtragem para eliminar ou diminuir a possibilidade de
injeo de SQL.
Exemplo da aplicao dos mtodos prepare e setParam.

Public execute(String

$strSql)

Return: Void
Param: [String] string SQL opcional
Mtodo destinado a executar uma string Sql que no seja uma consulta [select]. Caso
seja usado o mtodo prepare, a string Sql no deve ser passada como parmetro para o
mtodo, pois isto ser feito internamente.
Exemplo da aplicao do mtodo execute.

15

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Public executeQuery(String

$strSql)

Return: [objeto] Dataset


Param: [String] string SQL opcional
Mtodo destinado a executar uma string SQL de consulta [select]. Caso seja usado o
mtodo prepare, a string Sql no deve ser passada como parmetro para o mtodo, pois
isto ser feito internamente.
Este mtodo retorna uma instncia do objeto Dataset responsvel por gerenciar o
resultado da consulta.
Exemplo da aplicao do mtodo executeQuery.

Public lastInsertId()
Return: [Inteiro] Retorna o ltimo id (autoincrement) inserido do banco de dados
Param: void
Este mtodo retorna o id do ultimo registro inserido no banco de dados. Para us-lo o
registro dever ser realizado no mesmo bloco de cdigo.

16

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

StatementCollection
As classes concretas StatementCollection implementam todos os mtodos da interface
Statement e ainda implementam os mtodos da inteface StatementCollection a seguir:

Public

addItem()

Mtodo destinado a adicionar uma string SQL preparada pelo mtodo prepare na
coleo do objeto que sero executadas pelo mtodo execute ou executeQuery.
Exemplo da aplicao do mtodo addItem.

Public getDataset(Integer

$index )

Return: [objeto] dataSet


Param: [integer] nmero ndice correspondente ao nmero de elementos da coleo.
Este ndice comea com 1 (um).
Este mtodo responsvel por retornar uma instncia de dataset em funo do parmetro
passado ao mtodo.
O mtodo exige como parmetro o nmero ndice correspondente ao nmero do item em
funo da ordem na coleo. Este ndice comea com 1 (um).
Exemplo da aplicao do mtodo getDataset.

17

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Dataset
Classe abstrata destinada a gerenciar o resultado de uma consulta ao banco de dados. A
instncia do objeto Dataset obtida a partir do mtodo executeQuery de Statement.

MTODOS
Public getData(String

$field)
Public getData(Integer $index)
Return: [Field] Campo do registro atual
Param: [String] Nome do campo
Ou
Param: [Integer] Nmero ndice do campo (incio em zero)
Este mtodo retorna um campo do registro atual dentre aqueles que foram adicionados na
string Sql.
Esto disponveis duas alternativas de acesso aos campos dos registros, pelo nome do
campo ou pelo ndice da matriz de resultado.
Exemplo da aplicao do mtodo getData.

18

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Public hasNext()
Return: [Boolean]
Param: void
Este mtodo retorna verdadeiro se houver um registro seguinte posio do ponteiro
atual, posicionando neste registro seguinte, e falso, se no houver mais registros,
mantendo o ponteiro neste ltimo registro.
Deve ser utilizado em conjunto com uma estrutura WHILE para percorrer (iterar) todos
os registros retornados de uma consulta.
Exemplo da aplicao do mtodo hasNext.

19

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Public numRows()
Return: [Integer] nmero de registros da consulta
Param: void
Este mtodo retorna o nmero de registro de uma consulta ao banco de dados.

Public getRow()
Return: [Integer] nmero do registro atual
Param: Void
Este mtodo retorna o numero do registro atual (posio do ponteiro na matriz de
resultados). Por padro, aps uma consulta o ponteiro posicionado no primeiro registro.

20

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

MTODOS DE NAVEGAO

Public first()
Return: void
Param: void
Este mtodo posiciona o ponteiro para o primeiro registro da consulta.

Public next()
Return: void
Param: void
Este mtodo posiciona o ponteiro para o prximo registro da matriz de resultados.

Public prior()
Return: void
Param: void
Este mtodo posiciona o ponteiro no registro anterior posio atual da matriz de
resultados.

Public last()
Return: void
Param: void
Este mtodo posiciona o ponteiro no ltimo registro da matriz de resultados da consulta.

Public getRecord(Integer

$index)

Return: void
Param: [Integer] ndice do registro
Este mtodo posiciona o ponteiro no registro em funo do ndice passado como
parmetro ao mtodo.

MTODO PARA A LIBERAO DE MEMRIA

Public clear()
Return: void
Param: void
Este mtodo libera a memria dos dados resultantes da consulta.

21

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

TRATAMENTO DE EXCEES
A partir da verso 5 do PHP esto disponveis mecanismos maduros de tratamento de
excees. Estes mecanismos foram adicionados ao framework PHPO2_DB, tal que
permita ao desenvolvedor mais flexibilidade no tratamento de erros e das excees que
so lanadas pelo framework.
O PHP disponibiliza o bloco TRY para adicionar toda a lgica a ser implementada com
os recursos do framework, e o bloco CATCH para implementar a lgica do tratamento do
erro.
Neste caso, o desenvolvedor poder apresentar a mensagem de erro disparada pela
exceo, poder redirecionar a outra pgina usando os recursos do PHP, dentre outras
possveis aes.
Por uma questo de segurana, o framework disponibiliza dois tipos de apresentao das
mensagens de erro, conforme a configurao da classe Dbconfig.
Caso a propriedade status_message da classe DbConfig esteja definida como DEV
(desenvolvimento), em caso de excees, os textos das mensagem de erro sero
apresentados. Caso esteja definida como PRO (produo), s sero apresentados o
cdigos de erro.
Exemplo da aplicao do tratamento de excees do framework.

22

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

APLICAES PRTICAS
A partir de agora vamos abordar algumas aplicaes prticas para uma maior
compreenso dos recursos do framework. Os exemplos a seguir foram desenvolvidos
para um banco de dados Mysql. Vale relembrar que no momento em que esta edio
deste manual estava sendo escrito, ainda no estavam disponveis as classes concretas
para os outros SGDB.
Pressupe-se que voc j possui em seu sistema de teste o servidor apache com PHP e
um servidor Mysql. No faz parte do escopo desta publicao descrever como instalar
estes recursos. Se voc estiver trabalhando em uma plataforma Windows, h uma
variedade de aplicativos para este fim, tais como o Xamp, o wampserver, etc.

23

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

O primeiro passo criar um banco de dados com o nome exemplo. Para tanto, acesse o
Phpmyadmin de seu aplicativo pelo endereo: http://localhost/phpmyadmin/.
Crie uma tabela de acordo com o script abaixo:
CREATE TABLE IF NOT EXISTS `cliente` (
`cliente_id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(60) CHARACTER SET latin1 NOT NULL,
`email` varchar(60) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`cliente_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=100 ;

Crie trs usurios e suas respectivas senhas sem nenhum privilgio no servidor. Para
cada usurio voc vai estabelecer um nvel de privilgio ao banco de dados exemplo.
Para o primeiro usurio d privilgio de somente leitura, para o segundo, d privilgio de
leitura e escrita, e para o terceiro, d os privilgios que considerar necessrio sua
aplicao, tais como criar tabelas, deletar tabelas, criar novos campos, etc.
Crie uma pasta teste em seu servidor apache. Faa o download do framework em
HTTP://www.phpo2.org, salve e descompacte o arquivo na pasta teste.
Crie um arquivo com nome exemplo1.php, salve na paste teste e insira o cdigo
abaixo, com seu editor preferido.

Note que foi includo o arquivo dataprovider.php atravs do comando require_once.


Para qualquer aplicao que fizer uso do framework PHPO2_DB, este o nico arquivo
que deve ser includo. Todos os outros arquivos necessrios sero includos
dinamicamente em tempo de execuo, mantendo assim sua aplicao mais leve.
Se voc chamar a pgina no navegador, nada ser executado, portanto ser apresentada
uma pgina em branco.
CRIANDO UMA PRIMEIRA APLICAO
Uma tabela em um banco de dados sem registro no tem muita utilidade, portanto, vamos
criar uma aplicao que possa inserir dados de alguns clientes hipotticos, preenchendo

24

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

os campos de nome e e-mail. No ser necessrio inserir o campo cliente_id


visto ser este um campo autoincremento. Para tanto, por uma questo didtica vamos
relacionar os valores a serem inseridos em variveis simples, preparar uma string SQL de
insero de dados e por fim, executar esta string.
O primeiro passo efetuar as configuraes necessrias na classe DbConfig, para tanto,
acesse a pasta database e abra o arquivo dbconfig.php. Configure as propriedades,
dando especial ateno para os usurios que voc criou, como o exemplo abaixo:

As configuraes de $server, $host, e $port, so padres do servidor Mysql. Caso seu


servidor possua outras configuraes s alter-las. A propriedade $status_message
deve ser mantida em DEV, pois estamos em um processo de desenvolvimento. Quando
uma aplicao entrar em produo, esta propriedade deve ser alterada para PRO. Esta
mudana faz com que as mensagens de erro do framework no sejam apresentadas. Em
seu lugar sero apresentados somente seus cdigos.
Abra novamente o arquivo exemplo1.php, e insira o cdigo abaixo:

25

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

O prximo passo ser abrir um bloco try / catch para gerenciar as possveis excees
que surgirem.

Em seguida, insira o cdigo abaixo. Repare que antes do bloco try foi chamado o
mtodo createConnection da classe DataProvider, responsvel por retornar uma
instncia do objeto Conection.
importante destacar que o mtodo foi chamado diretamente pela classe [linha 27], sem
a necessidade de uma instncia do objeto, pois se trata de um mtodo esttico.

26

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Na linha 28 aberto uma conexo com o banco de dados em Nivel 2, [usurio com
permisso de leitura e gravao] pois iremos fazer uma gravao na tabela cliente.
O prximo passo obter uma instncia do objeto Statement para realizar um comando
SQL. Para tanto, foi chamado o mtodo createStatement do objeto Connection.
Observe que foi passado como parmetro ao mtodo createStatement a string
collection pois ser preciso uma instncia do objeto StatementCollection para que
sejam executados diversos comandos SQL de insero de dados na tabela.
Como ser utilizado o recurso de preparao do comando SQL, define-se a string SQL
com este propsito, como apresentado na linha 30. Em seguida, executa-se o comando
prepare do objeto Statement. Nas linhas seguintes so definidos os parmetros que sero
inseridos na String que foi preparada, atravs do mtodo setParam do mesmo objeto.
Como se trata de uma coleo [mltiplos] de comandos SQL, se faz necessrio adicionlos, um a um, na coleo do objeto StatementCollection, atravs do mtodo addItem.
Adicionados todos os comandos SQL na coleo, resta executar estes comandos [linha
45].
importante relembrar que o comando execute do objeto Statement no retorna uma
instncia de Dataset.
Agora resta abrir o navegador web e digitar: localhost/teste/exemplo1.php. Ao faz-lo
s ser apresentada a mensagem Registros efetuados com sucesso.

27

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Abra o PhpMyAdmin, execute o comando Sql Select * FROM cliente para confirmar
se os dados foram realmente gravados. Se tudo ocorreu perfeitamente, ser apresentada a
tela abaixo.

No entanto, essa apresentao de confirmao dos dados que foram inseridos, poderia
fazer parte de nossa aplicao de exemplo. O cdigo abaixo realiza esta funo. Observe
que a linha de cdigo com o mtodo execute do objeto StatementCollection foi
comentada, para que os dados dos clientes no sejam inseridos novamente em outros
registros.

28

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Na linha 48, o mtodo createStatement do objeto Conection faz a chamada a um a


instncia Statement que executam comandos Sql nicos.
Neste bloco no foi utilizado o recurso de preparao da string, pois no havia a
necessidade de variveis externas. Neste caso, a string Sql que ser executada passada
diretamente ao mtodo executeQuery do objeto Statement.

Lembrete: Dentre as diversas funcionalidades executadas pelos mtodos prepare e


setParam do objeto Statement, destacam-se filtros internos que eliminam cdigos
maliciosos e injeo Sql.

Uma instncia de Dataset retornada quando o mtodo executeQuery executado. Nas


linhas seguintes [linhas 51 a 53] realizado um looping while fazendo uso do mtodo
hasNext do objeto Dataset e em seguida so apresentados os campos dos registros [um a
um] pelos seu ndices, atravs do mtodo getData do mesmo objeto.
Chame novamente a pgina localhost/teste/exemplo1.php. O resultado ser:

29

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

importante destacar que caso seja necessrio a insero de dados de um nico registro,
ou de um registro de cada vez, fazer uso do objeto Statement default o mais indicado.
O exemplo abaixo mostra esta possibilidade.

Pode-se observar que no foi utilizado o mtodo addItem, visto que ele no est
disponvel para a classe Statement, visto que ela no estende a interface
StatementCollection.
importante destacar que neste exemplo foi utilizado o nome do campo da tabela
cliente, no lugar do ndice, como parmetro do mtodo getData do objeto Dataset.
O resultado ser:

30

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Observe que o registro do Sr Joaquim Jose da Silva Xavier foi adicionado na tabela.

TESTES UNITRIOS
TRATAMENTO DE EXCEES
Para uma melhor compreenso dos recursos at aqui estudados, vamos fazer alguns testes
com o objetivo de verificar as diversas possibilidades de tratamento de erro.
O primeiro teste verificar o resultado de um erro de conexo com o banco de dados,
para tanto, abra o arquivo dbconfig.php e altere o nome do banco de dados de exemplo
para exemplob . Como no h esta database no servidor, ao chamar a pgina
novamente, ser gerada uma exceo.
Se a diretiva display errors do PHP estiver desativada, ser apresentada a tela abaixo.

Caso contrrio, o resultado ser:

31

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

O prximo teste ser realizado forando um erro no comando Sql, como no exemplo
abaixo.

Primeiro, as linhas 20 e 21 foram comentadas para que os dados no sejam salvos


novamente em outro registro, e para que no seja mostrada a mensagem correspondente.
Em seguida escreve-se SELECTO no lugar de SELECT na string Sql que ser
executada [linha 24]. Na linha 34 foi adicionado o mtodo getTraceAsString do objeto
Exception com o objetivo de mostrar as informaes sobre o processo na progresso da
exceo. Ao rodar a pgina novamente, o sero apresentados na mensagem
correspondente causa da exceo, o arquivo, a pgina e a linha de cdigo
correspondente.

32

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

33

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

CONSULTAS EM MLTIPLAS TABELAS


RELACIONAMENTO UM PARA MUITOS
Para os prximos exemplos ser preciso criar uma nova tabela e definir um campo de
relacionamento com a primeira, atravs de uma chave estrangeira cliente_id.
Execute as strings Sql abaixo no banco de dados Exemplo. A primeira String cria a
tabela endereco com os campos necessrios a este fim. A segunda insere alguns dados
na tabela, incluindo as chaves estrangeiras necessrias aos relacionamentos com a tabela
cliente.

CREATE TABLE IF NOT EXISTS `endereco` (


`endereco_id` int(11) NOT NULL AUTO_INCREMENT,
`cliente_id` int(11) NOT NULL COMMENT 'chave estrangeira de Cliente',
`tipo` varchar(30) NOT NULL,
`Endereco` varchar(100) CHARACTER SET latin1 NOT NULL,
`Bairro` varchar(50) CHARACTER SET latin1 NOT NULL,
`Cidade` varchar(50) CHARACTER SET latin1 NOT NULL,
`Pais` varchar(50) CHARACTER SET latin1 NOT NULL,
`CEP` varchar(10) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`endereco_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

INSERT INTO `endereco` (`endereco_id`, `cliente_id`, `tipo`, `Endereco`,


`Bairro`, `Cidade`, `Pais`, `CEP`) VALUES
(1, 3, 'Residencial', 'Rua dos Tamoios, n 102, apto 204', 'Centro',
'Rio de Janeiro', 'Brasil', '21300120'),
(2, 2, 'Comercial', 'Rua Baro de Carandai, 2, sala 2015', 'Centro',
'Rio de Janeiro', 'Brasil', '21410035'),
(3, 3, 'Praia', 'Praia Grande, 120, apto 342', 'Praia Grande', 'Arraial
do Cabo', 'Brasil', '27852100'),
(4, 3, 'Comercial', 'Av. Brasil, 15003', 'Centro', 'Rio de Janeiro',
'Brasil', '21410320'),
(5, 2, 'Residencial', 'Av. Brasil, 1.250', 'Penha', 'Rio de Janeiro',
'Brasil', '21.385-456'),
(6, 1, 'Residencial', 'Rua das Flores, 120', 'Campo Grande', 'Rio de
Janeiro', 'Brasil', '21.563-150'),
(7, 4, 'Residencial', 'Rua Constantino de Souza, 10', 'Jacarepagua',
'Rio de Janeiro', 'Brasil', '21.456-020'),
(8, 4, 'Comercial', 'Av. Rio Branco, 1250 sala 1002', 'Centro', 'Rio de
Janeiro', 'Brasil', '21000-450'),
(9, 5, 'Residencial', 'Av do Contorno, 2045', 'Centro', 'Duque de
Caxias', 'Brasil', '26.345-087');

Crie um novo arquivo e salve-o com o nome de exemplo2.php. Vamos desenvolver uma
pequena aplicao que faa busca em um cliente especfico e mostre seus dados e seus
possveis endereos. importante relembrar que por se tratar de uma funcionalidade de
leitura, devemos utilizar um usurio do banco de dados em NIVEL 1.

34

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Insira o cdigo abaixo.

Se atentarmos para a linha 9, o mtodo Begin do objeto Connetion abre uma transao
no banco de dados. Ao faz-lo, o comando executeQuery s far efeito depois do mtodo
Commit do mesmo objeto retornar true. Para tanto vamos completar o cdigo de nossa
aplicao.

35

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

As estruturas Commit e Rollback fornecem os recursos necessrios para executar a


transao. A primeira efetiva as aes realizadas melo mtodo executeQuery, e caso
acontea algum erro no processo, Rollback retorna o estado anterior das tabelas
envolvidas.
claro que um algoritmo de consulta no precisaria de um controle de transao, no
entanto, o exemplo tem como objetivo demonstrar este poderoso recurso.
Em virtude de ter sido executado duas consultas, so retornados dois Datasets atravs do
mtodo getDataset do objeto StatementCollection.
Como j era sabido que a primeira consulta iria retornar somente um registro, no foi
necessrio realizar um looping para se obter os dados do cliente. No entanto, para o
segundo Dataset, em funo de ser possvel mais de um endereo, o looping foi
necessrio.
Abra o navegador e digite: localhost/teste/exemplo2.php. O resultado ser:

36

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

INSERINDO DADOS EM MLTIPLAS TABELAS


RELACIONAMENTO UM PARA MUITOS
O prximo exemplo apresenta um algoritmo mais complexo, a partir de dois blocos
distintos: No primeiro ser realizada a insero dos dados nas duas tabelas, estabelecendo
o relacionamento necessrio entre elas. Esta operao ser realizada sob uma transao
para garantir a integridade referencial. No segundo bloco, ser realizada as consultas nas
tabelas envolvidas para que se confirme que os dados foram realmente salvos.
Crie outro arquivo, salve-o como exemplo3.php e insira o cdigo abaixo.

Os dados de nome e e-mail foram armazenados nas respectivas variveis e os dados dos
dois endereos da cliente foram armazenados em um array multidimensional.
O prximo passo ser definir o cdigo para inserir os dados nas duas tabelas.

37

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Foram utilizados dois objetos Statement, um default para realizar a primeira operao
INSERT, e outro do tipo StatementCollection, para realizar uma operao de mltiplos
INSERTS, para tanto, foi utilizado um foreach para varrer o array multidimensional
para definir os parmetros da string preparada [linhas 42 a 49].
O prximo passo ser realizar a transao e definir o cdigo de apresentao dos
registros que foram inseridos.

38

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

Este bloco possui um algoritmo igual ao exemplo 2.


No portal do projeto HTTP://www.phpo2.org esto disponveis para download o
arquivo compactado do framework, bem como este manual. Faa bom uso destes
recursos e no deixe de reportar algo que considerar importante pelo e-mail
suporte@phpo2.org.
DIMAS F. VIDAL

39

FRAMEWORK DE ACESSO A DADOS PHPO2_DB

BIBLIOGRAFIA
FLOWLER, M., RICE, D., FOEMMEL, M., HIEATT, E. MEE, R. STAFFORD,
R. Padres de Arquitetura de Aplicaes Corporativas. Bookman, Porto Alegre,
2008.
GAMMA, E., HELM, R., JOHNSON, R., VLISSDES, J. Padres de Projeto:
solues reutilizveis de software orientado a objetos. Bookman, Porto Alegre.
2008.
GUERRA, Eduardo. Design Patterns com Java, Casa do Cdigo, So Paulo,
2008.
HORSTMANN, Cay. Padres e Projeto Orientados a Objetos. Bookman, Porto
Alegre, 2007.
TURBAN, E. MCLEAN, E. & WETHERBE, J. Tecnologia da Informao para
Gesto: transformando os negcios na economia digital, Bookman, Porto Alegre,
2007.
DALLOGLIO, Pablo. PHP, Programando com Orientao a Objetos. Novatec,
So Paulo. 2009.
NIEDERAUER, Juliano. PHP para quem conhece PHP. Novatec, So Paulo.
2008.
SINTES, Anthony. Programao Orientado a Objetos, Makron Books, So Paulo
2010.
SILVA, Maurcio Samy, JQuery UI: componentes de interface rica para
aplicaes web. Novatec, So Paulo. 2012.
BEBIN, Lee. Ajax com PHP; do iniciante ao profissional. Alta Books. Rio de
Janeiro. 2007.
SOARES, Walace. Ajax: Asynchronous Javascript and XML. rica. So Paulo.
2006.

Potrebbero piacerti anche