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

produto-adiciona e produto-altera não estão funcionando

Sim, eu já vi o tópico que tem nisso, não é esse meu problema, conferi meus getters e setters 300 vezes já :/.

Esse é o erro que aparece no terminal:

[::1]:53304 [500]: /adiciona-produto.php - Uncaught Error: Call to a member function getId() on null in /home/analu/Documents/loja_php_Alura/banco-produto.php:8
Stack trace:
#0 /home/analu/Documents/loja_php_Alura/adiciona-produto.php(31): insereProduto(Object(mysqli), Object(Produto))
#1 {main}
  thrown in /home/analu/Documents/loja_php_Alura/banco-produto.php on line 8

Esse é o resultado do var_dump, quando eu faço no adiciona-produto:

object(Produto)#3 (7) { ["id":"Produto":private]=> NULL ["nome":"Produto":private]=> string(9) "Chocolate" ["preco":"Produto":private]=> string(2) "50" ["descricao":"Produto":private]=> string(20) "Graaaaande chocolate" ["categoria":"Produto":private]=> NULL ["usado":"Produto":private]=> string(5) "false" ["getCategoria"]=> object(Categoria)#2 (2) { ["id":"Categoria":private]=> string(1) "4" ["nome":"Categoria":private]=> NULL } }

E esse é o código do adiciona-produto: https://github.com/analubarreto/loja_php_Alura/blob/master/adiciona-produto.php

E o código do banco-produto: https://github.com/analubarreto/loja_php_Alura/blob/master/banco-produto.php

Já no altera-produto...

Esse é o erro do terminal:

[::1]:53342 [500]: /produto-altera-formulario.php?id= - Uncaught Error: Call to a member function isUsado() on null in /home/analu/Documents/loja_php_Alura/produto-altera-formulario.php:11
Stack trace:
#0 {main}
  thrown in /home/analu/Documents/loja_php_Alura/produto-altera-formulario.php on line 11

E o código do produto-altera-formulário, e do produto-altera: https://github.com/analubarreto/loja_php_Alura/blob/master/produto-altera-formulario.php

https://github.com/analubarreto/loja_php_Alura/blob/master/produto-altera.php

E o restante do código: https://github.com/analubarreto/loja_php_Alura

Ps:. Não tinha espaço pra colocar todos os códigos no comentário... hehehe

2 respostas
solução!

Oi Ana, tudo bom? =)

Seguinte, o dump do Produto mostra pra gente que a Categoria está vazia:

["categoria":"Produto":private]=> NULL

E, se a gente der uma olhada no adiciona-produto.php:

$produto = new Produto();
$produto->setNome($_POST["nome"]);
$produto->setPreco($_POST["preco"]);
$produto->setDescricao($_POST["descricao"]); // Enviando a descrição através do corpo
$produto->setCategoria($categoria->setNome($categoria));

A gente ta passando pro setCategoria, o retorno do setNome da classe Categoria:

$produto->setCategoria($categoria->setNome($categoria));

Porém, olhando o método setNome da classe Categoria:

public function setNome($nome) {
        $this->nome = $nome;
    }

Da pra ver que o método não retorna nada.

Então, o que está acontecendo é que estamos definindo o nome da categoria mas não estamos devolvendo ela.

Uma ótima solução é apenas retornar a categoria após a definição do atributo:

public function setNome($nome) {
        $this->nome = $nome;
        return $this;    
    }

Assim, quando você chamar o setNome dentro do setCategoria, estaremos passando a referência =)

Essa abordagem a gente chama de fluent setter, que tem uma cara bem parecida com um padrão de projeto chamado builder e você pode fazer isso em qualquer setter =)

O problema no altera formulário tem a mesma origem.

Abraço

Obrigada, André!