13
PHP Data Object O que é The PHP Data Objects (PDO)? PDO é uma extensão do PHP5 para formalizar conexões com uma base de dados de maneira uniforme. Assim o programador cria um código portátil através de várias bases de dados e plataformas. Nesse caso o programador altera a base de dados, mudando apenas uma linha de código e o projeto trabalhará com a base de dados selecionada. Instalação (Windows) A instalação é simples, basta você ter na máquina o PHP5 instalado e verificar se as extensions estão 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ê não 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 instalação é muito simples sem nenhum segredo. No final você estará com o PHP, o Mysql e o Apache rodando redondinho em sua máquina. Para habilitar o PDO, basta você clicar no ícone do wamp que se encontra no system try ( barra do Windows perto do relógio) ir em PHP extensions clicar na extensão “php_pdo” e depois na extensão do banco de dados que você vai utilizar. No meu caso escolhi “php_pdo_mysql”. Restart o Apache e pronto.

PHP Data Object

Embed Size (px)

Citation preview

Page 1: PHP Data Object

PHP Data Object

O que é The PHP Data Objects (PDO)?

PDO é uma extensão do PHP5 para formalizar conexões com uma base de dados de maneira uniforme. Assim o programador cria um código portátil através de várias bases de dados e plataformas.

Nesse caso o programador altera a base de dados, mudando apenas uma linha de código e o projeto trabalhará com a base de dados selecionada.

Instalação (Windows)

A instalação é simples, basta você ter na máquina o PHP5 instalado e verificar se as extensions estão 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.dllextension=php_pdo_mssql.dllextension=php_pdo_mysql.dllextension=php_pdo_oci.dllextension=php_pdo_oci8.dllextension=php_pdo_odbc.dllextension=php_pdo_pgsql.dllextension=php_pdo_sqlite.dll

 Restart o Apache e pronto.

Se você não 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 instalação é muito simples sem nenhum segredo. No final você estará com o PHP, o Mysql e o Apache rodando redondinho em sua máquina.

Para habilitar o PDO, basta você clicar no ícone do wamp que se encontra no system try ( barra do Windows perto do relógio) ir em PHP extensions clicar na extensão “php_pdo” e depois na extensão 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 terão que estar em c:\wamp\www.

Para saber se os drivers estão funcionando, abra o bloco de notas (Iniciar > Executar: notepad ) digite isso:

PHP

1. <?php2. foreach(PDO::getAvailableDrivers() as $driver){3. echo $driver.'<br />';4. }5. ?>

Page 2: PHP Data Object

www.revistaphp.com.br

Salve o arquivo como “drivers.php” na pasta do wamp: c:\wamp\wwwExecute no navegador: http://localhost/drivers.php será exibido uma lista com os drivers instalado.

Conectando uma base de dadosPara 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, “usuário”, “senha” );

2.  

www.revistaphp.com.br

mysql em minha máquina:

PHP

1. $pdo = new PDO(“mysql:host=localhost;dbname=teste”, “root”, “xxxxx”);

www.revistaphp.com.br

Obs: maiores informações 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.

Código:

PHP

1. <?php2.  3. try{4. // conecto a base de dados5. $pdo = new PDO("mysql:host=localhost;dbname=teste", "root",

"xxxxx");6. // a partir daqui já tenho um objeto PDO7.  8. // preparo uma query a ser executada9. $stmt = $pdo->prepare("SELECT * FROM agenda");10. // executo a query11. $stmt->execute();12. // a partir daqui eu tenho um array com todo o

resultado de minha query13. // vamos agora varrer esse array

Page 3: PHP Data Object

14.  15. // lembra do mysql_fetch_array?16. while ($rs = $stmt->fetch(PDO::FETCH_OBJ)) {17. // aqui eu mostro os valores de minha tabela18. // veja que no objeto $rs estou usando o nome real do

campo da tabela19. echo "Nome: ".$rs->nome." - Email: ".$res-

>email."<BR>";20. }21. // fecho o banco22. $pdo = null;23. // tratamento da exeção24. }catch(PDOException $e){ echo $e->getMessage(); }25.  26. ?>

www.revistaphp.com.br

Output:

Nome: João Maria – Email: [email protected]: Chico José – Email: [email protected]: Maria Delfina – Email: [email protected]

Pronto com isso temos uma manipulação de banco de dados genérica simples e segura.

Espero ter ajudado, na próxima edição estarei mostrando uma classe fábrica de conexões 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 próxima =)

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 fábrica de conexões utilizando o PDO. Iremos ver também nos próximos posts desse artigo como utilizar o padrão de projeto de classes DAO (Data Access Object), a idéia é fazer que o programador não se preocupe com conexão com o banco.

O DAO cria uma camada na aplicação separando as rotinas de acesso a banco de dados, geração de SQL, das rotinas de negócio de tal modo que os objetos de negócio não saibam como estão sendo gravados. 

Vamos para a nossa classe PDOConnectionFactory:

PDOConnectionFactory.class.php (utilizando o MySQL)

PHP

Page 4: PHP Data Object

1. class PDOConnectionFactory{2. // recebe a conexão3. public $con = null;4. // qual o banco de dados?5. public $dbType = "mysql";6.  7. // parâmetros de conexão8. // quando não for necessário 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 persistência da conexão15. public $persistent = false;16.  17. // new PDOConnectionFactory( true ) <--- conexão

persistente18. // new PDOConnectionFactory() <--- conexao não

persistente19. public function PDOConnectionFactory( $persistent=false

){20. // verifico a persistência da conexao21. if( $persistent != false){ $this->persistent =

true; }22. }23.  24. public function getConnection(){25. try{26. // realiza a conexão27. $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. // desconecta37. public function Close(){38. if( $this->con != null )39. $this->con = null;40. }41.  42. }

www.revistaphp.com.br

Com todas as extensões do PHP necessárias para o PDO funcionar instaladas, vamos testar essa nossa classe. Crie um novo arquivo TesteConnect.php e faça o seguinte.

PHP

Page 5: PHP Data Object

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

www.revistaphp.com.br

Próxima publicação será do padrão de projetos Data Access Object. Espero que estejam gostando.

DAO – Data Access Object

Continuando o nosso raciocínio 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 aplicações é de banco de dados relacional. DAO (Data Access Object) é um padrão para persistência de dados que permite separar regras de negócio das regras de acesso a banco de dados. Numa aplicação que utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as conexões, 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 métodos set’s para cada variável...9.  10. ...os métodos get’s para cada variável...11. }

Page 6: PHP Data Object

www.revistaphp.com.br

Vamos ver no artigo e você vai perceber que não tem nenhum mistério. 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. * Contém a mesma estrutura da tabela, os campos da tabela com

os seus Get's e Set's4. */5. class Agenda{6. public $id;7. public $nome;8. public $email;9. public $telefone;10.  11. // constructor12. public function Agenda(){13. }14.  15. ############## CONJUNTO DE SET'S16. 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'S33. public function getId(){34. return $this->id;

Page 7: PHP Data Object

35. }36.  37. public function getNome(){38. return $this->nome;39. }40.  41. public function getEmail(){42. return $this->email;43. }44.  45. public function getTelefone(){46. return $this->telefone;47. }48.  49. }

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 operações na tabela Agenda

(básica: Insert, Update, Delete e Lista)4. */5. class AgendaDAO extends PDOConnectionFactory {6. // irá receber uma conexão7. public $conex = null;8.  9. // constructor10. public function AgendaDAO(){11. $this->conex =

PDOConnectionFactory::getConnection();12. }13.  14. // realiza uma inserção15. public function Insere( $agenda ){16. try{17. // preparo a query de inserçao - Prepare

Statement18. // 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 variáveis da

classe Agenda.22. // sequencia de índices que representa

cada valor de minha query23. $stmt->bindValue(1, $agenda->getId() );24. $stmt->bindValue(2, $agenda-

>getNome() );25. $stmt->bindValue(3, $agenda-

>getEmail() );

Page 8: PHP Data Object

26. $stmt->bindValue(4, $agenda->getTelefone() );

27.  28. // executo a query preparada29. $stmt->execute();30.  31. // fecho a conexão32. $this->conex = null;33. // caso ocorra um erro, retorna o erro;34. }catch ( PDOException $ex ){ echo "Erro: ".

$ex->getMessage(); }35. }36.  37. // realiza um Update38. public function Update( $agenda, $condicao ){39. try{40. // preparo a query de update - Prepare

Statement41. $stmt = $this->conex->prepare("UPDATE

agenda SET nome=?, email=?, telefone=? WHERE id=?");42. $this->conex->beginTransaction();43. // valores encapsulados nas variáveis da

classe Agenda.44. // sequencia de índices que representa

cada valor de minha query45. $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 preparada51. $stmt->execute();52.  53. $this->conex->commit();54.  55. // fecho a conexão56. $this->conex = null;57. // caso ocorra um erro, retorna o erro;58. }catch ( PDOException $ex ){ echo "Erro: ".

$ex->getMessage(); }59. }60.  61. // remove um registro62. public function Deleta( $id ){63. try{64. // executo a query65. $num = $this->conex->exec("DELETE FROM

agenda WHERE id=$id");66. // caso seja execuado ele retorna o

número 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){

Page 9: PHP Data Object

73. try{74. if( $query == null ){75. // executo a query76. $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 query83. return $stmt;84. }catch ( PDOException $ex ){ echo "Erro: ".

$ex->getMessage(); }85. }86. }

www.revistaphp.com.br

A classe DAO irá fazer as operações básicas em uma tabela. Inserir, Atualiza, Deletar e Listar. Note que as querys de gravação e atualização, estão 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 segurança 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 Agenda2. $agenda = new Agenda();3.  4. #### INSERE #####5.  6. $agenda->setNome("Aderbal Nunes");7. $agenda->setEmail("[email protected]");8. $agenda->setTelefone("5555 5555");9.  10. // instancio a classe Data Access Object para Agenda11. $DAO = new AgendaDAO();12. $DAO->Insere($agenda);13.  14. #################

Page 10: PHP Data Object

www.revistaphp.com.br

Atualizar um registro:

PHP

1. #### UPDATE #####2. $agenda->setNome("Aderbal Nunes Machado");3. $agenda->setEmail("[email protected]");4. $agenda->setTelefone("4444 4444");5.  6. // instancio a classe Data Access Object para Agenda7. $DAO = new AgendaDAO();8. // objeto agenda, o ID do registro9. $DAO->Update($agenda, 1);10.  11. #################

www.revistaphp.com.br

Deletar um registro:

PHP

1. #### DELETE #####2.  3. // instancio a classe Data Access Object para Agenda4. $DAO = new AgendaDAO();5. // ID do registro a ser afetado6. echo $DAO->Deleta(1)." registro(s) deletado(s)";7.  8. #################

www.revistaphp.com.br

Listar os registros:

PHP

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

www.revistaphp.com.br

Obs: Existe a opção de listagem da maneira que você precisa. Por exemplo para eu listar os registros apenas de um índice, basta passar a query completa como parâmetro no método Lista(). Por exemplo:

Page 11: PHP Data Object

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 dúvida mande um e-mail. Estudando esse método você estará se adaptando a maneira mais utilizada em métodos de programação atual. Usada atualmente em Java e mostrei pra vocês que com o PHP também é capaz de utilizar. Obrigado e até a próxima.

 Referências:

 http://www.caucho.com/resin-3.1/examples/quercus-pdo/index.xtp

http://www.php.net

http://pt.wikipedia.org/