Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 3 da Aula 4 - Encapsulamento

Douglas, dentro dos setters você precisa passar os parâmetros.

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

Faça isso nos outros e veja se continua com erro.

8 respostas

Funcionou Hugo, mas não está funcionando para alterar o produto agora. Erros:

Warning: Missing argument 1 for Produto::setId(), called in C:\xampp\htdocs\clickandappears\banco-produto.php on line 37 and defined in C:\xampp\htdocs\clickandappears\class\Produto.php on line 30

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\clickandappears\banco-produto.php on line 39

Banco produto:

<?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_atual = mysqli_fetch_assoc($resultado)) {
        $produto = new Produto;
        $categoria = new Categoria;
        $categoria->nome = $produto_atual['categoria_nome'];
        $produto->setId($produto_atual['id']);
        $produto->setNome($produto_atual['nome']);
        $produto->setPreco($produto_atual['preco']);
        $produto->setDescricao($produto_atual['descricao']);
        $produto->setCategoria($categoria->nome);
        $produto->setUsado($produto_atual['usado']);
        array_push($produtos, $produto);
    }
    return $produtos;

    }

    function insereProduto ($conexao, Produto $produto) {
        $nome=mysqli_real_escape_string($conexao, $produto->nome);
        $preco=mysqli_real_escape_string($conexao, $produto->GetPreco());
        $descricao=mysqli_real_escape_string($conexao, $produto->descricao);
        $query ="insert into produtos (nome, preco, descricao, categoria_id, usado)
        values ('{$produto->nome}', {$produto->getPreco()}, '{$produto->descricao}', '{$produto->categoria->id}', '{$produto->usado}')";
        return mysqli_query ($conexao, $query);

        }

    function buscaProduto($conexao, $produto) {
    $query = "select * from produtos where id = {$produto->setId()}";
    $resultado = mysqli_query($conexao, $query);
    return mysqli_fetch_assoc($resultado);
}

Produto class

<?php
    class Produto {
        private $id;
        private $nome;
        private $preco;
        private $descricao;
        private $categoria_id;
        private $usado;
        //get's e set's para preco
        public function valorComDesconto($valor= 0.1) {
            if($valor<=0.5 && $valor>0){
            $this->setPreco($this->preco -= $this->preco *$valor);

        }
            return $this->preco;
        }


        public function setPreco($preco) {
            if($preco>0) {
                $this->preco = $preco;
            }
        }


        public function getPreco(){
            return $this->preco;
        }
        //get's e set's para id
        public function setId($id){
            $this->id = $id;
        }
        public function getId(){
            return $this->id;
        }
        //get's e set's para nome
        public function setNome($nome){
            $this->nome = $nome;
        }
        public function getNome(){
            return $this->nome;
        }
        //get's e set's para descricao
        public function setDescricao($descricao){
            $this->descricao = $descricao;
        }
        public function getDescricao(){
            return $this->descricao;
        }
        //get's e set's para categoria_id
        public function setCategoria($categoria_id){
            $this->categoria_id = $categoria_id;
        }
        public function getCategoria(){
            return $this->categoria_id;
        }
        //get's e set's para usado
        public function setUsado($usado){
            $this->usado = $usado;
        }
        public function getUsado(){
            return $this->usado;
        }
    }    
 ?>

Produto Lista:

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


        verificaUsuario();
        ?>

    <table class='table table-hover table-bordered'>
        <thead>
        <tr>
            <th>Nome do produto</th>
            <th>Preço</th>
            <th>Preço com Desconto</th>
            <th>Descrição</th>
            <th>Categoria</th>
            <th>Usado</th>
            <th>Funções</th>
        </tr>
        </thead>
        <tbody>
    <?php    
            $produtos = listaProdutos($conexao);
            foreach ($produtos as $produto) :
            ?>    
            <tr>
                <td><?=$produto->getNome()?></td>
                <td>R$ <?=$produto->getPreco()?></td>
                <td>R$ <?=$produto->valorComDesconto(0.5)?></td>
                <td><?= substr($produto->getDescricao(), 0, 20)?></td>
                <td><?=$produto->getCategoria()?></td>

                <?php
                $usado = $produto->getUsado() ? 'Sim' : "Não";
                ?>
                <td><?=$usado?></td>


                <td>
                    <form action="remove-produto.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-danger">Remover</button>
                    </form>

                    <form action="produto-altera-formulario.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-primary">Editar</button>
                    </form>

                </td>    
            </tr>
        </tbody>
    <?php 
    endforeach
    ?>

</table>
<?php require_once ("rodape.php")?>

Produto formulario alterar:

<?php 
    require_once ("cabecalho.php");
    require_once ("banco-produto.php");
    require_once ("banco-categoria.php");
    require_once ("logica-usuario.php");
    require_once("class/Produto.php");
    require_once("class/Categoria.php");
    $produto = new Produto();


        verificaUsuario();
    $produto->setId($_POST['id']);
    $produto = buscaProduto($conexao, $produto);
    $categorias = listaCategorias($conexao); 
    ?>

            <h1>Alterar produtos</h1>
            <form action="altera-produto.php" method="post">

                <table class = "table">

                    <tr>
                        <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    </tr>

                    <?php include ('produto-formulario-padrao.php') ?>

                    <tr>
                        <td>
                        <input class = "btn btn-primary" type = "submit" value = "Alterar">
                        </td>

                    </tr>    

                </table>

    </form>


<?php require_once ("rodape.php")?>

Formulario padrão:

<tr>
                        <td>Nome:</td>
                        <td> <input class = "form-control" type = "text" name= "nome" value="<?=$produto->nome?>"><br/> </td>
                    </tr>

                    <tr>
                        <td>Preço:</td> 
                        <td> <input class = "form-control" type = "number" name = "preco" value="<?=$produto->preco?>"><br/> </td>
                    </tr>

                    <tr>
                        <tr>
                        <td>Descrição:</td> 
                        <td> <textarea class='form-control' name="descricao" ><?=$produto->descricao?></textarea> </td>
                    </tr>

                    <?php
                    $usado = $produto->usado ? "checked='checked'" : "";
                    ?>
                    <tr>
                        <td></td>
                        <td><input type="checkbox" name="usado" <?=$usado?> value="true"> Usado
                    </tr>


                    <tr>
                        <td>Categoria:</td>
                            <td>
                                <select name="categoria_id" class="form-control">
                                    <?php foreach($categorias as $categoria) : ?>
                                        <option 
                                        value="<?=$categoria->id?>"> 
                                        <?=$categoria->nome?></br>
                                        </option>

                                    <?php endforeach ?>
                                </select>
                            </td>
</tr>
solução

Douglas, na função busca produto você está tentando setar o Id, quando você deveria pegar ele.

Troque o $produto->setId() por $produto->getId() e provavelmente os dois erros irão acabar.

Valeu Hugo, os erros sumiram. Mas infelizmente o formulário também! D:

O que aconteceu? Qualquer coisa só postar aqui.

Ele não está aparecendo o formulário de alterar produto. Aparece só o H1, veja: http://pasteboard.co/1GIzEWkj.png .

Produto altera formulário

<?php 
    require_once ("cabecalho.php");
    require_once ("banco-produto.php");
    require_once ("banco-categoria.php");
    require_once ("logica-usuario.php");
    require_once("class/Produto.php");
    require_once("class/Categoria.php");
    $produto = new Produto();
    $categoria = new Categoria();

        verificaUsuario();
    $produto->setId($_POST['id']);
    $produto = buscaProduto($conexao, $produto);
    $categoria = listaCategorias($conexao); 
    ?>

            <h1>Alterar produtos</h1>
            <form action="altera-produto.php" method="post">

                <table class = "table">

                    <tr>
                        <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    </tr>

                    <?php include ('produto-formulario-padrao.php') ?>

                    <tr>
                        <td>
                        <input class = "btn btn-primary" type = "submit" value = "Alterar">
                        </td>

                    </tr>    

                </table>

            </form>


<?php require_once ("rodape.php")?>

Formulario produto padrão

<tr>
                        <td>Nome:</td>
                        <td> <input class = "form-control" type = "text" name= "nome" value="<?=$produto->getNome()?>"><br/> </td>
                    </tr>

                    <tr>
                        <td>Preço:</td> 
                        <td> <input class = "form-control" type = "number" name = "preco" value="<?=$produto->getPreco()?>"><br/> </td>
                    </tr>

                    <tr>
                        <tr>
                        <td>Descrição:</td> 
                        <td> <textarea class='form-control' name="descricao" ><?=$produto->getDescricao()?></textarea> </td>
                    </tr>

                    <?php
                    $usado = $produto->getUsado() ? "checked='checked'" : "";
                    ?>
                    <tr>
                        <td></td>
                        <td><input type="checkbox" name="usado" <?=$usado?> value="true"> Usado
                    </tr>


                    <tr>
                        <td>Categoria:</td>
                            <td>
                                <select name="categoria_id" class="form-control">
                                    <?php foreach($categoria as $categoria) : ?>
                                        <option 
                                        value="<?=$categoria->id?>"> 
                                        <?=$categoria->nome?></br>
                                        </option>

                                    <?php endforeach ?>
                                </select>
                            </td>
</tr>

Consegui descobrir, minha função do buscaProduto() estava retornando uma array, então faltava eu converte-la em objeto.

e como você converteu o retorno da função para objeto?

E aí pessoal estou com dúvida neste tópico, aparece o seguinte erro: Não está aparecendo o nome, descrição, categoria e usado.

Segue códigos: Produto.php

<?php
    class Produto {
        private $id;
        private $nome;
        private $preco;
        private $descricao;
        private $categoria_id;
        private $usado;
        //get's e set's para preco
        public function valorComDesconto($valor= 0.1) {
            if($valor<=0.5 && $valor>0){
            $this->setPreco($this->preco -= $this->preco *$valor);

        }
            return $this->preco;
        }


        public function setPreco($preco) {
            if($preco>0) {
                $this->preco = $preco;
            }
        }


        public function getPreco(){
            return $this->preco;
        }
        //get's e set's para id
        public function setId(){
            $this->id = $id;
        }
        public function getId(){
            return $this->id;
        }
        //get's e set's para nome
        public function setNome(){
            $this->nome = $nome;
        }
        public function getNome(){
            return $this->nome;
        }
        //get's e set's para descricao
        public function setDescricao(){
            $this->descricao = $descricao;
        }
        public function getDescricao(){
            return $this->descricao;
        }
        //get's e set's para categoria_id
        public function setCategoria(){
            $this->categoria_id = $categoria_id;
        }
        public function getCategoria(){
            return $this->categoria_id;
        }
        //get's e set's para usado
        public function setUsado(){
            $this->usado = $usado;
        }
        public function getUsado(){
            return $this->usado;
        }
    }    
 ?>

Banco Produto

<?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_atual = mysqli_fetch_assoc($resultado)) {
        $produto = new Produto;
        $categoria = new Categoria;
        $categoria->nome = $produto_atual['categoria_nome'];
        $produto->setId($produto_atual['id']);
        $produto->setNome($produto_atual['nome']);
        $produto->setPreco($produto_atual['preco']);
        $produto->setDescricao($produto_atual['descricao']);
        $produto->setCategoria($categoria);
        $produto->setUsado($produto_atual['usado']);
        array_push($produtos, $produto);
    }
    return $produtos;

    }

    function insereProduto ($conexao, Produto $produto) {
        $nome=mysqli_real_escape_string($conexao, $produto->nome);
        $preco=mysqli_real_escape_string($conexao, $produto->GetPreco());
        $descricao=mysqli_real_escape_string($conexao, $produto->descricao);
        $query ="insert into produtos (nome, preco, descricao, categoria_id, usado)
        values ('{$produto->nome}', {$produto->getPreco()}, '{$produto->descricao}', '{$produto->categoria->id}', '{$produto->usado}')";
        return mysqli_query ($conexao, $query);

        }

    function buscaProduto($conexao, $produto) {
    $query = "select * from produtos where id = {$produto->setId()}";
    $resultado = mysqli_query($conexao, $query);
    return mysqli_fetch_assoc($resultado);
}

Produto lista:

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


        verificaUsuario();
        ?>

    <table class='table table-hover table-bordered'>
        <thead>
        <tr>
            <th>Nome do produto</th>
            <th>Preço</th>
            <th>Preço com Desconto</th>
            <th>Descrição</th>
            <th>Categoria</th>
            <th>Usado</th>
            <th>Funções</th>
        </tr>
        </thead>
        <tbody>
    <?php    
            $produtos = listaProdutos($conexao);
            foreach ($produtos as $produto) :
            ?>    
            <tr>
                <td><?=$produto->getNome()?></td>
                <td>R$ <?=$produto->getPreco()?></td>
                <td>R$ <?=$produto->valorComDesconto(0.5)?></td>
                <td><?= substr($produto->getDescricao(), 0, 20)?></td>
                <td><?=$produto->getCategoria()?></td>

                <?php
                $usado = $produto->getUsado() ? 'Sim' : "Não";
                ?>
                <td><?=$usado?></td>


                <td>
                    <form action="remove-produto.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-danger">Remover</button>
                    </form>

                    <form action="produto-altera-formulario.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-primary">Editar</button>
                    </form>

                </td>    
            </tr>
        </tbody>
    <?php 
    endforeach
    ?>

</table>
<?php require_once ("rodape.php")?>

Alguém sabe me explicar o que está acontecendo?