PDO e Segurança - CRUD com PDO e MySql Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 2 anos, 9 meses, 3 semanas, 6 dias atrás.

Nesta série vamos aprender a criar um CRUD com PDO e Mysql. A ideia é ter uma classe genérica que ofereça métodos de cadastro, atualização, leitura e remoção de dados em um banco MySql da forma mais prática possível, para isso precisamos entender um pouco mais sobre como trabalhar com banco de dados.

O PHP Data Object (PDO)

O PDO é o que usamos para lidar com o banco de dados no PHP. Meus três pontos favoritos no PDO são:

  • É orientado a objetos
  • Com um parâmetro é possível definir qual driver usar (Mysql, PostgreSQL...)
  • É seguro

Para começar usar o PDO é muito simples. Uma conexão com PDO se parece com isso:

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

<?php
$dbh = new PDO($dsn, $usuario, $senha, $opcoes);

O $dsn é o cara que diz qual driver (Mysql, PostgreSQL, SQLite...) usar, o $usuario e $senha são auto explicativos (óbvio) e o $opcoes é opcional, nele podemos informar parâmetros adicionais a nossa conexão, como caracteres UTF-8, por exemplo.

Seguindo o exemplo acima, para se conectar no Mysql deveria ficar assim:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '1234');

Note que eu passei no meu DSN o meu servidor (localhost) e o banco de dados a usar(test), depois informei o usuário e a senha nos parâmetros que seguem.

Para ver a lisa de DSNs disponíveis acesse: http://php.net/manual/pt_BR/pdo.drivers.php

A maneira mais fácil de executar um comando é com o método query:

<?php
foreach($dbh->query('SELECT * from exemplo') as $row) {
    print_r($row);
}

Claro que é o mais simples, não o mais indicado, neste caso o melhor mesmo é usar o PDOStatement.

Segurança com o PDO

Imagine que você vai inserir um novo usuário no banco de dados, vemos muita coisa assim na internet:

<?php
$sql = 'INSERT INTO usuarios (nome, senha, email) VALUES ('.$nome.', '.$senha.', '.$email.');';
$dbh->exec($sql);

Note que eu usei um novo comando, o exec().

Ai começam os problemas: SQL Injection.

Começando da premissa que os dados $nome, $email e $senha venham da URL ou de um form, imagine que o cara insira os seguintes valores:

  • $nome = Erik
  • $senha = 123456
  • $email = falecom@erikfigueiredo.com.br'); TRUNCATE usuarios;

Note que essa query não vai funcionar de verdade, é só pra você entender, não vou passar algo que rode aqui, vai saber o que você vai fazer com isso, kkk.

Eu inseri uma query ali que remove todos os dados da tabela usuarios (TRUNCATE usuarios). Não sei por você, mas acho que isso não deveria acontecer e funciona se o SQL estivesse correto (e propositalmente não está).

Como corrigir isso?

Simples, escrevendo o sql certo, mas não é isso que eu quero dizer. Como previnir esta insersão de dados? Aqui entra o PDOStatement.

Sempre que você for rodar um sql você deve faze-lo dentro de um método prepare(), ainda seguindo exemplo anterior, veja como ficaria:

<?php
$sql = 'INSERT INTO usuarios (nome, senha, email) VALUES (:nome, :senha, :email);';
$sth = $dbh->prepare($sql);

Apartir de agora usamos o nosso novo objeto $sth (que é do tipo PDOStatement, só pra você saber) para realizar as transações com o banco de dados, ele vai deixar nosso SQL seguro, mas como informamos os dados? Simples:

<?php
$sth->bindValue(':nome', $nome);
$sth->bindValue(':senha', $senha);
$sth->bindValue(':email', $email);
$sth->execute();

Simples né!

Com isso qualquer injeção de dependência na sua aplicação será evitada e você não precisa se preocupar mais.

Se você estiver fazendo um Select tem mais dois comandos que deve conhecer, o fetch() e o fetchAll().

O fetch() retorna um único registro e o fetchAll() retorna vários, ambos ainda aceitam alguns parametros para organizar o resultado trazido, vale dar uma olhada na documentação que contém excelentes exemplos práticos clicando nos links que coloquei em cada palavra acima. Já ta na hora de você aprender a consultar as coisas lá né.

Aqui um exemplo de como ficaria o retorno de um dado baseado no id:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$sql = 'SELECT * FROM usuarios WHERE id=:id;';
$sth = $dbh->prepare($sql);
$sth->bindValue(':id', $id);
$sth->execute();
$data = $sth->fetch();

print_r($data);

Simples né.

No próximo artigo veremos alguns exemplos práticos enquanto criamos um CRUD com o PDO.


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!