PDO (PHP Data Objects) Reuso e a segurança PDO é uma classe desenvolvida para trabalhar com procedimentos relacionados a Banco de Dados. PDO oferece segurança extra. Os recursos oferecidos são suficiente para trabalhar implementando toda nossa aplicação sem nos preocuparmos com qual banco estamos utilizando, e que uma mudança posterior na escolha do banco não trará grandes mudanças na aplicação. É necessário implementar um padrão de projeto que implemente o conceito de multicamadas, onde o principal objetivo é separar a camada de dados do restante da aplicação. Separando a aplicação em camadas, e utilizando o PDO adequadamente, teremos a receita perfeita de uma aplicação bem estruturada. Configurando o PDO Listagem 1: Habilitando PDO no Linux extension=pdo.so extension=pdo_mysql.so extension=pdo_pgsql.so extension=pdo_sqlite.so Listagem 2: Habilitando PDO no Windows extension=php_pdo.dll extension=php_pdo_mysql.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll
Os exemplos que se seguem utilizam o padrão de projeto MVC (Model View Controller), que separa a camada de apresentação (view), a camada de controle/regra de negócios (controller) e a camada de dados (model, onde ficam os comandos SQL). Um arquivo de conexão com o banco em PDO será o ponto de conexão da aplicação com o banco. Listagem 3: Arquivo conexao.php <?php class Conexao { public static $instance; private function construct() { // public static function getinstance() { if (!isset(self::$instance)) { self::$instance = new PDO('mysql:host=localhost;dbname=minhabasededados', 'root', 'vertrigo', array(pdo::mysql_attr_init_command => "SET NAMES utf8")); self::$instance->setattribute(pdo::attr_errmode, PDO::ERRMODE_EXCEPTION); self::$instance->setattribute(pdo::attr_oracle_nulls, PDO::NULL_EMPTY_STRING); return self::$instance;?> POJO é o espelho da tabela em objetos. Listagem 4: Classe POJO Usuário <?php class PojoUsuario { private $cod_usuario; private $nome; private $email; private $senha; private $ativo; private $perfil;
public function getcod_usuario() { return $this->cod_usuario; public function setcod_usuario($cod_usuario) { $this->cod_usuario = $cod_usuario; public function getnome() { return $this->nome; public function setnome($nome) { $this->nome = $nome; public function getemail() { return $this->email; public function setemail($email) { $this->email = strtolower($email); public function getsenha() { return $this->senha; public function setsenha($senha) { $this->senha = strtolower($senha); public function getativo() { return $this->ativo; public function setativo($ativo) { $this->ativo = strtolower($ativo); public function getperfil() { return $this->perfil; public function setperfil($perfil) { $this->perfil = $perfil;?> A classe DAO será responsável por realizar as consultas, inserções, deleções e edições no banco. O DAO é responsável por realizar processos no banco e retornar POJOs (se necessários) para a camada de controle. O nosso DAO implementa um padrão de projetos chamado Singleton, que em resumo faz que com que o objeto seja criado apenas uma vez na memória.
Listagem 5: DAO para a Classe Usuario <?php require_once CAMINHO_RAIZ. "admin/conexao.php"; require_once CAMINHO_RAIZ. "admin/geralog.php"; require_once CAMINHO_RAIZ. "admin/entity/perfil/controller_perfil.php"; require_once "pojo_usuario.php"; class DaoUsuario { public static $instance; private function construct() { // public static function getinstance() { if (!isset(self::$instance)) self::$instance = new DaoUsuario(); return self::$instance; public function Inserir(PojoUsuario $usuario) { $sql = "INSERT INTO usuario ( nome, email, senha, ativo, cod_perfil) VALUES ( :nome, :email, :senha, :ativo, :cod_perfil)"; $p_sql->bindvalue(":nome", $usuario->getnome()); $p_sql->bindvalue(":email", $usuario->getemail()); $p_sql->bindvalue(":senha", $usuario->getsenha()); $p_sql->bindvalue(":ativo", $usuario->getativo()); $p_sql->bindvalue(":cod_perfil", $usuario->getperfil()- >getcod_perfil()); catch (Exception $e) { GeraLog::getInstance()->inserirLog("Erro: Código: ". $e-> public function Editar(PojoUsuario $usuario) { $sql = "UPDATE usuario set nome = :nome,
email = :email, senha = :senha, ativo = :ativo, cod_perfil = :cod_perfil WHERE cod_usuario = :cod_usuario"; $p_sql->bindvalue(":nome", $usuario->getnome()); $p_sql->bindvalue(":email", $usuario->getemail()); $p_sql->bindvalue(":senha", $usuario->getsenha()); $p_sql->bindvalue(":ativo", $usuario->getativo()); $p_sql->bindvalue(":cod_perfil", $usuario->getperfil()-> getcod_perfil()); $p_sql->bindvalue(":cod_usuario", $usuario->getcod_usuario()); catch (Exception $e) { public function Deletar($cod) { $sql = "DELETE FROM usuario WHERE cod_usuario = :cod"; $p_sql->bindvalue(":cod", $cod); catch (Exception $e) { public function BuscarPorCOD($cod) { $sql = "SELECT * FROM usuario WHERE cod_usuario = :cod"; $p_sql->bindvalue(":cod", $cod); $p_sql->execute(); return $this->populausuario($p_sql->fetch(pdo::fetch_assoc)); catch (Exception $e) { private function populausuario($row) { $pojo = new PojoUsuario; $pojo->setcod_usuario($row['cod_usuario']); $pojo->setnome($row['nome']); $pojo->setemail($row['email']); $pojo->setsenha($row['senha']); $pojo->setativo($row['ativo']); $pojo->setperfil(controllerperfil::getinstance()- >BuscarPorCOD($row['cod_perfil'])); return $pojo;
?> Listagem 6: Método DELETAR public function Deletar($cod) { $sql = "DELETE FROM usuario WHERE cod_usuario = :cod"; $p_sql->bindvalue(":cod", $cod); catch (Exception $e) { O PDO é criado no arquivo conexao.php, por isso utilizamos o código Conexao::getInstance()->prepare($sql ), é nesta linha que ao mesmo tempo que capturamos a instância do PDO da memória, já passamos a ele o SQL a ser preparado. O PDO irá pegar sua SQL e implementar os escapes necessários e segurança necessária. A única coisa que é necessário fazer é passar os parâmetros definidos no SQL com o método bindvalue e executar a Query com o método execute().