Vous êtes sur la page 1sur 11

PHP Data Object

O que The PHP Data Objects (PDO)?


PDO uma extenso do PHP5 para formalizar conexes com uma base de dados de maneira uniforme. Assim o programador cria um cdigo porttil atravs de vrias bases de dados e plataformas. Nesse caso o programador altera a base de dados, mudando apenas uma linha de cdigo e o projeto trabalhar com a base de dados selecionada.

Instalao (Windows)
A instalao simples, basta voc ter na mquina o PHP5 instalado e verificar se as extensions esto na pasta. Editar o arquivo php.ini e descomentar as seguintes linhas: (tire o ; da linha) PDO dll: extension=php_pdo.dll Ddl do banco que vai utilizar: extension=php_pdo_firebird.dll extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll

Restart o Apache e pronto. Se voc no conseguir existe uma maneira mais simples usando o WAMP5. Baixe o WAMP5 (http://www.wampserver.com/en/download.php) execute o arquivo baixado, instale em c:\wamp. A instalao muito simples sem nenhum segredo. No final voc estar com o PHP, o Mysql e o Apache rodando redondinho em sua mquina. Para habilitar o PDO, basta voc clicar no cone do wamp que se encontra no system try ( barra do Windows perto do relgio) ir em PHP extensions clicar na extenso php_pdo e depois na extenso do banco de dados que voc vai utilizar. No meu caso escolhi php_pdo_mysql. Restart o Apache e pronto. Obs: todos os seus arquivos tero que estar em c:\wamp\www. Para saber se os drivers esto funcionando, abra o bloco de notas (Iniciar > Executar: notepad ) digite isso: PHP 1. 2. 3. 4. 5. <?php foreach(PDO::getAvailableDrivers() as $driver){ echo $driver.'<br />'; } ?>

www.revistaphp.com.br

Salve o arquivo como drivers.php na pasta do wamp: c:\wamp\www Execute no navegador: http://localhost/drivers.php ser exibido uma lista com os drivers instalado. Conectando uma base de dados Para conectarmos a base de dados selecionada, bem simples basta instanciar um objeto de nosso PDO. Exemplo:
PHP 1. $pdo = new PDO("tipo_do_banco:host=o_host;dbname=nome_da_base, usurio, senha ); 2. www.revistaphp.com.br mysql em minha mquina: PHP 1. $pdo = new PDO(mysql:host=localhost;dbname=teste, root, xxxxx); www.revistaphp.com.br Obs: maiores informaes de como conectar outros banco de dados: http://www.php.net/manual/pt_BR/ref.pdo.php#pdo.drivers

Executando uma query SELECT


Depois de conectar o banco de dados escolhido, no meu caso o mysql, vamos agora brincar com o nosso banco de dados aberto. Lembre sempre de fechar o banco. Cdigo: PHP 1. <?php 2. 3. try{ 4. // conecto a base de dados 5. $pdo = new PDO("mysql:host=localhost;dbname=teste", "root", "xxxxx"); 6. // a partir daqui j tenho um objeto PDO 7. 8. // preparo uma query a ser executada 9. $stmt = $pdo->prepare("SELECT * FROM agenda"); 10. // executo a query 11. $stmt->execute(); 12. // a partir daqui eu tenho um array com todo o resultado de minha query 13. // vamos agora varrer esse array

14. 15. 16. 17. 18.

// lembra do mysql_fetch_array? while ($rs = $stmt->fetch(PDO::FETCH_OBJ)) { // aqui eu mostro os valores de minha tabela // veja que no objeto $rs estou usando o nome real do campo da tabela 19. echo "Nome: ".$rs->nome." - Email: ".$res>email."<BR>"; 20. } 21. // fecho o banco 22. $pdo = null; 23. // tratamento da exeo 24. }catch(PDOException $e){ echo $e->getMessage(); } 25. 26. ?> www.revistaphp.com.br Output: Nome: Joo Maria Email: joaomaria@gmail.com Nome: Chico Jos Email: chicojose@hotmail.com Nome: Maria Delfina Email: mariadelfina@yahoo.com Pronto com isso temos uma manipulao de banco de dados genrica simples e segura. Espero ter ajudado, na prxima edio estarei mostrando uma classe fbrica de conexes utilizando o PDO e uma classe DAO (Data Access Object) que far acesso a essa classe e voc ter um script 100% OO no PHP. At a prxima =)

PHP Data Object: ConnectionFactory ( parte 2 )


Continuando nosso assunto sobre PHP Data Object e como eu tinha prometido, vou mostrar como pode ser til uma fbrica de conexes utilizando o PDO. Iremos ver tambm nos prximos posts desse artigo como utilizar o padro de projeto de classes DAO (Data Access Object), a idia fazer que o programador no se preocupe com conexo com o banco. O DAO cria uma camada na aplicao separando as rotinas de acesso a banco de dados, gerao de SQL, das rotinas de negcio de tal modo que os objetos de negcio no saibam como esto sendo gravados. Vamos para a nossa classe PDOConnectionFactory: PDOConnectionFactory.class.php (utilizando o MySQL)
PHP

1. class PDOConnectionFactory{ 2. // recebe a conexo 3. public $con = null; 4. // qual o banco de dados? 5. public $dbType = "mysql"; 6. 7. // parmetros de conexo 8. // quando no for necessrio deixe em branco apenas com as aspas duplas "" 9. public $host = "localhost"; 10. public $user = "root"; 11. public $senha = ""; 12. public $db = "teste"; 13. 14. // seta a persistncia da conexo 15. public $persistent = false; 16. 17. // new PDOConnectionFactory( true ) <--- conexo persistente 18. // new PDOConnectionFactory() <--- conexao no persistente 19. public function PDOConnectionFactory( $persistent=false ){ 20. // verifico a persistncia da conexao 21. if( $persistent != false){ $this->persistent = true; } 22. } 23. 24. public function getConnection(){ 25. try{ 26. // realiza a conexo 27. $this->con = new PDO($this>dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->senha, 28. array( PDO::ATTR_PERSISTENT => $this->persistent ) ); 29. // realizado com sucesso, retorna conectado 30. return $this->con; 31. // caso ocorra um erro, retorna o erro; 32. }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); } 33. 34. } 35. 36. // desconecta 37. public function Close(){ 38. if( $this->con != null ) 39. $this->con = null; 40. } 41. 42. } www.revistaphp.com.br

Com todas as extenses do PHP necessrias para o PDO funcionar instaladas, vamos testar essa nossa classe. Crie um novo arquivo TesteConnect.php e faa o seguinte.
PHP

1. <?php 2. @require("PDOConnectionFactory.class.php"); 3. 4. try { 5. $pdo = new PDOConnectionFactory(); 6. $pdo->getConnection(); 7. // estou conectado 8. echo "Sucesso"; 9. 10. $pdo = null; 11. }catch (PDOException $ex){ echo $ex->getMessage(); } 12. 13. ?> www.revistaphp.com.br

Prxima publicao ser do padro de projetos Data Access Object. Espero que estejam gostando.

DAO Data Access Object


Continuando o nosso raciocnio sobre PDO vamos ver agora o modelo de projetos DAO Data Access Object utilizando a classe PDOConnectionFactory. Atualmente o modelo preferido para persistir dados em aplicaes de banco de dados relacional. DAO (Data Access Object) um padro para persistncia de dados que permite separar regras de negcio das regras de acesso a banco de dados. Numa aplicao que utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as conexes, mapear objetos para tipos de dados SQL ou executar comandos SQL, devem ser feitas por classes de DAO. Lembrando que no modelo DAO voc ter que criar uma classe para cada tabela com suas propriedades por exemplo: Tabela - cidade:
PHP 1. class Cidade{ 2. public $id; 3. public $nome; 4. public $estado; 5. 6. public function Cidade(){ } 7. 8. ...os mtodos sets para cada varivel... 9. 10. ...os mtodos gets para cada varivel... 11. }

www.revistaphp.com.br

Vamos ver no artigo e voc vai perceber que no tem nenhum mistrio. Utilizei apenas uma tabela, agenda, com os campos id, nome, email e telefone. Segue o SQL da tabela:
SQL 1. CREATE TABLE `agenda` ( 2. `id` int(4) NOT NULL AUTO_INCREMENT, 3. `nome` varchar(50) DEFAULT NULL, 4. `email` varchar(50) DEFAULT NULL, 5. `telefone` varchar(10) DEFAULT NULL, 6. PRIMARY KEY (`id`) 7. ); www.revistaphp.com.br

Vejamos a classe Agenda. Agenda.class.php


PHP 1. /* 2. * Classe de estrutura da tabela agenda. 3. * Contm a mesma estrutura da tabela, os campos da tabela com os seus Get's e Set's 4. */ 5. class Agenda{ 6. public $id; 7. public $nome; 8. public $email; 9. public $telefone; 10. 11. // constructor 12. public function Agenda(){ 13. } 14. 15. ############## CONJUNTO DE SET'S 16. public function setId( $id ){ 17. $this->id = $id; 18. } 19. 20. public function setNome( $nome ){ 21. $this->nome = $nome; 22. } 23. 24. public function setEmail( $email ){ 25. $this->email = $email; 26. } 27. 28. public function setTelefone( $telefone ){ 29. $this->telefone = $telefone; 30. } 31. 32. ############## CONJUNTO DE GET'S 33. public function getId(){ 34. return $this->id;

35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. }

} public function getNome(){ return $this->nome; } public function getEmail(){ return $this->email; } public function getTelefone(){ return $this->telefone; }

www.revistaphp.com.br

Agora o DAO para a classe Agenda. AgendaDAO. AgendaDAO.class.php


PHP 1. /* 2. * Classe DAO para a tabela agenda. 3. * Data Access Object que ir fazer operaes na tabela Agenda (bsica: Insert, Update, Delete e Lista) 4. */ 5. class AgendaDAO extends PDOConnectionFactory { 6. // ir receber uma conexo 7. public $conex = null; 8. 9. // constructor 10. public function AgendaDAO(){ 11. $this->conex = PDOConnectionFactory::getConnection(); 12. } 13. 14. // realiza uma insero 15. public function Insere( $agenda ){ 16. try{ 17. // preparo a query de inserao - Prepare Statement 18. // note que no logar dos valores eu nao estou passando ".$agenda->getValorx().", ... 19. // isso ficaria uma porta aberta para um SQL Injection. 20. $stmt = $this->conex->prepare("INSERT INTO agenda (id, nome, email, telefone) VALUES (?, ?, ?, ?)"); 21. // valores encapsulados nas variveis da classe Agenda. 22. // sequencia de ndices que representa cada valor de minha query 23. $stmt->bindValue(1, $agenda->getId() ); 24. $stmt->bindValue(2, $agenda->getNome() ); 25. $stmt->bindValue(3, $agenda->getEmail() );

26. >getTelefone() ); 27. 28. 29. 30. 31. 32. 33. 34.

$stmt->bindValue(4, $agenda// executo a query preparada $stmt->execute();

// fecho a conexo $this->conex = null; // caso ocorra um erro, retorna o erro; }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); } 35. } 36. 37. // realiza um Update 38. public function Update( $agenda, $condicao ){ 39. try{ 40. // preparo a query de update - Prepare Statement 41. $stmt = $this->conex->prepare("UPDATE agenda SET nome=?, email=?, telefone=? WHERE id=?"); 42. $this->conex->beginTransaction(); 43. // valores encapsulados nas variveis da classe Agenda. 44. // sequencia de ndices que representa cada valor de minha query 45. $stmt->bindValue(1, $agenda->getNome() ); 46. $stmt->bindValue(2, $agenda->getEmail() ); 47. $stmt->bindValue(3, $agenda>getTelefone() ); 48. $stmt->bindValue(4, $condicao); 49. 50. // executo a query preparada 51. $stmt->execute(); 52. 53. $this->conex->commit(); 54. 55. // fecho a conexo 56. $this->conex = null; 57. // caso ocorra um erro, retorna o erro; 58. }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); } 59. } 60. 61. // remove um registro 62. public function Deleta( $id ){ 63. try{ 64. // executo a query 65. $num = $this->conex->exec("DELETE FROM agenda WHERE id=$id"); 66. // caso seja execuado ele retorna o nmero de rows que foram afetadas. 67. if( $num >= 1 ){ return $num; } else { return 0; } 68. // caso ocorra um erro, retorna o erro; 69. }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); } 70. } 71. 72. public function Lista($query=null){

73. 74. 75. 76.

try{

if( $query == null ){ // executo a query $stmt = $this->conex>query("SELECT * FROM agenda"); 77. }else{ 78. $stmt = $this->conex>query($query); 79. } 80. // desconecta 81. $this->conex = null; 82. // retorna o resultado da query 83. return $stmt; 84. }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); } 85. } 86. } www.revistaphp.com.br

A classe DAO ir fazer as operaes bsicas em uma tabela. Inserir, Atualiza, Deletar e Listar. Note que as querys de gravao e atualizao, esto com os valores dos campos com uma ? e depois passado pelo ndice o valor de cada ? encapsulado no objeto da classe Agenda. Isso ajuda na segurana para interferir no SQL Injection. Vamos testar
PHP 1. // incluo as classes que preciso. 2. // voc pode criar um arquivo requires.php e por essas linhas, depois s dar um incude("requires.php"); 3. @require("PDOConnectionFactory.class.php"); 4. @require("AgendaDAO.class.php"); 5. @require("Agenda.class.php"); www.revistaphp.com.br

Para inserir:
PHP 1. // instancio a classe Agenda 2. $agenda = new Agenda(); 3. 4. #### INSERE ##### 5. 6. $agenda->setNome("Aderbal Nunes"); 7. $agenda->setEmail("aderbalnunes@gmail.com"); 8. $agenda->setTelefone("5555 5555"); 9. 10. // instancio a classe Data Access Object para Agenda 11. $DAO = new AgendaDAO(); 12. $DAO->Insere($agenda); 13. 14. #################

www.revistaphp.com.br

Atualizar um registro:
PHP 1. #### UPDATE ##### 2. $agenda->setNome("Aderbal Nunes Machado"); 3. $agenda->setEmail("aderbalnunes@gmail.com"); 4. $agenda->setTelefone("4444 4444"); 5. 6. // instancio a classe Data Access Object para Agenda 7. $DAO = new AgendaDAO(); 8. // objeto agenda, o ID do registro 9. $DAO->Update($agenda, 1); 10. 11. ################# www.revistaphp.com.br

Deletar um registro:
PHP 1. 2. 3. 4. 5. 6. 7. 8. #### DELETE ##### // instancio a classe Data Access Object para Agenda $DAO = new AgendaDAO(); // ID do registro a ser afetado echo $DAO->Deleta(1)." registro(s) deletado(s)"; #################

www.revistaphp.com.br

Listar os registros:
PHP 1. 2. 3. 4. 5. 6. 7. 8. 9. #### LISTA ##### // instancio a classe Data Access Object para Agenda $DAO = new AgendaDAO(); foreach ($DAO->Lista() as $row){ echo $row["nome"]." - ".$row["email"]."<br>"; } #################

www.revistaphp.com.br

Obs: Existe a opo de listagem da maneira que voc precisa. Por exemplo para eu listar os registros apenas de um ndice, basta passar a query completa como parmetro no mtodo Lista(). Por exemplo:

PHP 1. $res = $DAO->Lista(SELECT nome FROM agenda a, malling m WHERE a.id = m.id); 2. foreach ($res as $row){ 3. echo $row["a.nome"]."<br>"; 4. } www.revistaphp.com.br

Pronto com isso finalizo o artigo. Espero que tenham gostado e qualquer dvida mande um e-mail. Estudando esse mtodo voc estar se adaptando a maneira mais utilizada em mtodos de programao atual. Usada atualmente em Java e mostrei pra vocs que com o PHP tambm capaz de utilizar. Obrigado e at a prxima. Referncias: http://www.caucho.com/resin-3.1/examples/quercus-pdo/index.xtp http://www.php.net http://pt.wikipedia.org/

Vous aimerez peut-être aussi