12
respostas

Inserindo valores de checkbox no banco de dados

Estes são os meus códigos, gostaria de saber como inserir dois ou mais valores selecionados nos checkbox's no bando de dados. Da forma que está, só estou conseguindo enviar um valor, mesmo que selecione os dois que no caso são html/css , javascript. Obrigado a quem ajudar.

html

<form class="coluna" action="sucesso-cadastro-projeto.php" method="post">

  <input type="text" name="nome" placeholder="nome" />
  <textarea name="descricao" id="" cols="30" rows="10" placeholder="Descrição"></textarea>
  <div>
  <label for="htmlcss">
  <input type="checkbox" name="tecnologias" id="htmlcss" value="html/css">
  html/css</label>
  <label for="javascript">
  <input type="checkbox" name="tecnologias" id="javascript" value="javascript">
  javascript</label>
  </div>

Pagina de envio de cadastro

<?php 

  require_once "cabecalho.php";
  require_once "conecta.php";


  verificaUsuario();

  $data = $_POST['data'];
  $nome = $_POST['nome'];
  $descricao = $_POST['descricao'];
  $tecnologias = $_POST['tecnologias'];

  cadastraProjeto($conexao, $data, $nome, $descricao, $tecnologias);
?>

 <div class="texto-centro margem-topo-50">
  <p class="sucesso">Projeto cadastrado com sucesso</p>
</div>
<?php require_once "rodape.php"; ?>

Função de cadastro

 function cadastraProjeto($conexao, $data, $nome, $descricao, $tecnologias) {

    $query = "insert into projetos (data, nome, descricao, tecnologias) values ('{$data}', '{$nome}', '{$descricao}', '{$tecnologias}')";
    return mysqli_query($conexao, $query);
  }
12 respostas

Francis, tente passar cada um dos checkboxes como índices de uma lista.

<input type="checkbox" name="tecnologias[0]" id="javascript" value="javascript">
<input type="checkbox" name="tecnologias[1]" id="html-css" value="html/css">

Claro, leia no código PHP como se fosse uma lista/array também.

Se você quiser passar diversos valores como string talvez o ideal seja um select multiple:

<select multiple name="tecnologias">
  <option value="html-css">HTML/CSS</option>
  <option value="js">JavaScript</option>
</select>

Olá Marco, obrigado por responder.

Então, eu tentei com o input da forma que você falou e deu este erro:

Notice: Array to string conversion in C:\xampp\htdocs\daLvz\interno\funcoes.php on line 57

sabe o que é?

Você recebeu um array no seu formulário mas ao fazer o insert no banco está utilizando uma string.

Agora esse é um problema diferente, pois você quer armazenar diversas informações em um único campo.

Seguindo a segunda sugestão (do select multiple) e presumindo que ele é representado por um array de strings, eu faria assim:

$tecnologias = implode(",", $_POST['tecnologias']);

Isso gera uma string separada por virgulas dos elementos selecionados, por exemplo "js,html-css".

Mas neste caso então eu teria que enviar com o select multiple? Não tem como fazer com checkbox?

Com checkbox ficaria um pouco mais feio na parte de backend. A lista de parâmetros teria que ser sempre ordenada do mesmo modo pra que você pudesse mapear. Algo como:

$tecs = $_POST['tecnologias'];
$tecsAsString = implode(",", $tecs);
/* armazenaria algo como "true,true,false,true" no banco */

Outra opção é fingir que são checkboxes: existe um select multiple com display:none e vários checkbox (nem precisam ser a tag input, só precisam ser elementos que pareção clicáveis e que podem ser selecionados). Quando o usuário clica no checkbox, um javascript reproduz a seleção no select multiple.

Aí no backend você consegue receber a lista de strings. Claro que é uma gambiarra. A outra opção seria passar parâmetros com nomes diferentes e mapear no backend.

$checkJs = $_POST['js'];
$checkHtmlCss = $_POST['html-css'];
/* etc... */

Ok, vou testar aqui

E aí, Francis, chegou a alguma solução boa pro seu caso?

Olá Marco, ontem não deu tempo de testar, vou fazer hoje e falo do resultado. Obrigado!

Eu tentei fazer com o seletc multiple,

  <select multiple name="tecnologias" id="tecnologias">
      <option value="html-css">HTML/CSS</option>
      <option value="js">JavaScript</option>
   </select>

só que ele não está selecionando várias opções só uma

Na verdade ta selecionando mais de um, mas precisa pressionar o control para selecionar mais de um. É assim mesmo?

É exatamente assim. Com Shift também funciona, exatamente do mesmo modo que você pode selecionar arquivos e pastas no navegador de arquivos do seu computador.