Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 4 da Aula 8 - DAO - Data Access Object

Olá, eu estou com um problema no sistema, criei todas as classes DAO, ProdutoDAO, CategoriaDAO e UsuarioDAO, e estou fazendo as mudanças no meu sistema, na pagina "remove-produto.php", eu tenho o seguinte código

<? 
    require_once "conecta.php";
    require_once "cabecalho.php"; 
    require_once "logica-usuario.php";

    $produtoDao = new ProdutoDAO($conexao);

    $produto = new Produto();

    $produto->setId($_POST['id']);
    $produtoDao->removeProduto($produto);

    $_SESSION['success'] = "Produto removido com sucesso";
    header("LOCATION: produto-lista.php");
    die();
?>

porém ele me retorna o seguinte erro:

Catchable fatal error: Argument 4 passed to Produto::__construct() must be an instance of Categoria, none given

acredito que seja devido, a classe Produto ter um objeto categoria no método construtor, mas como eu faço agora? Da o mesmo erro na pagina de alteração...

5 respostas
solução!

Oi Marco, tudo bem? Vejamos, no seu ProdutoDAO, no metodo remove, você pede um produto, certo? Tipo?

public function removeProduto(Produto p){ //... }

Se for este o caso, pra resolver isso você precisa fazer o seguinte, remova o $produto = new Produto();. Pegue o produto pelo produtoDAO como o metodo busca e atribua a uma variavel qualquer.

$produto = produtodao->busca($id);

Neste caso, o produtodao já deve trazer o produto sem dá erro de não ter a categoria. Ai depois você manda remover o produto.

produtodao->remove($produto);

Entende? Primeiro buscamos o produto e só então removemos. Outra forma seria remover a Categoria do construtor do produto, mas acredito que o instrutor já tenha feito a observação de que isso não faz sentido neste caso.

Espero ter ajudado, qualquer dúvida, por favor, pergunte-nos. Bons estudos.

Olá, segue meu novo código

require_once "conecta.php"; require_once "cabecalho.php"; require_once "logica-usuario.php";

$id = $_POST['id'];

$produtoDao = new ProdutoDAO($conexao);

$produto = $produtoDao->buscaProduto($id); $produtoDao->removeProduto($produto);

$_SESSION['success'] = "Produto removido com sucesso"; header("LOCATION: produto-lista.php"); die();

agora, ele está me retornando o seguinte erro:

Catchable fatal error: Argument 1 passed to ProdutoDAO::buscaProduto() must be an instance of Produto,

minha função remove produto está assim

function removeProduto(Produto $produto){ $query = "delete from produtos where id={$produto->getId()}"; return mysqli_query($this->conexao, $query); }

outra dúvida que tenho é: Esta variável id que recebe o $_POST['id'] ela não está sendo tratada em nenhum lugar, como por exemplo if(is_numeric($id)), para evitar "injections", o melhor lugar de fazer um tratamento desses, é dentro da removeProduto, ou dentro da buscaProduto?

Grato

Oi Marco, tudo bem? Seu erro não está relacionado à sua função removeProduto, mas sim a função busca produto. Em vez de receber um objeto produto, modifique para receber apenas o ID do produto.

No caso do tratamento, você pode colocar no buscaProduto, porque quase todas as operações com o banco passam por esse processo, busco o produto e depois removo, busco o produto e atualizo, então na busca pelo produto parece ser um bom lugar para a validação que quer fazer.

E ai, faz sentido? Espero ter ajudado.

Uma observação Marco, para cada dúvida, abra um novo tópico no forúm, fica mais fácil dos outros alunos com dúvidas semelhantes encontrarem os tópicos... entende?

Wanderson, se eu modificar para receber apenas o ID do produto, não seria "errado"? Por exemplo, todas as minhas classes de ProdutoDAO eu uso o seguinte

funtion nomeDaFuncao(Produto $produto)

se eu fazer

funtion nomeDaFuncao($id)

na hora de alterar eu não utilizaria $prudto->getId(), mas sim $id, correto? Eu tenho todas as minha classes de ProdutoDAO feitos como filhas da classe Produto, não tem problema manipular o atributo livremente?

Não há esse problema ao meu ver Marco, mas assim, quando você pede um objeto do tipo produto nos argumentos do metodo, você está forçando a quem usar aquele metodo a passar um objeto produto.

Depende muito do caso, você pede um produto, mas o que você vai fazer com esse produto? Só pegar o ID? Não há problemas em passar só o id. Mas caso você faça outras operações com o produto, ai sim, você precisa das outras coisas... É necessário avaliar o que você está usando.

Eu disse essa solução pra você porque é o caminho mais simples e fácil de resolver o problema. Note:

No construtor, você pede a categoria do produto (se não estou enganado), mas para você passar a categoria do produto, você precisa criar um objeto do tipo categoria, pra só assim o produto poder ser criado sem problemas e você poder excluir o produto. Percebe que são muitos passos pra se remover um produto? Tá muito complexo.

Existe um conceito de que devemos manter o código de forma simples. O mais simples nesse caso seria passar somente o ID, concorda?

Existem diversas formas de resolvermos um mesmo problema em desenvolvimento de software, cabe a nós desenvolvedores avaliar e escolher a mais "confortavel" (simples, fácil de entender e modificar e que resolva o problema de forma definitiva - ou pelo menos parte do problema).

Espero ter ajudado, bons estudos...