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

Erro no atributo 'usado'

Bom dia.

Estou tendo o seguinte erro quando tento inserir ou alterar um produto:

Notice: Undefined index: usado in C:\wamp64\www\loja\class\ProdutoFactory.php on line 13

Isso acontece apenas se o campo 'Usado', no formulário, não estiver marcado.

Porém, mesmo com o erro, o produto é inserido no Banco quando adiciono e a coluna 'usado' recebe o valor 0, como esperado.

Quando altero o Usado no formulário também tenho o mesmo erro, mas novamente, a alteração é enviada para o Banco e o valor da coluna 'usado' é alterado, como esperado.

Já baixei o projeto da aula, comparei linha por linha e não consegui identificar o problema. Alguém poderia me ajudar?

Segue o meu código abaixo:

ProdutoFactory.php

class ProdutoFactory {

        private $classes_array = array("Produto", "LivroFisico", "Ebook");

        public function criaProduto($f_tipo_produto, $f_params) {

            $f_nome = $f_params['nome']; 
            $f_preco = $f_params['preco'];
            $f_descricao = $f_params['descricao'];
            $f_categoria = new Categoria();
            $f_usado = $f_params['usado'];

            if (in_array($f_tipo_produto, $this->classes_array)) {
                return new $f_tipo_produto($f_nome, $f_preco, $f_descricao, $f_categoria, $f_usado);
            }

            return new Produto($f_nome, $f_preco, $f_descricao, $f_categoria, $f_usado);

        }

    }

adiciona-produto.php

require_once("cabecalho.php");
    require_once("logica-usuario.php");

    verificaUsuario();

    $tipo_produto = $_POST["tipo_produto"];
    $categoria_id = $_POST["categoria_id"];

    $factory = new ProdutoFactory();
    $produto = $factory->criaProduto($tipo_produto, $_POST);

    $produto->atualizaBaseadoEm($_POST);
    $produto->getCategoria()->setId($categoria_id);

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

    $produto_dao = new ProdutoDAO($conexao);

    if ($produto_dao->insereProduto($produto)) : 
?>
        <p class="text-success">Produto <?= $produto->getNome() . ", " . $produto->getPreco(); ?> adicionado com sucesso!</p>
<?php 
    else : 
        $msgErro = mysqli_error($conexao) 
?>
        <p class="text-danger">Produto <?= $produto->getNome(); ?> não foi adicionado!</p>
        <p class="alert-danger"><?= $msgErro; ?></p>
<?php
    endif;
2 respostas
solução!

Oi Breno,

O problema está na sua classe ProdutoFactory, nessa linha:

$f_usado = $f_params['usado'];

Quando você não marca a checkbox indicando que o produto é usado, o browser não envia o parametro usado, e então dá erro nessa linha que tenta recuperar um parametro que não existe.

Para parar com esse erro, altere seu código para verificar se existe o parametro:

if (array_key_exists('usado', $f_params)) {
    $f_usado = "true";
} else {
    $f_usado = "false";
}

Bons estudos!

Bom dia, Rodrigo.

A sua sugestão funcionou!

Só p/ deixar claro, nas aulas e no projeto final do curso, essa condição 'if' está dentro do arquivo "adiciona-produto.php". Fiz de acordo com as aulas.

Agradeço pela atenção!