Aprenda PHP com PDO

  • Página Inicial
  • Contato!
  • Tudo sobre PHP com PDO Parte 1!
  • Tudo sobre PHP com PDO Parte 2!
  • Tudo sobre PHP com PDO Parte 2

    Criando Classe e Método Estático pra Conexão

    O recomendado em PDO é colocar a função dentro de uma classe, veja abaixo como fica nossa conexão dentro de uma classe:

    
    class ConnectionFactory {
        private const HOSTNAME = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
        private const USERNAME = "root";
        private const PASSWORD = "";
        
        public static function getConnection() {
            try {
                $conexao = new PDO(self::HOSTNAME, self::USERNAME, self::PASSWORD);
    
                return $conexao;
            }
            catch(PDOException $ex) {
                echo "ERRO: " . $ex->getMessage();
            }
        }
    }
    
    

    PS: Coloque os modificadores public para o método ser acessível e o static para chamarmos ele sem criar um objeto. O const por padrão também é estático.

    Daí, aonde tiver a conexão basta colocar assim:

    
    ConnectionFactory::getConnection();
    
    

    Criando Método pra Fechar Conexão

    Crie na classe FabricaConexao esse método:

    
    public static function closeConnection($con, $stmt = null, $rs = null) {
        if($con != null) {
            try {
                $con = null;
            }
            catch(PDOException $ex) {
                echo "ERRO: {$ex->getMessage()}";
            }
        }
    
        if($stmt != null) {
            try {
                $stmt = null;
            }
            catch(PDOException $ex) {
                echo "ERRO: {$ex->getMessage()}";
            }
        }
    
        if($rs != null) {
            try {
                $rs = null;
            }
            catch(PDOException $ex) {
                echo "ERRO: {$ex->getMessage()}";
            }
        }
    }
    
    

    Esse método usaremos para fechar a conexão ao chamar outros métodos.

    Criando Bean

    Crie uma classe com esse código:

    
    class Produto {
        private $id;
        private $descricao;
        private $qtd;
        private $valor;
    
        public function getId() {
            return $this->id;
        }
    
        public function getDescricao() {
            return $this->descricao;
        }
    
        public function getQtd() {
            return $this->qtd;
        }
    
        public function getValor() {
            return $this->valor;
        }
    
        public function setId($id) {
            $this->id = $id;
        }
    
        public function setDescricao($descricao) {
            $this->descricao = $descricao;
        }
    
        public function setQtd($qtd) {
            $this->qtd = $qtd;
        }
    
        public function setValor($valor) {
            $this->valor = $valor;
        }
    }
    
    

    Agora crie a classe ProdutoDAO com esse código:

    
    require_once "ConnectionFactory.php"; 
    require_once "Produto.php";
    
    class ProdutoDAO {
        private $con = null;
        
        public function __construct() {
            $this->con = ConnectionFactory::getConnection();   
        }
        
        public function save($prod) {
            $sql = "insert into produto (descricao, qtd, valor) values (?, ?, ?)";
            
            $stmt = null;
            
            try {
                $stmt = $this->con->prepare($sql);
                $stmt->bindValue(1, $prod->getDescricao());
                $stmt->bindValue(2, $prod->getQtd());
                $stmt->bindValue(3, $prod->getValor());
                $stmt->execute(); 
            
                return true;
            }
            catch(PDOException $ex) {
                echo "Erro: " . $ex;
            }
            finally { // Isso fecha a conexão
                ConnectionFactory::closeConnection($this->con, $stmt);
            }
        }
    }
    
    

    Crie também a classe ProdutoDAOTest:

    
    require_once "Produto.php";
    require_once "ProdutoDAO.php"; 
    
    class ProdutoDAOTest { 
        public function inserir() {
            $prod = new Produto();
            
            $prod->setDescricao("Feijão");
            $prod->setQtd(20);
            $prod->setValor(10);
            
            $dao = new ProdutoDAO();
            
            if($dao->save($prod)) {
                echo "Salvo com Sucesso!";
            }
            else {
                echo "Erro ao Salvar!";
            }
        }
    }
    
    

    E no index coloque isso pra inserir o dado:

    
    require_once "ProdutoDAOTest.php";
    
    $test = new ProdutoDAOTest();
    
    $test->inserir();
    
    

    Buscar Todos com Composição

    Em ProdutoDAO, coloque esse método:

    
    public function findAll() {
        $sql = "select * from produto";
    
        $stmt = null;
        $rs = null;
    
        $produtos = array();
    
        try {
            $stmt = $this->con->prepare($sql);
    
            $stmt->execute();
    
            $rs = $stmt->fetchAll();
    
            $total = $rs[0] ?? 0;
    
            foreach($rs as $r) {
                $prod = new Produto();
    
                $prod->setId($r["id"]);
                $prod->setDescricao($r["descricao"]);
                $prod->setQtd($r["qtd"]);
                $prod->setValor($r["valor"]);
    
                array_push($produtos, $prod);
            }
        }
        catch(PDOException $ex) {
            echo "ERRO: {$ex->getMessage()}";
        }
        finally {
            ConnectionFactory::closeConnection($this->con, $stmt, $rs);
        }
    
        return $produtos;
    }
    
    

    Em ProdutoDAOTest, coloque isso:

    
    public function listar() {
        $dao = new ProdutoDAO();
    
        foreach($dao->findAll() as $p) {
            echo "<hr/>";
            echo "Descrição: {$p->getDescricao()}<br/>";
            echo "Qtd: {$p->getQtd()}<br/>";
            echo "Valor: {$p->getValor()}<br/>";
            echo "<hr/>";
        }
    }
    
    

    E no index.php, apenas isso:

    
    $test = new ProdutoDAOTest();
    
    $test->listar();
    
    

    Atualizar Registro com Composição

    Em ProdutoDAO, adicione um método dessa forma:

    
    public function update($prod) {
        $sql = "update produto set descricao = ?, qtd = ?, valor = ? where id = ?";
    
        $stmt = null;
        
        try {
            $stmt = $this->con->prepare($sql);
            $stmt->bindValue(1, $prod->getDescricao());
            $stmt->bindValue(2, $prod->getQtd());
            $stmt->bindValue(3, $prod->getValor());
            $stmt->bindValue(4, $prod->getId());
            
            $stmt->execute();
    
            return true;
        }
        catch(PDOException $ex) {
            echo "Erro: " . $ex;
        }
        finally {
            ConnectionFactory::closeConnection($this->con, $stmt);
        }
    }
    
    

    E na classe ProdutoDAOTest coloque isso:

    
    public function atualizar() {
        $prod = new Produto();
    
        $prod->setDescricao("Farinha");
        $prod->setQtd(20);
        $prod->setValor(10);
        $prod->setId(2);
    
        $dao = new ProdutoDAO();
    
        if($dao->update($prod)) {
            echo "Atualizado com Sucesso!";
        }
        else {
            echo "Erro ao Atualizar!";
        }
    }
    
    

    E no index coloque isso pra atualizar o dado:

    
    $test = new ProdutoDAOTest();
    
    $test->atualizar();
    
    

    Excluir Registro com Composição

    Em ProdutoDAO, adicione um método dessa forma:

    
    public function delete($prod) {
        $sql = "delete from produto where id = ?";
    
        $stmt = null;
        
        try {
            $stmt = $this->con->prepare($sql);
            $stmt->bindValue(1, $prod->getId());
            
            $stmt->execute();
    
            return true;
        }
        catch(PDOException $ex) {
            echo "Erro: " . $ex;
        }
        finally {
            ConnectionFactory::closeConnection($this->con, $stmt);
        }
    }
    
    

    E na classe ProdutoDAOTest coloque isso:

    
    public function excluir() {
        $prod = new Produto();
    
        $prod->setId(3);
    
        $dao = new ProdutoDAO();
    
        if($dao->delete($prod)) {
            echo "Deletado com Sucesso!";
        }
        else {
            echo "Erro ao Deletar!";
        }
    }
    
    

    E no index coloque isso pra excluir o dado:

    
    $test = new ProdutoDAOTest();
    
    $test->excluir();