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

Erro ao salvar checkbox no banco de dados

boa noite, segui a instruções do vídeo e mesmo eu criando a coluna com tipo boolean, quando eu passo o valor de usado entre aspas "true"ou "false" eu recebo um erro dizendo que estes não são valores inteiros. A solução foi simples, retirei as aspas. E, ao contrário do que aconteceu no vídeo, true foi convertido pra 1 e false pra 0.

Ai quando tiro as "" funciona so true que é convertido para 1, mais o false da erro.

Produto bala não pode ser cadastrado: Incorrect integer value: 'false' for column 'usado' at row 1

adiciona-produto.php

<?php include './cabecalho.php'; ?>
<?php include './conexao.php'; ?>
<?php include './banco-produto.php'; ?>

<?php
$nome = $_POST["nome"];
$preco = $_POST["preco"];
$descricao = $_POST['descricao'];
$categoria = $_POST['categoria_id'];

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

if (inserirProdutos($conexao, $nome, $preco, $descricao, $categoria, $usado)) {
    ?>    
        <p class="text-success">produto <?= $nome ?>,<?= $preco ?> adicionado com sucesso</p>
    <?php
} else {
    $msg = mysqli_error($conexao);
    ?>
        <p class="text-danger">Produto <?= $nome ?> não pode ser cadastrado: <?= $msg ?></p>
<?php } ?>

<?php include './rodape.php'; ?>

produto-formulario.php

<?php include './cabecalho.php'; ?>
<?php include './conexao.php';?>
<?php include './banco-categoria.php';?>

<?php
 $categorias = listaCategoria($conexao);   
?>

<h1>Formulario</h1>


<form action="adiciona-produto.php" method="post">
    <table class="table">
        <tr class="text-left">
            <td>Nome:</td>
            <td><input type="text" class="form-control" name="nome" required="Preencher o nome"/></td>
        </tr>

        <tr class="text-left">
            <td>Preço:</td>
            <td><input type="number" class="form-control" name="preco" required="preencher o preço"/></td>
        </tr>

        <tr class="text-left">
            <td>Descrição:</td>
            <td><textarea class="form-control" name="descricao"></textarea></td>
        </tr>

        <tr class="text-left">
            <td>Categoria:</td>
            <td>
                <select name="categoria_id" class="form-control">
                    <?php foreach ($categorias as $categoria) {?>
                        <option value="<?= $categoria['id']; ?>"> <?= $categoria['nome']; ?></option> 
                    <?php } ?>
                </select>
            </td>
        </tr>

        <tr class="text-left">
            <td></td>
            <td><input type="checkbox" name="usado" value="true">Usado</td>
        </tr>

        <tr class="text-left">
            <td>
                <button class="btn bg-primary" type="submit">Enviar</button>
            </td>
        </tr>
    </table>
</form>

<?php include './rodape.php'; ?>

banco-produto

<?php

function listaProduto($conexao) {

    $produtos = [];
    $resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome "
            . "from produtos as p join categoria as c on c.id = p.categoria_id");
    while ($produto = mysqli_fetch_assoc($resultado)) {
        array_push($produtos, $produto);
    }
    return $produtos;
}

function inserirProdutos($conexao, $nome, $preco, $descricao, $categoria_id, $usado) {

    if (!empty($nome) && !empty($preco) && is_numeric($preco)) {
        $query = "insert into produtos(nome, preco, descricao, categoria_id, usado) values('{$nome}','{$preco}', '{$descricao}', '{$categoria_id}', '{$usado}')";
        $resultado = mysqli_query($conexao, $query);
        return $resultado;
    }
    return false;
}

function deletaProduto($conexao, $id) {

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

Oi Denis, tudo bem? Quando você tira as aspas onde, no if/else? Quando tira dá erro só no false?

Isso só no false

solução!

Denis, boa tarde.

A coluna "usado" no banco de dados está com qual tipo? boolean ou integer?

Dependendo, você pode tentar mudar a atribuição dele:

if(array_key_exists('usado', $_POST)){
    $usado = 1;
} else {
    $usado = 0;
}

E no seu inserir produto tirar o apóstrofo do {$usado}:

function inserirProdutos($conexao, $nome, $preco, $descricao, $categoria_id, $usado) {

    if (!empty($nome) && !empty($preco) && is_numeric($preco)) {
        $query = "insert into produtos(nome, preco, descricao, categoria_id, usado) values('{$nome}','{$preco}', '{$descricao}', '{$categoria_id}', {$usado})";
        $resultado = mysqli_query($conexao, $query);
        return $resultado;
    }
    return false;
}

Provavelmente funcionará.

Isso Denis, a solução do Ricardo funcionará, porém é muito estranho que a conversão do true funcione mas a do false não. Por curiosidade, que sistema operacional e versão do PHP você está usando?

Boa noite pessoal, descobri o erro, era as aspa simples que tinha que tirar, as aspa simples é usado somente em string, coloquem em todos por isso dava erro

'{$usado}'

Agora esta funcionando com

true e false  entre aspa igual do curso

Verdade Denis, isso nos passou despercebido! Que bom que encontrou o problema real então.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software