SlideShare uma empresa Scribd logo
1 de 25
PDO: TRABALHANDO COM
BANCO DO JEITO CERTO
Introdução ao PDO:
• PDO – PHP Data Objects – é uma camada de acesso a base
de dados que provê uma maneira uniforme de acessar
bases de dados diferentes.
• PDO é uma classe desenvolvida especificamente para
trabalhar com procedimentos relacionados a Banco de
Dados. O interessante em utilizar este tipo de classe é a
abstração de qual banco utilizamos e a segurança extra que
esta classe nos oferece.
Primeira conexão PDO:
<?php
$pdo = new PDO("mysql:host=servidor;dbname=banco_de_dados", “usuario”,
“senha”);
?>
<?php
$hdb = 'mysql:host=servidor;dbname=banco_de_dados';
$user = ‘usuario';
$password =‘senha’;
$pdo = new PDO($hdb, $user, $password);
?>
TRATAMENTO DE ERROS
Exceções e PDO:
<?php
$hdb = 'mysql:host=servidor;dbname=banco_de_dados';
$user = usuario';
$password =‘senha’;
try {
$pdo = new PDO($dsn, $user, $password);
// Representa um erro levantado pelo PDO
} catch (PDOException $e)
//Mensagem de Erro
echo $e->getMessage();
// código do erro
echo $e->getCode();
}
?>
• Try - Uma função que
usa uma exceção deve
estar dentro de um
bloco "try". Se a
exceção não acontece,
o código irá continuar
normalmente.
• Catch - Um bloco
"catch" recebe a
exceção que é um
objeto contendo
informações sobre a
exceção.
• query(): Consulta SQL
• rowCount(): Quantidade de linhas retornadas pela query
• prepare(): Prepara uma instrução para execução e retorna um objeto de instrução
• bindValue(): associa um valor a um parâmetro
• bindParam(): Liga um parâmetro ao nome da variável especificada
• fetchAll(): Retorna um array com todos os resultados.
• execute(): Executa uma instrução preparada
Alguns métodos da classe PDO:
Injeção direta de comandos SQL é uma técnica onde um
atacante cria ou altera comandos SQL existentes para expor
dados escondidos, ou sobrescrever dados valiosos, ou ainda
executar comandos de sistema perigosos no servidor.
“Usar sentenças preparadas ajudará você a
se proteger de injeções de SQL.”
Mas como utilizar sentenças separadas ???...
Opção 1 – Não é segura:
// Busca simples - pronto para injeção de SQL!
$busca =$pdo->query("SELECT * FROM usuarios WHERE login=$login
AND senha=$senha");
echo $busca->rowCount();
Opção 2:
// Busca segura - espaços reservados com nomes
$buscasegura1 = $pdo->prepare("SELECT * FROM usuarios WHERE
login=:login AND senha=:senha");
$buscasegura1->bindValue(":login ",1);
$buscasegura1->bindValue(":senha","perla123");
$buscasegura1->execute();
echo $buscasegura1 ->rowCount();
// Busca segura - espaços reservados sem nomes
$buscasegura2 = $pdo->prepare("SELECT * FROM usuarios WHERE
login=? AND senha=?");
$buscasegura2->bindParam(1,1);
$buscasegura2->bindParam (2,"perla123");
$buscasegura2->execute();
echo $buscasegura2 ->rowCount();
Opção 3:
MySQLi:
Vantagens:
• API Orientada a Objetos e procedural;
• Performance elevada;
• Sintaxe relativamente mais simples;
Desvantagens:
• Só funciona com bancos MySQL;
• Não possui parâmetros nomeados;
• Não possui prepared statements do lado cliente;
PDO:
Vantagens:
• Funciona com 12 drivers de bancos de dados diferentes;
• API Orientada a objetos;
• Possui parâmetros nomeados;
• Possui prepared statements do lado cliente
Desvantagens:
• Não tão veloz quanto MySQLi;
Suporte de API:
• Tanto PDO quanto MySQli oferecem um API orientada a objetos,
mas o MySQLi também oferece uma API procedural - facilitando o
entendimento por parte dos novatos. Se você já é familiarizado com
o driver nativo do MySQl para PHP, migrar para a interface
procedural do MySQLi será extremamente simples. Por outro lado,
uma vez que você compreender a PDO, você poderá usá-la com
qualquer banco de dados que desejar!
Performance
Descrição:
• Tanto PDO quanto MySQLi são bem rápidas, porém, MySQLi se sai,
insignificantemente, mais rápida nos comparativos *ndash; ~2,5%
para sentenças não preparadas e ~6,5% para as sentenças
preparadas. Porém, a extensão nativa do MySQL é ainda mais
rápida que ambas.
Segurança
• Ambas as bibliotecas proveem segurança contra injeção de SQL,
desde que o desenvolvedor as use da maneira que elas foram
planejadas para usar (leia-se: limpando variáveis, vinculando
parâmetros com sentenças preparadas).
Conclusão:
• No fim das contas, PDO ganha essa, e fácil. Com suporte a 12
drivers de bases de dados diferentes e parâmetros nomeados, nós
podemos ignorar a pequena perda de performance que ela tem,
comparada à MySQLi. Com relação à segurança, ambas são seguras,
desde que o desenvolvedor saiba usá-las da forma correta.
“Então, se vocês ainda estão usando
MySQLi, talvez seja hora de mudar!”

Mais conteúdo relacionado

Mais procurados

Desenvolvimento em .Net - A Framework e o Visual Studio
Desenvolvimento em .Net - A Framework e o Visual StudioDesenvolvimento em .Net - A Framework e o Visual Studio
Desenvolvimento em .Net - A Framework e o Visual Studio
Vitor Silva
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4
Carlos Santos
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQL
elliando dias
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo preto
Nando Vieira
 

Mais procurados (20)

Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Desenvolvimento em .Net - A Framework e o Visual Studio
Desenvolvimento em .Net - A Framework e o Visual StudioDesenvolvimento em .Net - A Framework e o Visual Studio
Desenvolvimento em .Net - A Framework e o Visual Studio
 
Implementação de
Implementação de Implementação de
Implementação de
 
Java 05
Java 05Java 05
Java 05
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4
 
PHP e Mysql - DELETE
PHP e Mysql - DELETEPHP e Mysql - DELETE
PHP e Mysql - DELETE
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
Aula09 phonegap storage_connection
Aula09 phonegap storage_connectionAula09 phonegap storage_connection
Aula09 phonegap storage_connection
 
Fortalecendo seus Servidores em Linux(Hardening) - Minimizando os ataques - S...
Fortalecendo seus Servidores em Linux(Hardening) - Minimizando os ataques - S...Fortalecendo seus Servidores em Linux(Hardening) - Minimizando os ataques - S...
Fortalecendo seus Servidores em Linux(Hardening) - Minimizando os ataques - S...
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQL
 
Acesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBCAcesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBC
 
Manipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBCManipulando Bancos de Dados com JDBC
Manipulando Bancos de Dados com JDBC
 
JDBC
JDBCJDBC
JDBC
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo preto
 
Presentta: usando Node.js na prática
Presentta: usando Node.js na práticaPresentta: usando Node.js na prática
Presentta: usando Node.js na prática
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPA
 
Prog web 05-php-mysql
Prog web 05-php-mysqlProg web 05-php-mysql
Prog web 05-php-mysql
 

Semelhante a PDO: TRABALHANDO COM BANCO DO JEITO CERTO

Odi tutorial configuração repositórios mestre e trabalho
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalho
Caio Lima
 
Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01
julianabdpaiva
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 

Semelhante a PDO: TRABALHANDO COM BANCO DO JEITO CERTO (20)

PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Odi tutorial configuração repositórios mestre e trabalho
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalho
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Minicurso Yii2
Minicurso Yii2Minicurso Yii2
Minicurso Yii2
 
Prog web 07-pdo
Prog web 07-pdoProg web 07-pdo
Prog web 07-pdo
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01
 
Curso de Java (Parte 5)
Curso de Java (Parte 5)Curso de Java (Parte 5)
Curso de Java (Parte 5)
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
PDO - PHP Data Object
PDO - PHP Data ObjectPDO - PHP Data Object
PDO - PHP Data Object
 
Bancos de dados e jdbc java para desenvolvimento web
Bancos de dados e jdbc   java para desenvolvimento webBancos de dados e jdbc   java para desenvolvimento web
Bancos de dados e jdbc java para desenvolvimento web
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppet
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 

PDO: TRABALHANDO COM BANCO DO JEITO CERTO

  • 1. PDO: TRABALHANDO COM BANCO DO JEITO CERTO
  • 2.
  • 3. Introdução ao PDO: • PDO – PHP Data Objects – é uma camada de acesso a base de dados que provê uma maneira uniforme de acessar bases de dados diferentes. • PDO é uma classe desenvolvida especificamente para trabalhar com procedimentos relacionados a Banco de Dados. O interessante em utilizar este tipo de classe é a abstração de qual banco utilizamos e a segurança extra que esta classe nos oferece.
  • 4.
  • 5. Primeira conexão PDO: <?php $pdo = new PDO("mysql:host=servidor;dbname=banco_de_dados", “usuario”, “senha”); ?> <?php $hdb = 'mysql:host=servidor;dbname=banco_de_dados'; $user = ‘usuario'; $password =‘senha’; $pdo = new PDO($hdb, $user, $password); ?>
  • 7. Exceções e PDO: <?php $hdb = 'mysql:host=servidor;dbname=banco_de_dados'; $user = usuario'; $password =‘senha’; try { $pdo = new PDO($dsn, $user, $password); // Representa um erro levantado pelo PDO } catch (PDOException $e) //Mensagem de Erro echo $e->getMessage(); // código do erro echo $e->getCode(); } ?> • Try - Uma função que usa uma exceção deve estar dentro de um bloco "try". Se a exceção não acontece, o código irá continuar normalmente. • Catch - Um bloco "catch" recebe a exceção que é um objeto contendo informações sobre a exceção.
  • 8.
  • 9. • query(): Consulta SQL • rowCount(): Quantidade de linhas retornadas pela query • prepare(): Prepara uma instrução para execução e retorna um objeto de instrução • bindValue(): associa um valor a um parâmetro • bindParam(): Liga um parâmetro ao nome da variável especificada • fetchAll(): Retorna um array com todos os resultados. • execute(): Executa uma instrução preparada Alguns métodos da classe PDO:
  • 10. Injeção direta de comandos SQL é uma técnica onde um atacante cria ou altera comandos SQL existentes para expor dados escondidos, ou sobrescrever dados valiosos, ou ainda executar comandos de sistema perigosos no servidor.
  • 11. “Usar sentenças preparadas ajudará você a se proteger de injeções de SQL.” Mas como utilizar sentenças separadas ???...
  • 12. Opção 1 – Não é segura: // Busca simples - pronto para injeção de SQL! $busca =$pdo->query("SELECT * FROM usuarios WHERE login=$login AND senha=$senha"); echo $busca->rowCount();
  • 13. Opção 2: // Busca segura - espaços reservados com nomes $buscasegura1 = $pdo->prepare("SELECT * FROM usuarios WHERE login=:login AND senha=:senha"); $buscasegura1->bindValue(":login ",1); $buscasegura1->bindValue(":senha","perla123"); $buscasegura1->execute(); echo $buscasegura1 ->rowCount();
  • 14. // Busca segura - espaços reservados sem nomes $buscasegura2 = $pdo->prepare("SELECT * FROM usuarios WHERE login=? AND senha=?"); $buscasegura2->bindParam(1,1); $buscasegura2->bindParam (2,"perla123"); $buscasegura2->execute(); echo $buscasegura2 ->rowCount(); Opção 3:
  • 15.
  • 16. MySQLi: Vantagens: • API Orientada a Objetos e procedural; • Performance elevada; • Sintaxe relativamente mais simples; Desvantagens: • Só funciona com bancos MySQL; • Não possui parâmetros nomeados; • Não possui prepared statements do lado cliente;
  • 17. PDO: Vantagens: • Funciona com 12 drivers de bancos de dados diferentes; • API Orientada a objetos; • Possui parâmetros nomeados; • Possui prepared statements do lado cliente Desvantagens: • Não tão veloz quanto MySQLi;
  • 18. Suporte de API: • Tanto PDO quanto MySQli oferecem um API orientada a objetos, mas o MySQLi também oferece uma API procedural - facilitando o entendimento por parte dos novatos. Se você já é familiarizado com o driver nativo do MySQl para PHP, migrar para a interface procedural do MySQLi será extremamente simples. Por outro lado, uma vez que você compreender a PDO, você poderá usá-la com qualquer banco de dados que desejar!
  • 19.
  • 21. Descrição: • Tanto PDO quanto MySQLi são bem rápidas, porém, MySQLi se sai, insignificantemente, mais rápida nos comparativos *ndash; ~2,5% para sentenças não preparadas e ~6,5% para as sentenças preparadas. Porém, a extensão nativa do MySQL é ainda mais rápida que ambas.
  • 23. • Ambas as bibliotecas proveem segurança contra injeção de SQL, desde que o desenvolvedor as use da maneira que elas foram planejadas para usar (leia-se: limpando variáveis, vinculando parâmetros com sentenças preparadas).
  • 24. Conclusão: • No fim das contas, PDO ganha essa, e fácil. Com suporte a 12 drivers de bases de dados diferentes e parâmetros nomeados, nós podemos ignorar a pequena perda de performance que ela tem, comparada à MySQLi. Com relação à segurança, ambas são seguras, desde que o desenvolvedor saiba usá-las da forma correta.
  • 25. “Então, se vocês ainda estão usando MySQLi, talvez seja hora de mudar!”

Notas do Editor

  1. O sistema de preparo evita a injeção da consulta, visto que temos a inserção de codigos separados da consulta.