INSERT com PDO utilizando DAO

, ,

Olá, o meu código não me reporta erro nenhum, más não faz o INSERT no banco, o que há de errado? Estou fazendo da maneira correta? Alguma dica ou sugestão?

Classe de Conexão com o banco

    abstract class Conn { // Defini que ela é uma classe abstrata, ou seja, ela não pode ser instanciada
        private static $status = null; // Atributo para verificar se já existe uma conexão com o banco

        public static function getConn(){ // Método que irá ser instanciado para se fazer uma conexão
            if(self::$status == null){ // Se não estiver conectado, então faça a conexão
                $opt = array(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Definindo o tipo de erro da minha conexão
                self::$status = new PDO(DB['db']. ":" . "dbname:" . DB['name'] . "; host: " . DB['host'], DB['user'], DB['pass'], $opt);
                return self::getConn();
            } else {
                return self::$status; // Se já estiver conectado, então me retorne a conexão
            }
        }
    }

Classe De Inserção

class Insert extends Conn{
    private $query;
    private $tabela;
    private $dados;
    
    // PDO
    private $Conn;
    
    // PDO Statements
    private $Insert;
    
    public function exeInsert($Tabela, $Dados){ // Carrega a minha classe com as informações
        $this->tabela = (string) $Tabela;
        $this->dados = (array) $Dados;
        
        $this->getQuery();
        $this->execute();
    }

        public function getRowCount(){ // Retorna quantas linhas foram afetadas
            return $this->Insert->rowCount();
    }
    
    private function connect(){ // Faz a conexão com o banco e o Statements
        $this->Conn = parent::getConn(); // Conectando
        $this->Insert = $this->Conn->prepare($this->query); // O Insert prepara a minha query
    }
    
    private function getQuery(){
        foreach ($this->dados as $key => $value) {
            $fields[] = $key;
            $links[] = ':' . $key;
        }
        $fields = implode(', ', $fields);
        $links = implode(', ', $links);
        $this->query = "INSERT INTO {$this->tabela} ({$fields}) VALUES ({$links})";
    }
    
    private function setParams($Statements, array $Parameters){
        foreach ($Parameters as $key => $value) {
            $this->setParam($Statements, $key, $value);
        }
    }
    
    private function setParam($Statements, $Key, $Value){
        $Statements->bindParam(":{$Key}", $Value);
    }
    
    private function execute(){
        $this->connect();
        try{
            $this->setParams($this->Insert, $this->dados);
            $this->Insert->execute();
        } catch (PDOException $ex) {
            $ex->getMessage();
        }
    }
}

Página Index

<!DOCTYPE html>
<html lang="pt-BR">
    <head>
        <meta charset="UTF-8">
        <title>Testando o meu DAO</title>
    </head>
    <body>
        <?php
            require_once './config.php';
            $insert = new Insert();
            $usu = array(
                "usuario" => "Eliane",
                "senha" => "password"
            );
            
            $insert->exeInsert('usuario', $usu);
            var_dump($insert);
        ?>
    </body>
</html>

No meu config.php está apenas o auto load das classes e as minha defines do banco, está tudo correto.

vc não disse o principal, qual base de dados está usando?

Se for mysql, pode ser problemas de engine:

https://dev.mysql.com/doc/refman/8.0/en/storage-engine-setting.html

Tente algo assim logo após criar o pdo…

 ...
$con = self::getConn();
$con->exec('SET default_storage_engine=InnoDB;');
return $con;

Alias seu método getConn está tentando implementar um singleton, vc está dando algumas voltas pois a meu ver não precisa de recursão (chamar getConn dentro de getConn…)

public static function getConn(){
    if(self::$status == null){
        ...
        self::$status = new PDO(...);
        self::$status->exec('SET default_storage_engine=InnoDB;'); //ou MyISAM por exemplo
    }
    return self::$status;
}

Verifique no seu banco qual engine ele usa para o pdo aplicar também…

Pesquise também por emulate prepares, pode influenciar nas operações com o banco, boa sorte!

1 curtida

Obrigado pelo retorno amigo. Corrigi as voltas que estava dando no Singleton, fiz as alterações como sugeriu mas o problema persiste. Estou usando o MySql como base e a engine é a InnoDB mesmo.

Como disse antes, veja também o emulate prepare do pdo, pesquise sobre os setAttribute dele, talvez a configuração pode influenciar nisso também…

Apenas um adendo, veja se não precisa de transactions para poder inserir, atualizar ou remover registros da base antes, talvez por isso o pdo não insere nada:

http://php.net/manual/pt_BR/pdo.begintransaction.php