Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Getho

Crud generico com PDO

Recommended Posts

Salve pessoal,

 

Alguém ai sabe como criar um CRUD generico(funciona em todo sistema apenas alterando os paramentros) com PDO ?

Estou tentando fazer um aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, eu quero fazer algo mais simples e seguro para minhas conexões.

Eu quero tranformar este codigo:

<?phpabstract class banco {    //propriedades    public $servidor = "localhost";    public $usuario = "usuario";    public $senha = "senha";    public $nomebanco = "crud";    public $conexao = NULL;    public $dataset = NULL;    public $linhasafetadas = -1;    //métodos    public function __construct() {        $this->conecta();    }//contruct --controi o metodo.    public function __destruct() {        if ($this->conexao != NULL):            mysql_close($this->conexao);        endif;    }//destrct --Destroi o metodo criado.    public function conecta() {        $this->conexao = mysql_connect($this->servidor, $this->usuario, $this->senha, TRUE) or die($this->trataerro(__FILE__, __FUNCTION__, mysql_errno(), mysql_error(), TRUE));        mysql_select_db($this->nomebanco) or die($this->trataerro(__FILE__, __FUNCTION__, mysql_errno(), mysql_error(), TRUE));        mysql_query("SET NAMES 'utf8'");        mysql_query("SET character_set_connection=utf8");        mysql_query("SET character_set_client=utf8");        mysql_query("SET character_set_results=utf8");        ##echo "O metodo conecta foi chamado";    }//conecta    //Para inserir dados ao banco de dados    public function inserir($objeto) {        $sql = "INSERT INTO " . $objeto->tabela . " (";        for ($i = 0; $i < count($objeto->campos_valores); $i++):            $sql.= key($objeto->campos_valores);            if ($i < (count($objeto->campos_valores) - 1)):                $sql .= ", ";            else:                $sql .= ") ";            endif;            next($objeto->campos_valores);        endfor;        //Resetando os valores...        reset($objeto->campos_valores);        $sql .= "VALUES (";        for ($i = 0; $i < count($objeto->campos_valores); $i++):            $sql.= is_numeric($objeto->campos_valores[key($objeto->campos_valores)]) ?                    $objeto->campos_valores[key($objeto->campos_valores)] :                    "'" . $objeto->campos_valores[key($objeto->campos_valores)] . "'";            if ($i < (count($objeto->campos_valores) - 1)):                $sql .= ", ";            else:                $sql .= ") ";            endif;            next($objeto->campos_valores);        endfor;        return $this->executaSQL($sql);    }//fim função inserir    //Atualizar Banco de dados    public function atualizar($objeto) {        $sql = "UPDATE " . $objeto->tabela . " SET ";        for ($i = 0; $i < count($objeto->campos_valores); $i++):            $sql.= key($objeto->campos_valores) . "=";            $sql.= is_numeric($objeto->campos_valores[key($objeto->campos_valores)]) ?                    $objeto->campos_valores[key($objeto->campos_valores)] :                    "'" . $objeto->campos_valores[key($objeto->campos_valores)] . "'";            if ($i < (count($objeto->campos_valores) - 1)):                $sql .= ", ";            else:                $sql .= " ";            endif;            next($objeto->campos_valores);        endfor;        $sql .= "WHERE " . $objeto->campopk . "=";        $sql .= is_numeric($objeto->campopk) ? $objeto->valorpk :                "'" . $objeto->valorpk . "'";        return $this->executaSQL($sql);    }// fim atualizar sql    //Deletar dados do banco    public function deletar($objeto) {        $sql = "DELETE FROM " . $objeto->tabela;        $sql .= " WHERE " . $objeto->campopk . "=";        $sql .= is_numeric($objeto->campopk) ? $objeto->valorpk :                "'" . $objeto->valorpk . "'";        return $this->executaSQL($sql);    }//Fim deletar    //Seleciona tudo    public function selecionaTudo($objeto) {        $sql = "SELECT * FROM " . $objeto->tabela;        if ($objeto->extras_select != NULL):            $sql .= " " . $objeto->extras_select;        endif;        return $this->executaSQL($sql);    }//Fim selecionaTudo    //Seleciona campos    public function selecionaCampos($objeto) {        $sql = "SELECT ";        for ($i = 0; $i < count($objeto->campos_valores); $i++):            $sql.= key($objeto->campos_valores);            if ($i < (count($objeto->campos_valores) - 1)):                $sql .= ", ";            else:                $sql .= " ";            endif;            next($objeto->campos_valores);        endfor;        $sql .= " FROM " . $objeto->tabela;        if ($objeto->extras_select != NULL):            $sql .= " " . $objeto->extras_select;        endif;        return $this->executaSQL($sql);    }//Fim selecionaCampos    //Rotina de inserção de SQL    public function executaSQL($sql = NULL) {        if ($sql != NULL):            $query = mysql_query($sql) or $this->trataerro(__FILE__, __FUNCTION__);            $this->linhasafetadas = mysql_affected_rows($this->conexao);            if (substr(trim(strtolower($sql)), 0, 6) == 'select'):                $this->dataset = $query;                return $query;            else:                return $this->linhasafetadas;            endif;        else:            $this->trataerro(__FILE__, __FUNCTION__, 'Comando SQL nao informado na rotina', FALSE);        endif;    }// fim executaSQL    //RetornaSQL dados    public function retornaDados($tipo = NULL) {        switch (strtolower($tipo)):            case "array":                return mysql_fetch_array($this->dataset);                break;            case "assoc":                return mysql_fetch_assoc($this->dataset);                break;            case "object":                return mysql_fetch_object($this->dataset);                break;            default:                return mysql_fetch_object($this->dataset);                break;        endswitch;    }//Fim retornaDados    public function trataerro($arquivo = NULL, $rotina = NULL, $numerro = NULL, $msgerro = NULL, $geraexcept = FALSE) {        if ($arquivo == NULL)            $arquivo = "nao informado";        if ($rotina == NULL)            $rotina = "nao informada";        if ($numerro == NULL)            $numerro = mysql_errno($this->conexao);        if ($msgerro == NULL)            $msgerro = mysql_error($this->conexao);        $resultado = 'Ocorreu um erro com os seguintes detalhes:<br />                          <strong>Arquivo:</strong> ' . $arquivo . '<br />                          <strong>Rotina:</strong> ' . $rotina . '<br />                          <strong>Codigo:</strong> ' . $numerro . '<br />                          <strong>Mensagem:</strong> ' . $msgerro;        if ($geraexcept == FALSE):            echo($resultado);        else:            die($resultado);        endif;    }//tratamento}//Fim classe banco?>Classe base:    <?phprequire_once("banco.class.php");abstract class base extends banco {    //Propriedades    public $tabela = "";    public $campos_valores = array();    public $campopk = NULL; //pk primary key ou chave primaria    public $valorpk = NULL;    public $extras_select = "";    //metodos    //Adicionar campo na tabela    public function addCampo($campo = NULL, $valor = NULL) {        if ($campo != NULL):            $this->campos_valores[$campo] = $valor; //$valor que for passado        endif;    }//fim addCampo    //Deleta campo    public function delCampo($campo = NULL) {        if (array_key_exists($campo, $this->campos_valores)):            unset($this->campos_valores[$campo]);        endif;    }//fim delCampo.    //Seta valor        public function setValor($campo = NULL, $valor = NULL) {        if ($campo != NULL && $valor != NULL):            $this->campos_valores[$campo] = $valor;        endif;    }//fim setvalor    //getValor    public function getValor($campo = NULL) {        if ($campo != NULL && array_key_exists($campo, $this->campos_valores)):            return $this->campos_valores[$campo];        else:            return FALSE;        endif;    }// fim getvalor}//fim classe base.?>chamada da classe:    <?phprequire_once("base.class.php");class clientes extends base {    //Contruct    public function __construct($campos = array()) {        parent::__construct();        $this->tabela = "clientes";        if (sizeof($campos) <= 0):            $this->campos_valores = array(                "nome" => NULL,                "sobrenome" => NULL,            );        else:            $this->campos_valores = $campos;        endif;        $this->campopk = "id";    }//construct}//fim classe clientes.?>

Para PDO, pois PDO possui maior segurança, é possivel ou fica muito complicado, estou batalhando e não estou conseguindo.

 

Veja o que estou fazendo:

 

Conexao.php

<?php/* * O padrão Singleton  * */abstract class Conexao {    const USER = "user";    const PASS = "senha";    private static $instance = null;    private static function conectar() {        try {   ##Tenta conectar ao banco se não funcionar cai no catch            if (self::$instance == null): ##se não existir conexão com PDO receber a new PDO() | a conexão                $dsn = "mysql:host=localhost;dbname=phpoo";                self::$instance = new PDO($dsn, self::USER, self::PASS);            endif;        } catch (PDOException $e) {            echo "Erro: " . $e->getMessage(); #        }        return self::$instance; ## se ja exixtir uma conexão ele retorna a conexão    }    protected static function getDB() {        return self::conectar();    } }

Estou fazendo a classe abstrata.php e cada nova classe por exemplo cliente.php musicas.php criar uma nova classe.

 

 

Me der um exemplo de um Insert Gererico com PDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia abstrair ainda mais a tabela, como nos tópicos passados pelo nosso amigo.

 

o resultado poderia ser, por exemplo, assim:

$user = new User();
$user->name = 'Joseph Marroquinos';
$user->save();

Nesse exemplo o save é generico, pode gerar tanto um insert como um update.

 

outro exemplo, só que atualizando

$user = User::$objects->get($id_user);
$user->name = 'José Marroquinos';
$user->save();

O legal dessa abordagem voltada para abstração é a facilidade de criar consultas complexas sem a necessidade de usar sql, usando as caracteristicas da linguagem que está sendo utilizada, por exemplo;

$user = User::$objects->filter(['idade' => 15])->join('email')->orderBy('idade')->limit(5)->all();

o equivalente em SQL seria bem mais que 1 linha

 

Criar tudo isso do zero é algo trabalhoso, eu pessoalmente prefiro usar frameworks voltados para isso, essa interface que eu te mostrei é semelhante a usada no framework Django (python).


Outra vantagem de receber os dados do banco de dados como "objetos" e não como "array" é que você não precisa repetir lógicas relacionadas ao dados por exemplo.

 

O jeito chato:

$user = $query->fetch(PDO::FETH_ASSOCIATIVE);
echo "nome completo = ".$user['first_name'].$user['last_name'];

O jeito legal:

echo "nome completo = ".$user->getFullName();

Até as relações são facilitadas, por exemplo:

foreach($user->email_set->all() as $user_email) {
    echo "Email encontrado: {$user_email->email}";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você poderia abstrair ainda mais a tabela, como nos tópicos passados pelo nosso amigo.

 

o resultado poderia ser, por exemplo, assim:

$user = new User();
$user->name = 'Joseph Marroquinos';
$user->save();

Nesse exemplo o save é generico, pode gerar tanto um insert como um update.

 

outro exemplo, só que atualizando

$user = User::$objects->get($id_user);
$user->name = 'José Marroquinos';
$user->save();

O legal dessa abordagem voltada para abstração é a facilidade de criar consultas complexas sem a necessidade de usar sql, usando as caracteristicas da linguagem que está sendo utilizada, por exemplo;

$user = User::$objects->filter(['idade' => 15])->join('email')->orderBy('idade')->limit(5)->all();

o equivalente em SQL seria bem mais que 1 linha

 

Criar tudo isso do zero é algo trabalhoso, eu pessoalmente prefiro usar frameworks voltados para isso, essa interface que eu te mostrei é semelhante a usada no framework Django (python).

Outra vantagem de receber os dados do banco de dados como "objetos" e não como "array" é que você não precisa repetir lógicas relacionadas ao dados por exemplo.

 

O jeito chato:

$user = $query->fetch(PDO::FETH_ASSOCIATIVE);
echo "nome completo = ".$user['first_name'].$user['last_name'];

O jeito legal:

echo "nome completo = ".$user->getFullName();

Até as relações são facilitadas, por exemplo:

foreach($user->email_set->all() as $user_email) {
    echo "Email encontrado: {$user_email->email}";
}

Você poderia me indicar um framework pra PHP que faça isso ? no caso o framework Django é para pyton.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No PHP eu só tenho experiência com o Yii Framework (http://www.yiiframework.com/)

 

Eu uso a versão 1, porém a versão 2 está em desenvolvimento.

 

as consultas dele são assim:

 

$usuario = Usuario::model()->findByPk($id_usuario);

 

Eu não tenho experiência no Propel Orm (http://propelorm.org/) mas a vantagem dele e que ele é voltado somente para o ORM e não para a aplicação inteira como o Yii.

 

Existem outros framework FullStack (como o Yii) muitos bem falados, como por exemplo o Symfony, Laravel, Zend Framework (acho ele muito complexo, não acho produtivo) e etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No PHP eu só tenho experiência com o Yii Framework (http://www.yiiframework.com/)

 

Eu uso a versão 1, porém a versão 2 está em desenvolvimento.

 

as consultas dele são assim:

$usuario = Usuario::model()->findByPk($id_usuario);

Eu não tenho experiência no Propel Orm (http://propelorm.org/) mas a vantagem dele e que ele é voltado somente para o ORM e não para a aplicação inteira como o Yii.

 

Existem outros framework FullStack (como o Yii) muitos bem falados, como por exemplo o Symfony, Laravel, Zend Framework (acho ele muito complexo, não acho produtivo) e etc.

Muito bom,

Vou dar uma analizada sim.

Estou procurando a fundo sobre uma forma eficaz de fazer isso.

 

 

Alguém conhece o Doctrine DBAL: PHP Database Abstraction Layer ?

Sabe se é bom e como usá-lo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.