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

Dúvida no Ex. 3 da Aula 9 - Lidando com Selects e Checkboxes

Olá galera,

Estou usando o checkbox e consigo cadastrar tanto um produto usado como novo (checkbox marcado e checkbox desmarcado).

No banco de dados também a coluna de usando está se comportando bem, quando não marco o checkbox lá fica 0 e quando marco fica 1.

O problema é o seguinte, quando eu não marco o checkbox ou seja assumo que o produto é novo e o valor da coluna no banco de dados fica 0, aparece a seguinte mensagem:

"Notice: Undefined index: usado in /opt/lampp/htdocs/loja/adiciona-produto.php on line 11

Produto: Teste 5, Valor: R$ 1 adicionado com sucesso!"

Mesmo adicionando no banco normalmente ele me apresenta essa mensagem de "Notice: Undefined index". Já tentei resolver sozinho mas a mensagem sempre aparece quando eu não marco o checkbox.

Segue os códigos:

adiciona-produto.php:

<?php

    include("cabecalho.php");
    include("conecta.php");
    include("banco-produto.php");

    $nome = $_POST["nome"];
    $preco = $_POST["preco"];
    $descricao = $_POST["descricao"];
    $categoria_id = $_POST["categoria_id"];
    $usado = $_POST['usado'];

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

    if(insereProduto($conexao, $nome, $preco, $descricao, $categoria_id, $usado)) {
?>
        <p class="alert-success">Produto: <?= $nome ?>, Valor: R$ <?= $preco ?> adicionado com sucesso!</p>
<?php
    } else {
        $msg = mysqli_error($conexao);
?>
        <p class="alert-danger">O produto <?= $nome ?> não foi adicionado:<br /> <?= $msg ?></p>
<?php
    }

    include("rodape.php");
?>

produto-formulario.php:

<?php
    include("cabecalho.php");
    include("conecta.php");
    include("banco-categoria.php");

    $categorias = listaCategorias($conexao);
?>

        <h1>Cadastro de Produtos</h1>

        <form action="adiciona-produto.php" method="post">
            <table class="table">
                <tr>
                    <td>Nome</td>
                    <td><input class="form-control" type="text" name="nome" /></td>
                </tr>
                <tr>
                    <td>Preço</td>
                    <td><input class="form-control" type="number" name="preco" /></td>
                </tr>
                <tr>
                    <td>Descrição</td>
                    <td><textarea class="form-control" name="descricao"></textarea></td>
                </tr>
                <tr>
                    <td>Categoria</td>
                    <td>
                        <select name="categoria_id" class="form-control">
                            <?php foreach($categorias as $categoria) : ?>
                                <option value="<?=$categoria['id']?>"><?=$categoria['nome']?></option>
                            <?php endforeach ?>
                        </select>
                    </td>
                </tr>
                <tr>
                <td></td>
                <td><input type="checkbox" name="usado" value="true" /> Usado</td>
            </tr>
                <tr>
                    <td><input class="btn btn-primary" type="submit" value="Cadastrar" /></td>
                </tr>
            </table>
        </form>

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

banco-produto.php:

<?php

    //listagem de Produtos do Banco
    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 p.categoria_id = c.id");

        while($produto = mysqli_fetch_assoc($resultado)) {
          array_push($produtos, $produto);
        }
       return $produtos;
    }

    //Inserindo Produtos no banco    
    function insereProduto($conexao, $nome, $preco, $descricao, $categoria_id, $usado) {
        $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$nome}', {$preco}, '{$descricao}', {$categoria_id}, {$usado})";
        $result = mysqli_query($conexao, $query);        
       return $result;
    }

    //Removendo Produtos do Banco
    function removeProduto($conexao, $id) {
       $query = "delete from produtos where id = {$id}";
       $result = mysqli_query($conexao, $query);
       return $result;
    }
5 respostas
solução!

Olá,

Esse erro se refere ao índice usado em $_POST['usado']; porque você tenta atribuir o seu valor (que é nulo) à variavel $usado antes de fazer a verificação.

Em seguida você faz a verificação e atribui valores à variável $usado: if(array_key_exists('usado', $_POST)) {

Portanto, acho que você não precisa declarar lá em cima, que vai levantar o erro sempre que o produto não for usado, deixando a atribuição de valores acontecer apenas depois dessa verificação.

Olá Skywalker,

Obrigado pela ajuda. Comentei a linha onde atribuía o valor a variável $usado e depois disso está funcionado normalmente, sem apresentar o erro. Ficou assim:

$nome = $_POST["nome"];
    $preco = $_POST["preco"];
    $descricao = $_POST["descricao"];
    $categoria_id = $_POST["categoria_id"];
    #$usado = $_POST['usado'];

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

Mas confesso que ainda não entendi bem. Você fala que estava atribuindo um valor nulo antes de fazer a verificação, mas o valor da mesmo não era "true" onde foi definido no arquivo produto-formulario.php?

<td><input type="checkbox" name="usado" value="true" /> Usado</td>

Tharles, o campo value do checkbox diz o que será passado no post. Nesse caso, queremos "true", mas poderia ser qualquer outra coisa, o que define se a caixa foi ou não marcada é o atributo checked. Quando você faz o submit, se o checkbox não estiver selecionado(checked) ele não vai enviar nada no post. Acho que eu não deixei muito claro quando disse nulo, o que acontece é que o índice 'usado' só estara presente no $_POST quando o checkbox for selecionado.

Por isso que na verificação basta ver se existe um índice 'usado' no post, pois se houver o seu valor será "true", como foi definido no campo value,.

Obrigado pelo esclarecimento Skywalker, agora sim entendi!