Getho 0 Denunciar post Postado Setembro 2, 2014 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
Gabriel Heming 766 Denunciar post Postado Setembro 2, 2014 Escolha o que melhor lhe servir: http://forum.imasters.com.br/topic/464790-vo-dto-model-dao/?p=1843808 http://forum.imasters.com.br/topic/401441-organizar-cdigo/#entry1572696 http://forum.imasters.com.br/topic/377063-o-que-mvc-a-model/ Compartilhar este post Link para o post Compartilhar em outros sites
Getho 0 Denunciar post Postado Setembro 2, 2014 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
Anderson Danilo 43 Denunciar post Postado Setembro 2, 2014 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
Getho 0 Denunciar post Postado Setembro 3, 2014 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
Anderson Danilo 43 Denunciar post Postado Setembro 3, 2014 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
Getho 0 Denunciar post Postado Setembro 3, 2014 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