Você está na página 1de 12
oso ‘Trabalhando com PDO no PHP | Diogo Matheus Blog Trabalhando com PDO no PHP GB) tweet 2) [Ea] ” PDO (PHP Data Objects) é uma extensdo que fornece uma interface padronizada para trabalhar com bancos de dados, cuja finalidade € abstrair a conexdo e interagées com os bancos, ou seja, independente do banco de dados que estiver sendo utilizado os métodos executados sero os mesmos, mas isso néo significa que seu sistema sera portével entre diversos bancos de dados, por mais que o uso do PDO facilite a portabilidade, esta interface significa apenas que vocé se comunicaré com qualquer banco de dados através de um determinado conjunto de métodos e classes. Nao € possivel executar fungdes de interagdo com o banco de dades utilizando somente a extens3o PDO, é preciso utilizar um driver especifico do PDO para acessar um determinado banco de dados. Cada banco de dados pode prover um driver para PDO, porém nem todos os recursos sao suportados em todos os bancos, por exemplo, no MySQL, tabelas do tipo MylSAM néo suportam transacées, impossibilitando 0 funcionamento dos métodos PDO:beginTransaction(, PDO::commit) e PDO::rollBack0, (Obs: PDO nao é uma abstracao de banco de dados e nao reescreve SQL. Banco de dados, SQL e Joins Neste artigo nao irei focar na criagdo de bancos de dados, comandos SQL ou Joins, se vocé tem interesse em ler mais sobre esses assuntos confira os links abaixo. * Banco de dados * Abstracdo de conexao e interagéo com banco de dados © Seguranga * Suporte a diversos drivers Ainda hoje muitas pessoas consideram 0 uso do PDO uma opcéo, analisando a possibilidade de um determinado projeto mudar de banco, utilizando o PDO somente se essa possibilidade existir. 0 grande perigo nessa andlise superficial € que nem sempre no inicio de um projeto temos essa visio e se tiver que mudar néo adianta lamentar, entéo em cima disso particularmente recomendo a utilizacdo deste recurso, principalmente se o projeto necessitar trabalhar com mais de um tipo de banco. Obs: Confira todos os drivers suportados pelo PDO, Manipulando conexdes Toda conexéo com banco de dados é realizada ao criar uma insténcia da classe PDO, ou seja, independente do driver utilizado sempre iremos instanciar a classe PDO. © construtor da classe PDO recebe as informagdes do banco como parametro obrigatério, conhecido como dsn(Data Source Name), além dos parémetros opcionais username, password e driver_options. 1 | _-construct ( string $dsn [, string $username [, string $password 2 L, array $driver_options ]]] ) _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! wa onnaita ‘Trabalhando com PDO ne PHP | Diogo Mathes Blog No exemplo abaixo realizamos uma conexo com 0 banco de dados mysql 1] $conn = new POC 2 "mysql:host=1ocalhost;dbname=example-pdo', ‘diogo’, '123456" 315 Também podemos configurar nossa conexéo através do parametro driver_options. ) 1{ $conn = new PDO( 2 ‘mysql:host=1ocalhost;dbname=example-pdo', ‘diogo’, '123456', 3 array( 4 PDO: :ATTR_PERSISTENT => true 5 6 w No exemplo acima, configuramos nossa conexéo como persistente. Uma conexio persistente no é fechada no final do script, e sim armazenada em cache sendo reutilizada quando outro script solicitar uma conexéo usando as mesmas credenciais. ‘Apés abrir uma conex4o podemos interagir com o banco utilizando 3 métodos da classe PDO: exec int Utilizado para insert, update e delete query PDOStatement Utilizado para resultados tabulares, comando select, prepare PDOStatement ria um prepared statement, utilizado para dados varidveis. Normalmente para fechar uma conexéo € preciso destruir 0 objeto, assim como suas referéncias, para isso atribuimos 0 valor NULL a varidvel que contém o objeto. Se isso nao for feito 0 PHP ira fechar automaticamente a conexéo quando o script terminar, caso nao seja uma conexéo persistente. Prepared statements Os prepared statements oferecem dois étimos beneficios * Aquery s6 precisa ser preparada uma vez, mas pode ser executada varias vezes * Os parametros nao precisam ser escapados, pois o driver cuida disso automaticamente ses beneficios significam duas coisas, agilidacle e seguranga, confira a criacdo de um prepared statement, prepare( NINSERT INTO posts (title, content) VALUES (:title, :content)' waune wu > Com nosso prepared statement criado, precisamos informar os valores para compor a query, confira os métodos que podem ser utilizados * bindValued ® bindParamd prepare( NINSERT INTO posts (title, content) VALUES (:title, 5 $title = ‘Titulo do post's $content = ‘Conteudo do post’; content) _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! 22 onnaita ‘Trabalhando com PDO ne PHP | Diogo Mathes Blog 9 | $stmt-sbindvalue(':title', $title); 10 | $stmt-pbindvalue(’:content", $content); a] >> Apés informar os dados necessarios para o prepared statement, precisamos executar 0 método execute para realizar a query no banco. Para resgatar resultados de um comando select temos algumas alternativas. fetcho Retorna a préxima linha do resultado. ferchallo Retorna um array com todos os resultados. fetchObject? _Retorna apréxima linha do resultado como objeto. fetcnColumn —__Retorna uma coluna da préxima linha do resultado. prepare("SELECT * FROM posts"); while(Srow = $stmt->fetch()) { print_r($row); 2> Um recurso interessante na hora de resgatar valores é 0 método bindColumn(, que tem a funcao de vincular 0 valor de uma coluna do resultado do prepared statment 8 uma variavel Diferensa entre bindParam() e bindValue() A grande diferenca entre esses métodos & que o bindParamd recebe 0 valor do parametro por referéncia, sendo este realmente setado no momento em que o método execute”) do prepared statment for chamado, 0 que pode gerar problemas em alguns casos, mas também pode facilitar em outros, sendo assim dé preferéncia ao bindValued para os casos basicos Transagées Uma transagéo & um conjunto de procedimentos executados no banco de dados como uma tinica operacao. Na pratica, indicamos o inicio de uma transacéo utiizando 0 comando start transaction ou begin no MySQL, em seguida realizamos algumas tarefas, insercdo, alteragio ow remogéo de registro(s), no termino desses procedimentos caso tudo ocorra bem, informamos através do comando commit que as mudangas podem ser aplicadas de fato no banco, mas caso ocotra algo de errado em algum dos procedimentos podemos utilizar o comando rollback, garantindo que todos os procedimentos realizados desde o inicio da transagao sejam desfeitos. insago depende de quatro propriedades, conhecidas como ACID. Aintegridade de um 1 Atomicidade Uma transacdo deve ser uma unidade atémica de trabatho; ou todas as suas modificagées de dados sao executadas ou nenhuma delas é executada, 2. Consisténcia Regras de integridade dos dados sao asseguradas, ou seja, as transa¢ées ndo podem quebrar as regras do banco de dados. 3. Isolamento resultado de uma transa¢do executada concorrentemente a outra deve ser 0 mesmo que o de sua _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! ana onnaita ‘Trabalhando com PDO ne PHP | Diogo Mathes Blog execucdo de forma isolada. Operacées exteriores a uma dada transacdo jamais vero esta transacéo em estados intermedidrios. 4, Durabilidade Depois que uma transagao tiver sido concluida, seus efeitos ficam permanentemente no sistema. No PDO utilizamos trés métodos para trabalhar com transagbes, beginTransaction( para iniciar uma transagdo, commit) para que as tarefas realizadas sejam mantidas e rollback) para desfazer caso ocorra algum problema (Obs: Alguns bancos de dados ndo oferecem este recurso, trabalhando apenas em modo autocommit Tratamento de erros no PDO © PDO oferece 3 alternativas para manipulacao de erros. PDO:ERRMODE SILENT Esse é 0 tipo padrao utilizado pelo PDO, basicamente 0 PDO seta internamente o cédigo de um determinado erro, podendo ser resgatado através dos métodos PDO::errorCode() e PDO:errorinfo0). PDO::ERRMODE_ WARNING Além de armazenar 0 cédigo do erro, este tipo de manipulagdo de erro iré enviar uma mensagem E.WARNING, sendo este muito utilizado durante a depuracdo e/ou teste da aplicacao, PDO::ERRMODE EXCEPTION ‘Além de armazenar 0 cédigo de erro, este tipo de manipulacdo de erro ird lancar uma excecdo PDOEKception, esta alternativa é recomendada, principalmente por deixar 0 cédiga mais impo e legivel setattribute (PDO: :ATTR_ERRMODE, PDO: } catch (POOException $e) { echo $e->getMessage() 5 } 2> RRMODE_EXCEPTION) ; BS weavausune Trabalhando com PDO Agora que conhecemos um pouco sobre PDO, vamos praticar, neste exemplo iremos utilizar um banco de dados chamado de “example-pdo", contendo apenas uma tabela, nomeada de “posts”, confira 0 script de criacéo da tabela. indexphp || Registry.php || dao/PostDAO.php || madel/Post.php setAttribute(PDO: :ATTR_ERRMODE, PDO: : ERRMODE_EXCEPTION); BS cavanaune 4 1 _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! an ownait4 “Trabalhardo com PDO ne PHP | Diogo Matheus Blog 12 | // Armazenar essa instancia no Registry 13 | $registry = Registry: :getInstance(); 14 | $registry->set("Connection*, $conn); 35 16 | // Instanciar um novo Post e setar informacdes 17| $primeiroPost = new Post(); 18 | $primeiroPost->setTitle( 'Primeiro post’ 19 | $primeiroPost->setContent(*Conteudo! "); 20 21 | // Instanciar um novo Post e setar informagdes 22 | $segundoPost = new Post(); 23 | $segundoPost->setTitle( ‘Segundo post’); 24 | $segundoPost->setContent( ‘Conteudo! "); 25 26 | // Instanciar 0 DAO e trabalhar com os métodos 27 | $postDAO = new PostDAO(); 28 | $postDAO->insert($prineiroPost); 29 | $postDA0->insert ($segundoPost); 30 31| // Resgatar todos os registros e iterar 32 | $results = $post0A0->getall(); 33 | foreach($results as $post) { 34 echo $post->getTitle() ‘
's 35 echo $post->getContent() . "
'; 36 echo "
"5 37| } 38 | > ‘Ao executar este exemplo iremos obter o seguinte resultado’ Primeiro post Conteudo! Segundo post Conteudo! Resultado PDO Fique a vontade para visualizar ou efetuar download do exemple, jografia bhtto//php.net/manual/en/bookpdo.php httpy//www.php net/manual/en/pdo.drivers.php http://www slideshare,net/we7furlong/php-data-objects qutocommit Banco de dados pdo, PHP, PHP Data Object SOL transacées Compartithe Imprimir §St© atige fo escrito por Diag Matheus em 02/04/2012 as 830, «ests este artigo! artigo arquivado em BHP. Siga quaisquer respostas a este artigo através do RSS.2.0, Vocé pode deixar uma resposta ou fazer um trackback do seu préprio site. COMENTARIOS (16) ARTIGOS RELACIONADOS \wonsdiogomathets combi shptrabalhande-com-pdo-no-pp! si aioe ‘Trabalhando com PDO no PHP | Diogo Matheus Blog escrito por nd Lano atrés Muito bom o artigo! 3) escrito por ha 1 ano atras De muitos que encontrei, esse foi o melhor, bem explicativo e detalhado, Obrigado! Gostarie de saber se tem como trabalhar usando PDO e matriz de array, ndo acho nenhuma referencia que possa me ajudar nesse sentido. € parabens pelo artigo, 80 Obrigado pelo comentario Marcos, Poderia explicar melhor 0 que vocé quer fazer? Boa sorte, abraco. escrito por ha 1 ano atras Sem diwvida PDO é incrivel, desde do dia que a conhece nunca mais larguei. Facil e pratico! Usuo em todos os meus projetos. escrito por ha Lano atrds Para iniciantes vai ai um exemplo: IHINSERIR DADOS public function inserir($tabela, $dados)( ty // Pegar chaves $arrCampo = array keys( $dados ); // Pegar valores SartValor = array values( $dados ); // Contar campo $numCampo = count( $arrCampo ); 1 Contar valor $numValor = count( SartValor ); _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! wi onnaita ‘Trabalhando com PDO ne PHP | Diogo Mathes Blog 1) Nalidando campos if(SnumCamp. numValor)( 1 Montar Query $SQL = "INSERT INTO". $tabela."("; 11 Concatenando os campos da coluna da Stabela foreach($arrCampo as $campo)( $SQL.= "$campo, * } // Data Time Automatico $5QL. = ‘criado, * // Retirando a ”," concatenado no final do $campo, e substituibdo por *)" $SQL = substr_replace($SQL.")"-2.1); $SQL.= " VALUES ("; // Concatenando os ponto-chave para o bindParam foreach($arrCampo as $pontoChave){ $sql ) // Aplicando automaticamente Data Time $5QL = ‘NOWO, ‘; " $pontoChave.", “ // Retirando a "," concatenado no final do $pontoChave, e substituibdo por *)” $SQL = substr_replace($SQL,")",-2.0); ) 1/85QL LAST _INSERT_ID0'; # print $SQL; // Retire a cerquilha do comentario em caso de ERROR para imprimir a SQL, € comente o que est abaixo, 11 Preparando a queryString Sstmt = $this->pdo->prepare($SQU); // Relacionao os pontos chaves via bindParam for(Si = 0; $i bindParam(' $arrCampol$il,$arrValor[Sil $this- >obterPDOConstanteTipo(SarrValor{SiN); ) $stmt->execute(); $this-> UhimolnsertiD($this-> pdo->lastinsertidd); return true; }eatch(PDOException Se) 1/ Antes de verificar o ERROR, analise obterPDOConstanteTipo0, se est convertendos 05 dados correto, print “#Inserir: ERROR AO INSERIR DADOS! Consulte o programadorta) do seu sit $e->getMessage0; ) } _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! ma oso ‘Trabalhando com PDO ne PHP | Diogo Mathes Blog Obrigado pelos comentarios pessoal. escrito por nd 11 meses at Primeiramente parabéns pelo artigo Diogo. Eu queria saber se tem como usar reflection abordado num outro artigo seu para criar um DAO genérico, J4 que possibilita percorrer os métodos das classe. Se é possivel, teria como apresentar um piqueno exemplo o resto me viro aqui Desde ja agradeco pela atencao. escrito por ha 11 meses atrés i Diogo, estou com uma duvida e se possivel me ajudar agradeco desde ja Bom estou usando teu exemplo num projeto pessoal, pesquisei muito sobre PDO eo artigo que mais me agradou nestas pesquisas foi o teu. Minha duvida e 0 seguinte, Como seria a adaptacao do seu exemplo na situacao. Preciso buscar uma linha especifica do banco passando um parametro, exemplo um id Exemplificando, um usuario clica no link de um produto e com esse id carrego em outra pagina informacoes do produto em especifico. No teu exemplo voce carrega varios resultados do banco, gostaria de buscar um unico resultado entao como ficaria o controller nessa situacao. Obrigado, escrito por na or i Diogo gostei do seu exemplo eu s6 dei uma melhorada nele tirei 0s includes ¢ usei autoload e namespaces ah e seu registry,php ta identico ao do Joao Batista Neto Admnistrador do forum imasters foi um CTRL +C CTRL + V nem os creditos voce citou, mas blz acho que o Joao nao liga para esses detalhes te 80 Ola Felipe, _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! ane oso ‘Trabalhando com PDO no PHP | Diogo Matheus Blog Obrigado pelo comentario, ndo foquei em autoload/namespaces para nao confundir quem esta iniciando. Realmente essa parte do exemplo, Registry, veio do Joao Batista, férum do imasters, na correria deixei passar, vou providenciar esse ajuste, muito obrigado por lembrar essa parte. UPDATE: Adicionei autor da classe, Abraco e boa sorte escrito por na 9m Otimo material, é dificil achar material avancado e de qualidade na internet parabens gostaria de fazer uma humilde contribuicao no seu codigo no registry.php fiz assim: class Registry extends \ArrayObject { dai eliminei todo _construct e a Storage, ficou o Sthis, exemplo $this-> offsetExists(, $this->offsetGet), 0 codigo ficou bem mais clean, abragos 80 Obrigado pela sugestio Renato, Realmente é uma boa para simplificar, Zend Framework trabalhava dessa forma. Abraco ¢ boa sorte escrito por uma dica para esse teu exemplo ndo a necessidade do uso de um novo método para criacao do array, no metodo: public function getallo $statement = $this->conn->query‘SELECT * FROM posts’); return $this-> processResults($statement); } elimine 0 metodo processResults(Sstatement) e use o fetchAll() sé que na classe Post que ve criou deve conter os atributos iquais a da tabela criada, no caso troque o atributo id para post id como na tabela, ai conservara os atributos private e poderd usar 05 métodos gets da classe Post no view ficando assim assim _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! ane aioe ‘Trabalhando com PDO no PHP | Diogo Matheus Blog require_once(‘model/Post php’: class PostDAO //\embrando de configurara o fetchAll) com PDO::FETCH_CLASS // como no exemplo a baixo public function getallo Sstatement = $this->conn->query('SELECT * FROM posts’); return $statement->fetchAll(PDO::FETCH_CLASS,"Post’); ) ) sendo que 0 PDO ja foi feito para criar arrays assim trabalhando com classes. ganha mais praticidade e performance. escrito por Parabéns pelo artigo, é muito bom poder ver como o php aos poucos tém ganhado ‘espaco e tem amadurecido com a orientagio a objetos, ainda mais com o zend framework. escrito por as atras Ol, irmao! poderia dar uma luz, queria uma confirmacéo de que os dados foram inseridos com sucesso no bd, pensei em implementar function insert, mas néo estou fazendo de modo correto! escrito por hd 2 semanas atras Muito agradecido Sir Diogo! Sou estudande de php e outras linguagens de programacao, e passarei a acompanhar seu trabalho. _wonsdiogomatheus combo ishptrabalhando-com-pdo-no-php! sore ownait4 “Trebahando com PDO no PHP | Diogo Matheus Blog Enviar Comentario CERTIFICAGOES end PESQUISAR Pesquisor Certificagées (1) Eventos (3) Gerenciamento de Projetos (4) jQuery (2) Orientagéo a Objetos (3) PHP (22) Resenha (5) Ubuntu (1) XHTML & CSS (1) Zend Framework (13) TWEETS RECENTES \wonsdiogomathets combi shptrabalhande-com-pdo-no-pp! wie oscars Tweets Follow E Diogo Matheus al saladolugar.com.briempreendedoris. = EB Diogo Matheus Proposta de monografia entregue, agora 6 planejare escrever. E Diogo Matheus exame abril. com.brirevista-examel. Bp Matheus Estou devendo uma resenha sobre o livo de persuasdo, até final de semana que vem fago essa brincadeira. EF Diogo Matheus ULTIMOS TOPICOS Virtual Hosts no Ubuntu A Startup Enxuta Entendendo casting implicio e explicit Estrutura Analitica do Projeto (EAP) Orientacdo a Interfaces Creative Commons 3.0 ‘waw.dlogomatheus.com arbi phptrabalhando-com-pdo-no-prp! “Trabahando com PDO no PHP | Diogo Mathaus Bog Rss Topo sane

Você também pode gostar