Banco de dados com PDO – parte 2 - Entendendo o padrão MVC na prática – Parte 09 Artigo

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


Este artigo foi publicado a 2 anos, 8 meses, 1 semana atrás.

Eu quero que meu framework MVC possa ser usado com outros bancos de dados, por isso vou criar uma classe chamada DbMysql que vai herdar os métodos que criamos na SuportePdo do artigo anterior.

Esta classe também vai se conectar ao banco de dados, então:

namespace Erik\Core\Master;

use PDO;
use Erik\Core\Master\Db\Suporte_Pdo;
class Db_Mysql extends Suporte_Pdo
{

    public $db,$table,$mysql;
    protected $mysql_exec;

    public function __construct(Array $db,$table)
    {
        $this->db=$db;
        $this->table=$table;

        if ((isset($this->db['servidor'])) and (isset($this->db['usuario'])) and (isset($this->db['senha']))) {
            $this->mysql = new PDO(
                'mysql:host='.$this->db['servidor'].';dbname='.$this->db['database'], $this->db['usuario'], $this->db['senha']
            );
            $this->mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
    }
    /*...*/
}

A variável $db recebe os dados de conexão, $table o nome da tabela no banco e $mysql a conexão, $mysql_exec será usada no read mais pra frente.

Gostou deste artigo?

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

É isso, uma típica conexão usando PDO e armazenada em um atributo ($this->mysql que representa o $mysql da classe).

Seguindo em frente, vamos criar o método CREATE, o C do CRUD.

/*...__construct()...*/

public function create(Array $campos)
{
    $save=$this->getCampos($campos);

    $fields = implode('`,`', array_keys($campos));
    $values = implode(',', array_keys($save['save']));

    $sql='INSERT INTO `'.$this->table.'` (`'.$fields.'`) VALUES('.$values.');';

    $this->pdo($sql, $save['save']);

}

Veja que diferente do artigo passado eu usei implode() e arraykeys() em vez de foreach() para criar a lista de campos e valores, bem mais limpo. Também chamei o método pdo que criamos antes, ele fica disponível para usarmos graças ao extends SuportePdo.

Vou pular o READ e vou direto para o UPDATE (U do CRUD) e o DELETE (D do CRUD):

    /*...__construct(), create()...*/

    public function update(Array $conditions,Array $campos)
    {

        $save=$this->getCampos($campos);

        $conditions=$this->getCampos($conditions);

        $save['save']=array_merge($save['save'], $conditions['save']);

        $sql='UPDATE `'.$this->table.'` SET '.$save['sql'].' WHERE '.$conditions['sql'].';';

        $this->pdo($sql, $save['save']);

    }

    public function delete(Array $conditions)
    {
        $save=$this->getCampos($conditions);

        $sql = 'DELETE FROM `'.$this->table.'` '.$save['sql'].';';
        $this->pdo($sql, $save['save']);
    }
}

Viu como usamos agora o getCampos() do SuportePdo várias vezes? Quando formos atualizar um cadastro passamos os dados no primeiro parâmetro e a condição (WHERE) na segundo: update($dados, $condicoes), e o PHP roda o array_merge para juntar os valores de $dados e de $condições em um array só. Se tiver alguma dúvida manda nos comentários.

E pra terminar o READ (R do CRUD).

/*...__construct(), create()...*/
public function read($tipo='all', Array $configs=array())
{

    $save['sql']='';
    $save['save']=array();
    $campos ='';

    if (!isset($configs['campos'])) {
        $campos='*';
    } else {
        implode('`,`', array_keys($configs['campos']));
    }

    if (isset($configs['where'])) {
        $ret=$this->getCampos($configs['where']);
        $save['sql'] .= 'WHERE '.$ret['sql'];
        $save['save']=array_merge($ret['save'], $save['save']);
    }

    if (isset($configs['group by'])) {
        $ret=$this->getCampos($configs['group by']);
        $save['sql'] .= 'GROUP BY '.$ret['sql'];
    }

    if (isset($configs['order by'])) {
        $ret=$this->getCampos($configs['order by']);
        $save['sql'] .= 'ORDER BY '.$ret['sql'];
    }
    if (isset($configs['limit'])) {
        $ret=$this->getCampos($configs['limit']);
        $save['sql'] .= 'LIMIT '.$ret['sql'];
    }
    if (isset($configs['offset'])) {
        $ret=$this->getCampos($configs['offset']);
        $save['sql'] .= 'OFFSET '.$ret['sql'];
    }

    $sql = 'SELECT '.$campos.' FROM `'.$this->table.'`'.$save['sql'].';';

    $this->pdo($sql, $save['save']);

    if ($tipo=='first') {
        return $this->mysql_exec->fetch(PDO::FETCH_ASSOC);
    } elseif ($tipo=='all') {
        return $this->mysql_exec->fetchAll(PDO::FETCH_ASSOC);
    } elseif ($tipo=='count') {
        return $this->mysql_exec->rowCount();
    }
}
/*...update(), delete()...*/

Como disse anteriormente, tentei manter comandos simples para que fique de fácil entendimento. Qualquer dúvida poste nos comentários. Na próxima aula vamos começar a criar a aplicação.

É isso ai, até a próxima aula :)

Aqui os arquivos desta aula e o estudo completo.


Cursos relacionados


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