O documento discute o uso da classe PDO no PHP para acessar bancos de dados de forma segura e uniforme, independente do banco de dados. Ele explica como fazer a primeira conexão PDO, tratar erros, usar métodos como query() e prepare(), e proteger contra injeção SQL usando sentenças preparadas. Também compara PDO com MySQLi, discutindo vantagens de cada um em termos de suporte a bancos, desempenho e segurança.
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!
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
O sistema de preparo evita a injeção da consulta, visto que temos a inserção de codigos separados da consulta.