Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PHPO2_DB
FRAMEWORK DE ACESSO A DADOS
Framework integrante da plataforma de desenvolvimento web PHPO2
GUIA RPIDO
DIMAS F. VIDAL
1 Edio
Rio de Janeiro
Edio do Autor
2015
O autor
DIMAS FERREIRA VIDAL
SUMRIO
INTRODUO
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
33
15
36
16
BIBLIOGRAFIA
39
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(
):
[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.
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.
MTODOS
public static getServer(
10
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
public createStatement($type
= "default")
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:
12
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
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
$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
Public executeQuery(String
$strSql)
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
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 )
17
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
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
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
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.
Public clear()
Return: void
Param: void
Este mtodo libera a memria dos dados resultantes da consulta.
21
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
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
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.
24
25
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
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
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
29
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
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.
31
O prximo teste ser realizado forando um erro no comando Sql, como no exemplo
abaixo.
32
33
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
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
36
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
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
39
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.