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

Erro na categoria ao adicionar ou alterar um produto após implementação dos Setters e Getters

Após a implementação eu recebo este erro: Fatal error: Uncaught Error: Call to a member function getId() on string in /var/www/html/php/banco-produto.php:27 Stack trace: #0 /var/www/html/php/adiciona-produto.php(24): insereProduto(Object(mysqli), Object(Produto)) #1 {main} thrown in /var/www/html/php/banco-produto.php on line 27

<?php
class Categoria{
    private $id;
    private $nome;

    function setId($valor){
        $this -> id = $valor;
    }
    function setNome($valor){
        $this -> nome = $valor;
    }
    function getId(){
        return $this -> id;
    }
    function getNome(){
        return $this -> nome;
    }
}
?>

O Arquivo citado esta da seguinte forma

<?php
require_once("conecta.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

function listaProdutos($conexao) {
    $produtos = array();
    $resultado = mysqli_query($conexao, "select p.*,c.nome as categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id");
    while($produto_array = mysqli_fetch_assoc($resultado)) {
        $produto = new Produto();
        $categoria = new Categoria();
        $categoria -> setNome($produto_array['categoria_nome']);
        $categoria -> setId($produto_array['categoria_id']);

        $produto -> setNome($produto_array['nome']);
        $produto -> setId($produto_array['id']);
        $produto -> setPreco($produto_array['preco']);
        $produto -> setDescricao($produto_array['descricao']);
        $produto -> setCategoria($categoria);
        array_push($produtos, $produto);
    }
    return $produtos;
}

function insereProduto($conexao, Produto $produto) {

    $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto ->getNome()}', {$produto ->getPreco()}, '{$produto -> getDescricao()}', {$produto -> getCategoria() -> getId()}, {$produto -> getUsado()})";
    return mysqli_query($conexao, $query);
}
function alteraProduto($conexao,Produto $produto) {
    $query = "update produtos set nome = '{$produto -> getNome()}', preco = {$produto -> getPreco()}, descricao = '{$produto -> getDescricao()}', categoria_id= {$produto -> getCategoria() -> getId()}, usado = {$produto -> getUsado()} where id = '{$produto -> getId()}'";
    return mysqli_query($conexao, $query);
}


function buscaProduto($conexao, $id) {
    $query = "select * from produtos where id = {$id}";
    $resultado = mysqli_query($conexao, $query);
    $produto_buscado = mysqli_fetch_assoc($resultado);
    $produto = new Produto();

    $categoria = new Categoria();
    $categoria-> setId($produto_buscado['categoria_id']);

    $produto-> setId($produto_buscado['id']);
    $produto-> setNome($produto_buscado['nome']);
    $produto-> setDescricao($produto_buscado['descricao']);
    $produto->setCategoria($categoria);
    $produto->setPreco($produto_buscado['preco']);
    $produto->setUsado($produto_buscado['usado']);

    return $produto;
}

function removeProduto($conexao, $id) {
    $query = "delete from produtos where id = {$id}";
    return mysqli_query($conexao, $query);
}

Já o adiciona-produto-formulario.php Esta desta forma:

<?php 
require_once("class/Produto.php");
require_once("class/Categoria.php");
require_once("logica-usuario.php");
verificaUsuario();                
require_once("banco-produto.php"); 

$produto = new Produto();
$categoria = new Categoria();
$categoria -> setId($_POST['categoria_id']);
$produto -> setNome($_POST['nome']);
$produto -> setPreco($_POST['preco']);
$produto -> setDescricao($_POST['descricao']);
$produto -> setCategoria($categoria);



if(array_key_exists('usado', $_POST)) {
    $produto -> setUsado("true");
} else {
    $produto -> setUsado("false");
}

if(insereProduto($conexao, $produto)) { 
    session_start();
    $_SESSION['produto'] = "Produto " . $produto -> getNome() . " Foi adicionado com sucesso !!";
    header("Location: produto-formulario.php");
     var_dump($_SESSION['produto']);
     } else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto -> getNome() ?> não foi adicionado: <?= $msg?></p>
<?php
}
?>
<?php require_once("rodape.php"); ?>

Este é o formulario de inclusão de produtos e em seguida o formulario base

/*produto-formulario.php */
<?php 
    session_start();
    require_once("logica-usuario.php");
    verificaUsuario();
    require_once("cabecalho.php"); 
    require_once("banco-categoria.php");
    require_once("class/Produto.php");

    $usado = "";
    $categoria = new Categoria();
    $categoria -> setId(1);

    $produto = new Produto();
    $produto->setCategoria($categoria);

    $categorias = listaCategorias($conexao);

?>    
    <?php if(isset($_SESSION['produto'])){?>

    <p class='alert-success'><?= $_SESSION['produto']?>

    <?php    } ?>
    <?php unset($_SESSION['produto']);?> 
    <h1>Formulário de produto</h1>
    <form action="adiciona-produto.php" method="post">
        <table class="table">
            <?php require_once("produto-formulario-base.php");?>

            <tr>
                <td>
                    <button class="btn btn-primary" type="submit">Cadastrar</button>
                </td>
            </tr>
        </table>
    </form>
<?php require_once("rodape.php"); ?>    


/* produto-formulario-base.php */

<tr>
    <td>Nome</td>
    <td> <input class="form-control" type="text" name="nome" value="<?=$produto -> getNome()?>"></td>
</tr>
<tr>
    <td>Preço</td>
    <td><input  class="form-control" type="number" name="preco" value="<?=$produto -> getPreco()?>"></td>
</tr>
<tr>
    <td>Descrição</td>
    <td><textarea class="form-control" name="descricao"><?=$produto -> getDescricao() ?></textarea></td>
</tr>
<tr>
    <td></td>
    <td><input type="checkbox" name="usado" <?=$produto -> getUsado()?> value="true"> Usado
</tr>
<tr>
    <td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
            <?php
            foreach($categorias as $categoria) : 
                $essaEhACategoria = $produto-> getCategoria() ->  getId() == $categoria->getId();
                $selecao = $essaEhACategoria ? "selected='selected'" : "";
            ?>
                <option value="<?=$categoria-> getId()?>" <?=$selecao?>>
                    <?=$categoria-> getNome()?>
                </option>
            <?php endforeach ?>
        </select>
    </td>
</tr>

Para alterar um produto da o mesmo problema, mas se esse for resolvido acho que consigo resolver o outro ... alguém pode me ajudar ?

5 respostas

Olá Nicolas, posta o código da sua classe produto

Opa, desculpa a demora ...

<?php
class Produto{

    private $id;
    private $nome;
    private $preco;
    private $descricao;
    private $categoria;
    private $usado ;

    function precoComDesconto($valor = 0.1){
        if($valor > 0 && $valor < 0.5){

        return $this -> preco -= $this -> preco * $valor;

        }else{
            return 'Produto sem desconto';
        }
    }

    function setId($valor){
        $this -> id = $valor;
    }
    function setNome($valor){
        $this -> nome = $valor;
    }
    function setPreco($valor){
        $this -> preco = $valor;
    }
    function setDescricao($valor){
        $this -> descricao = $valor;
    }
    function setCategoria($valor){
        $this -> categoria = $valor;
    }
    function setUsado($valor){
        $this -> categoria = $valor;
    }


    function getId(){
        return $this -> id;
    }
    function getPreco(){
        return $this -> preco;
    }
    function getNome(){
        return $this -> nome;
    }
    function getDescricao(){
        return $this -> descricao;
    }
    function getCategoria(){
        return $this -> categoria;
    }
    function getUsado(){
        return $this -> usado;
    }


}

?>

Pelo que eu estou vendo, o problema é de casting, o que causa o erro na função de insere produto é isto:

$produto -> getCategoria() -> getId()

Isso acontece porque o conteúdo retornado por getCategoria está sendo tratado como uma string. O conteúdo é uma classe.

Para resolver o problema, tem que ajustar a classe do produto, e dizer, na hora de inserir a classe, que o conteúdo recebido é do tipo Categoria.

Tente fazer o seguinte ajuste na classe Produto

<?php
class Produto{

    private $id;
    private $nome;
    private $preco;
    private $descricao;
    private $categoria;
    private $usado ;

    function precoComDesconto($valor = 0.1){
        if($valor > 0 && $valor < 0.5){

        return $this -> preco -= $this -> preco * $valor;

        }else{
            return 'Produto sem desconto';
        }
    }

    function setId($valor){
        $this -> id = $valor;
    }
    function setNome($valor){
        $this -> nome = $valor;
    }
    function setPreco($valor){
        $this -> preco = $valor;
    }
    function setDescricao($valor){
        $this -> descricao = $valor;
    }
    function setCategoria($valor){
        $this -> categoria = Categoria $valor;
    }
    function setUsado($valor){
        $this -> categoria = $valor;
    }


    function getId(){
        return $this -> id;
    }
    function getPreco(){
        return $this -> preco;
    }
    function getNome(){
        return $this -> nome;
    }
    function getDescricao(){
        return $this -> descricao;
    }
    function getCategoria(){
        return $this -> categoria;
    }
    function getUsado(){
        return $this -> usado;
    }


}

?>

Fiz porém acontece outro erro agora,

Parse error: syntax error, unexpected '$valor' (T_VARIABLE) in /var/www/html/php/class/Produto.php on line 34

Voltei agora para concluir este curso ...

solução!

Pela linha do erro, foi na hora de definir a categoria. Tenta o seguinte ajuste na classe de produtos:

 function setCategoria(Categoria $valor){
        $this -> categoria =  $valor;
    }