Ir para conteúdo

POWERED BY:

Arquivado

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

Leandro Gomes da Silva

CRUD em DAO

Recommended Posts

Pessoal, estou com alguns problemas para fazer um sistema de CRUD para músicas utilizando DAO. Será que alguém poderia me dar uma força? Até agora só consegui fazer a parte de inserção... o resto não consigo fazer NADA! Seguem os códigos:

controllers/musicController.php

<?php

require_once ("../models/music.php");

class musicController {

   private $cadastre;
   private $selection;

   public function __construct() {

       $action = $_POST['action'];
       if ($action == "insert") {
           $this->cadastre = new music();
           $this->insert();
       } elseif($action == "select"){
           $this->selection = new music();
           $this->select();
       }
   }

   private function insert() {
       $this->cadastre->setAlb_id($_POST['alb_id']);
       $this->cadastre->setArtist($_POST['artist']);
       $this->cadastre->setTitle($_POST['title']);
       $this->cadastre->setTrack($_POST['track']);

       $result = $this->cadastre->insert();

       if ($result >= 1) {
           echo "<script>alert('Registro incluído com sucesso!');
               document.location='../view/index.php'</script>";
       } else {
           echo "<script>alert('Erro ao gravar registro!');
               history.back()</script>";
       }
   }

   private function select_m(){
   }
}

new musicController();

?>

 

models/music.php

<?php

require_once ("database.php");

class music extends dataBase {

   private $track;
   private $alb_id;
   private $title;
   private $artist;

   function __construct() {
       parent::__construct();
   }

   public function setTrack($int) {
       $this->track = $int;
   }

   public function setAlb_id($int) {
       $this->alb_id = $int;
   }

   public function setTitle($string) {
       $this->title = $string;
   }

   public function setArtist($string) {
       $this->artist = $string;
   }

   public function getTrack() {
       return $this->track;
   }

   public function getAlb_id() {
       return $this->alb_id;
   }

   public function getTitle() {
       return $this->title;
   }

   public function getArtist() {
       return $this->artist;
   }

   public function insert() {
       $this->table = "music";
       $this->fields = array("track", "alb_id", "title", "artist");
       $this->values = array($this->getTrack(), $this->getAlb_id(),
           $this->getTitle(), $this->getArtist());
       $result = $this->insertValues();

       return $result;
   }

   public function delete($id) {
       $this->fields = array("id");
       $this->values = array("$id");
       $result = $this->deleteValues();

       return $result;
   }

   public function select($string){
       $this->fields = array("music");
       $this->values = array("$string");
       $result = $this->selectValues($string);

       return $result;
   }

}

?>

 

models/dataBase.php

<?php

class dataBase {

   private $host;
   private $user;
   private $pass;
   private $dBase;
   private $queryFields = NULL;
   private $queryValues = NULL;
   private $queryIquality = NULL;
   private $sql;
   private $query;
   public $table;
   public $fields; //array
   public $values; //array
   private $connection;

   public function __construct() {
       $this->connection();
   }

   private function connection() {
       $this->host = 'localhost';
       $this->user = 'root';
       $this->pass = '12345';
       $this->dBase = 'collection';

       mysql_connect($this->host, $this->user, $this->pass) or die(mysql_error());
       mysql_select_db($this->dBase);
   }

   //$type == 1 -> Insert
   //$type == 2 -> Update
   //$type == 3 -> Delete
   private function buildQuery($type) {
       $cont = count($this->fields);

       for ($i = 0; $i < $cont; $i++) {
           //Se tiver mais de 1
           if ($i < $cont - 1) {
               if ($type == 1) {
                   $this->queryFields .= $this->fields[$i] . ", ";
                   $this->queryValues .= "'" . $this->values[$i] . "', ";
               } elseif ($type == 2) {

               } elseif ($type == 3) {
                   //$this->queryFields .= $this->fields[$i] . "=" . "'" .
                   //      $this->values[$i] . "' AND ";
               }
               //Se tiver apenas 1
           } else {
               if ($type == 1) {
                   $this->queryFields .= $this->fields[$i];
                   $this->queryValues .= "'" . $this->values[$i] . "'";
               } elseif ($type == 2) {

               } elseif ($type == 3) {
                   $this->queryIquality .= $this->fields[$i] . "=" . "'" .
                           $this->values[$i] . "'";
               } elseif ($type == 4) {
                   $this->queryIquality .= $this->fields[$i] . "=" . "'" .
                           $this->values[$i] . "'";
               }
           }
       }
   }

   public function insertValues() {
       $this->buildQuery(1);

       $this->sql = "INSERT INTO " . $this->table . " (" . $this->queryFields .
               ") VALUES (" . $this->queryValues . ")";
       $this->query = mysql_query($this->sql) or die(mysql_error());
       $this->result = mysql_affected_rows();

       return $this->result;
   }

   public function updateValues() {

   }

   public function deleteValues() {
       $this->buildQuery(3);

       $this->sql = "DELETE FROM " . $this->table . " WHERE " .
               $this->queryFields;
       $this->query = mysql_query($this->sql);
       $this->result = mysql_affected_rows();

       return $this->result;
   }

   public function selectValues($string) {
       $this->buildQuery(4);

       $this->sql = "SELECT * FROM " . $this->table . " WHERE " .
               $this->queryIquality . " ORDER BY " . $string . " ASC";
       $this->query = mysql_query($this->sql);
       $this->result = mysql_affected_rows();

       return $this->result;
   }

}

?>

 

No caso, eu teria um formulário para pesquisar as músicas, deletar, atualizar e cadastrar... Na verdade, o sistema é um pouco mais que isso, mas se me ajudarem nesta parte acredito que consigo fazer o resto por conta própria...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem alguns erros conceituais aí.

Essa classe music não deve estender dataBase, utilize composição invés de heranças para isso.

 

Além disso, qual sua dúvida especificamente?

A operação de DELETE não está funcionado?

Já tentou imprimir a variável $this->sql para ver se está montando da maneira correta?

 

Percebi também que as operações de UPDATE estão em branco?

Está com dúvidas na sintaxe?

É mais ou menos assim:

UPDATE tabela SET campo1 = 'valor1', [campo2 = 'valor2']... WHERE cond

cond normalmente é uma comparação de igualdade com o ID da linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem alguns erros conceituais aí.

Essa classe music não deve estender dataBase, utilize composição invés de heranças para isso.

 

Além disso, qual sua dúvida especificamente?

A operação de DELETE não está funcionado?

Já tentou imprimir a variável $this->sql para ver se está montando da maneira correta?

 

Percebi também que as operações de UPDATE estão em branco?

Está com dúvidas na sintaxe?

É mais ou menos assim:

UPDATE tabela SET campo1 = 'valor1', [campo2 = 'valor2']... WHERE cond

cond normalmente é uma comparação de igualdade com o ID da linha.

 

A sintaxe do SQL eu sei... eu não estou conseguindo entender como eu vou fazer todo o processo... como eu chamo a função pra exibir/alterar/excluir os dados, quem a função chama, como ela chama...essas coisas mais conceituais...

 

EDIT: Quando você diz composição, seria o q?

Compartilhar este post


Link para o post
Compartilhar em outros sites

c da muita volta pra faze um INSERT =X

 

toda model sua vai te q implementa um update com um insert certo?

 

prq num faz do jeito mais simples ?

 

Usa PDO camarada..

 

pra q essa zebra pra monta query... desperdício d processamento! faze um string e mais de boa que isso tudo!=X

class DAO{
public function save(){
if ($this->id)
return $this->_update;
else
return $this->_insert;
}
}
class model extend DAO{

public function _update(){

$stm = $this->conn->prepare("Update ...")
$stm->bindValues(1,$this->getNome());

return $stm->execute;


}
public function _insert(){

$stm = $this->conn->prepare("Insert...")
$stm->bindValues(1,$this->getNome());

return $stm->execute;


}
}

class controller_music extends model{

public function update
$this->setNome($_POST['nome']);
$this->setId($_POST['id']);
return $this->save();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

c da muita volta pra faze um INSERT =X

 

toda model sua vai te q implementa um update com um insert certo?

 

prq num faz do jeito mais simples ?

 

Usa PDO camarada..

 

pra q essa zebra com array pra monta query... desperdício d processamento! faze um string e mais de boa que isso tudo!=X

class DAO{
public function save(){
if ($this->id)
return $this->_update;
else
return $this->_insert;
}
}
class model extend DAO{

public function _update(){

$stm = $this->conn->prepare("Update ...")
$stm->bindValues(1,$this->getNome());

return $stm->execute;


}
public function _insert(){

$stm = $this->conn->prepare("Insert...")
$stm->bindValues(1,$this->getNome());

return $stm->execute;


}
}

class controller_music extends model{

public function update
$this->setNome($_POST['nome']);
$this->setId($_POST['id']);
return $this->save();
}

 

Aí que tá... NÃO posso usar PDO. Estou desenvolvendo este sistema como parte de um treinamento para iniciar um projeto na universidade. Questionei ao meu professor orientador quanto ao uso de PDO e ele me respondeu: "Ao invés de utilizar o PDO, vamos "implementar o nosso módulo de acesso ao BD" - esta é a idéia para vocês exercitarem ok?!".

Compartilhar este post


Link para o post
Compartilhar em outros sites

então usa implode nessa sua zebra ai kkkkkk....

 

acho q seria mais fácil =P

 

no lugar desse monte de else if =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

então usa implode nessa sua zebra ai kkkkkk....

 

acho q seria mais fácil =P

 

no lugar desse monte de else if =)

Obrigado pela dica... Não conhecia esse implode, vou implementar aqui mais tarde.

Mas o problema mesmo está em como eu faço os outros métodos. Não consigo pensar uma maneira de implementá-los principalmente no controller.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1.

o que está sendo feito no controller deveria ser responsabilidade do model

controllers/musicController.php

 

2.

ainda dentro do musicController.php você tem um output, o qual é responsabilidade da VIEW

        if ($result >= 1) {
           echo "<script>alert('Registro incluído com sucesso!');
               document.location='../view/index.php'</script>";
       } else {
           echo "<script>alert('Erro ao gravar registro!');
               history.back()</script>";
       }

 

 

3.

No model "models/music.php"

está usando funções de controlador.

 

 

4.

models/dataBase.php

está sendo tratado como model ??

 

 

5.

Na conexão as configurações são bastante limitadas.

Imagine situações onde é necessário usar mais de uma base de dados ou mesmo conexões diferentes.

Por isso também, no outro tópico onde você teve problema com a autenticação recomendei usar um connection handler.

    private function connection() {
       $this->host = 'localhost';
       $this->user = 'root';
       $this->pass = '12345';
       $this->dBase = 'collection';

       mysql_connect($this->host, $this->user, $this->pass) or die(mysql_error());
       mysql_select_db($this->dBase);
   }

 

 

há diversos outros pontos já mencionados e outros pormenores.

veja com calma o que já foi mencionado e procure consertar para entender melhor como proceder com as outras dúvidas

Compartilhar este post


Link para o post
Compartilhar em outros sites

1.

o que está sendo feito no controller deveria ser responsabilidade do model

controllers/musicController.php

 

2.

ainda dentro do musicController.php você tem um output, o qual é responsabilidade da VIEW

        if ($result >= 1) {
           echo "<script>alert('Registro incluído com sucesso!');
               document.location='../view/index.php'</script>";
       } else {
           echo "<script>alert('Erro ao gravar registro!');
               history.back()</script>";
       }

 

 

3.

No model "models/music.php"

está usando funções de controlador.

 

 

4.

models/dataBase.php

está sendo tratado como model ??

 

 

5.

Na conexão as configurações são bastante limitadas.

Imagine situações onde é necessário usar mais de uma base de dados ou mesmo conexões diferentes.

Por isso também, no outro tópico onde você teve problema com a autenticação recomendei usar um connection handler.

    private function connection() {
       $this->host = 'localhost';
       $this->user = 'root';
       $this->pass = '12345';
       $this->dBase = 'collection';

       mysql_connect($this->host, $this->user, $this->pass) or die(mysql_error());
       mysql_select_db($this->dBase);
   }

 

 

há diversos outros pontos já mencionados e outros pormenores.

veja com calma o que já foi mencionado e procure consertar para entender melhor como proceder com as outras dúvidas

 

Estou precisando estudar bem mais os conceitos então... porquê achei que o model cuidava da parte de banco de dados, como está sendo feito, e o controller enviava a requisição pro model. Quanto ao output dentro do controller, é só mesmo para testar se está funcionando, essa eu já sabia que estava no lugar errado! kkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que vou é começar tudo de novo e me basear neste artigo... Ele faz uso de PDO, mas vai assim mesmo.

 

Pensamento errado, artigo certo.

 

Rapaz, essa de "mas vai assim mesmo" é muito gambiarra. Você deve encontrar a solução que atende a sua necessidade. Se não é para utilizar PDO, não use. Utilize o exemplo conceitual do artigo acima, mas renda o SQL com o seu módulo - já que é isso que o seu professor quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Te falar, hein, a implementação desse artigo não é das melhores.

Ela fica meio "amarrada".

 

Para cada módulo você tem que criar um DataObject (classe 'Agenda' do exemplo), um DataAcessObject (AgendaDAO), um controller (AgendaController), algumas views, é muito dispendioso.

Imagine um sistema com uns 30 módulos o tamanho que vai ficar.

 

Te digo isso porque tenho um assim =], é meio antigo já, por isso ficou um monstrinho.

 

Dê uma olhada neste post:

:seta: http://forum.imasters.com.br/topic/451067-myframework/page__view__findpost__p__1784565

 

o que está sendo feito no controller deveria ser responsabilidade do model

controllers/musicController.php

Exemplo:

$this->cadastre->setAlb_id($_POST['alb_id']);
$this->cadastre->setArtist($_POST['artist']);
$this->cadastre->setTitle($_POST['title']);
$this->cadastre->setTrack($_POST['track']);

 

No model "models/music.php"

está usando funções de controlador.

hinom, pode especificar exatamente onde? Não consegui encontrar dando uma olhada meio rápida aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Exemplo:

$this->cadastre->setAlb_id($_POST['alb_id']);
$this->cadastre->setArtist($_POST['artist']);
$this->cadastre->setTitle($_POST['title']);
$this->cadastre->setTrack($_POST['track']);

 

 

Ok, aceito que isto deve estar no model, mas o que eu faço no controller então?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O controller é a camada mais "sem graça" da sua aplicação, ela deve no máximo receber os dados da requisição, fazer uma pré-filtragem GERAL nos dados, chamar o Model para que execute a lógica do negócio e passar esses dados para uma View.

 

Leia um pouco sobre isso:

http://mikebernat.com/blog/MVC_-_Fat_Models_and_Skinny_Controllers_

http://codebetter.com/iancooper/2008/12/03/the-fat-controller/

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiquei com uma duvida aqui...

qto mais a gente tenta aprende, mais o errado vem junto ;/

 

no model eu tenho o metodo que fazem o select

se eu precisar fazer um log em xml ou txt, eu iria instanciar a classe responsavel dentro do metodo da model? procede?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É ruim nesse caso por que se um dia você não quiser o log, você precisa alterar o código fonte da classe.

Pesquise sobre o padrão Observer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

me expressei errado

o log é do sistema, nao faz parte deste contexto

me referia sobre estatisticas :)

 

todos sendo metodos proprios da model?

-> select        // faz o select
-> insert.stats  // grava as stats de acesso, podendo ser direto na database, mas pode ser via xml

mesmo se optar pela criação de um xml, o metodo é da model e ele instancia a classe para trabalhar com o xml?

é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente, vou ser sincero... ta DIFÍCIL entender o que é pra fazer. Vamos por partes:

 

1)A lógica do que estou fazendo está certa?

2)Se na classe music eu retirar o "extends dataBase", o que eu faço pra substituir?

3)Se eu retirar do controller o trecho que o Henrique Barcelos citou e colocar na model, COMO e o que eu faço no controller?

 

Eu realmente aprecio a ajuda que vocês tem me dado, tenho aprendido alguns conceitos e descoberto algumas coisas novas, mas preciso de alguma coisa mais prática para REALMENTE entender o que fazer. Não consigo encontrar material sobre DAO e MVC sem PDO com exemplos bons...

 

Em off: O prazo que tenho para entregar o sistema funcionando não é curto, tenho um tempo relativamente bom (provável entrega na semana do dia 5 de março), mas preciso fazer ainda muita coisa, mas estou dependendo de entender BEM o que estou fazendo agora para aplicar nas outras funcionalidades. Só para complementar, ainda tenho que fazer a validação dos formulários usando AJAX (que ainda preciso estudar), fazer um CRUD para os álbuns e relacioná-los as suas respectivas músicas e um sistema de acesso restrito de acordo com o nível (que já tenho parte implementada, só preciso acrescentar a parte de validação com AJAX).

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.