How to make multiple checkbox records in the database at once?

3

How do I make multiple records with checkbox ?

I need to make multiple records according to my tag in every% of% and include in the column checkbox the same id_item that comes from the variable ID in all records.

I'm trying this, it's just not working:

<form action="#" method="POST" enctype="multipart/form-data">
Flights on: <br/>
<input type="checkbox" name="categoria[]" value="1">segunda<br>
<input type="checkbox" name="categoria[]" value="2">Sunday<br>
<input type="checkbox" name="categoria[]" value="3">Monday<br>
<input type="checkbox" name="categoria[]" value="4">Tuesday <br>
<input type="checkbox" name="categoria[]" value="5">Wednesday<br>
<input type="checkbox" name="categoria[]" value="6">Thursday <br>
<input type="checkbox" name="categoria[]" value="7">Friday<br>
<input type="checkbox" name="categoria[]" value="8">Saturday <br>
<input type="submit" name="insert" value="submit">
</form>

  if(isset($_POST['insert']))
  {

    $checkBox = $_POST['categoria'];

                    for ($i=0; $i<sizeof($checkBox); $i++) {
                    $cadastrarItem = $DB->prepare("INSERT INTO teste (id_item, id_category) VALUES ($proximoID, '" . $checkBox[$i] . "')");
          }
            $cadastrarItem->execute();

                    if($cadastrarItem->rowCount() >= 0)
                    {
                        echo 'sucesso';
                    }
                    else
                    {
                        echo 'erro';
                    }

  }

/

/ ESSE CÓDIGO É PARA PEGAR O ID DO ITEM, POR EXEMPLO A VARIAVEL $proximoID VAI DAR UM NUMERO, EU PRECISO QUE ESSE NUMERO ESTEJA NOS MULTIPLOS REGISTRO E ALTERE APENAS O id DO $checkBox
      try {
      $sql = "SHOW TABLE STATUS LIKE 'teste' ";
      $stmt = $DB->prepare($sql);
      $stmt->execute();
      $resultado = $stmt->fetch();
      $proximoID = $resultado['Auto_increment'];  // a chave esta aqui
       } catch (Exception $ex) {
       echo $ex->getMessage();
      }

      echo $proximoID;

@edit

$checkBox = array_filter($_POST['categoria'], 'is_int');
// Segurança: apenas haverá números inteiros, dessa forma se houver: (1,2,3,biscoito,5,10,lasanha) irá ser: (1,2,3,5,10)

$sqlParcial = '';

for ($i=0; $i < count($checkBox); $i++) {
$sqlParcial .= '("'. $checkBox[$i] .'", (SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = "teste" AND table_schema = DATABASE()) -'. $i .'),';
}

$cadastrarItem = $DB->prepare("INSERT INTO teste (id_category, id_item) VALUES ". $sqlParcial."");
$cadastrarItem->execute();

if($cadastrarItem->rowCount() >= 0)
{
    echo 'sucesso';
}
  else
{
  echo 'erro';
}
    
asked by anonymous 12.02.2016 / 04:08

1 answer

4
  

The example will be done in MySQL, if you use (as it seems) the PDO will need to make some adaptations, I will add comments with equivalent functions, but I do not guarantee operation because I have never used PDO in practice.

There are several methods, I will list one of them:

<?
if(isset($_POST['insert'])){
$checkBox = array_filter($_POST['categoria'], 'ctype_digit');
// Segurança: apenas haverá números inteiros, dessa forma se houver: (1,2,3,biscoito,5,10,lasanha) irá ser: (1,2,3,5,10)

$sqlParcial = '';
// Remover o Warning

for ($i=0; $i < count($checkBox); $i++) {

$sqlParcial .= '("'. $checkBox[$i] .'", (SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = "teste" AND table_schema = DATABASE()) -'. $i .'),';
// O "- $i" era subtrair o AUTO_INCRMENT pelo o número da postagem, assim igualando com o número da primeira.
// O (SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'teste' AND table_schema = DATABASE()) irá pegar o AUTO_INCREMENT!
// O sqlParcial irá armazenar tudo um do lado do outro exemplo: $sqlParcial será (1, 0),(2, 0),(5, 0), EXEMPLO!

}


$sqlParcial =  trim($sqlParcial, ",");
// Irá remover a ultima virgula

# MySQLi:
if($mysqli->query('INSERT INTO teste (id_category, id_item) VALUES '. $sqlParcial)){
echo 'sucesso'; 
}

# PDO:
if($pdo->exec('INSERT INTO teste (id_category, id_item) VALUES '. $sqlParcial)){
echo 'sucesso'; 
}

// Faz o query adicionando o trecho do MySQL definido lá no inicio.
// Irá executar por exemplo: INSERT INTO teste (id_category, id_item) VALUES (1, 0),(2, 0),(5, 0) EXEMPLO!
}
?>

This fills both functions you said. With only this code will insert multiple data and get the id (AUTO_INCREMENT) in a single code.

I believe this is one of the best and most compact methods you can do. There is a problem of Race Condition, however due to the query act quickly I believe that there is no problem.

  

I tried to enter as many details as possible so that there is no doubt and understand the process.

Tests:

PHP:

<?php
$mysqli = new mysqli('localhost', 'root', 'senha');
$mysqli->select_db('db');

if(isset($_POST['insert'])){

$checkBox = array_filter($_POST['categoria'], 'ctype_digit');
// Segurança: apenas haverá números inteiros, dessa forma se houver: (1,2,3,biscoito,5,10,lasanha) irá ser: (1,2,3,5,10)

$sqlParcial = '';
// Remover o Warning

for($i=0; $i < count($checkBox); $i++){

$sqlParcial .= '("'. $checkBox[$i] .'", (SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = "teste" AND table_schema = DATABASE()) -'. $i .'),';
// O "- $i" era subtrair o AUTO_INCRMENT pelo o número da postagem, assim igualando com o número da primeira.
// O (SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'teste' AND table_schema = DATABASE()) irá pegar o AUTO_INCREMENT!
// O sqlParcial irá armazenar tudo um do lado do outro exemplo: $sqlParcial será (1, 0),(2, 0),(5, 0), EXEMPLO!

}


$sqlParcial =  trim($sqlParcial, ",");
// Irá remover a ultima virgula

# MySQLi:
if($mysqli->query('INSERT INTO teste (id_category, id_item) VALUES '. $sqlParcial)){
echo 'sucesso'; 
}

// Faz o query adicionando o trecho do MySQL definido lá no inicio.
// Irá executar por exemplo: INSERT INTO teste (id_category, id_item) VALUES (1, 0),(2, 0),(5, 0) EXEMPLO!
}
?>
<form action="#" method="POST" enctype="multipart/form-data">
Flights on: <br/>
<input type="checkbox" name="categoria[]" value="1">segunda<br>
<input type="checkbox" name="categoria[]" value="2">Sunday<br>
<input type="checkbox" name="categoria[]" value="3">Monday<br>
<input type="checkbox" name="categoria[]" value="4">Tuesday <br>
<input type="checkbox" name="categoria[]" value="5">Wednesday<br>
<input type="checkbox" name="categoria[]" value="6">Thursday <br>
<input type="checkbox" name="categoria[]" value="7">Friday<br>
<input type="checkbox" name="categoria[]" value="8">Saturday <br>
<input type="submit" name="insert" value="submit">
</form>

MySQL:

--
-- Tabela
--

CREATE TABLE 'teste' (
  'id' int(11) NOT NULL,
  'id_item' int(11) NOT NULL,
  'id_category' int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dados iniciais
--

INSERT INTO 'teste' ('id', 'id_item', 'id_category') VALUES
(20, 0, 0);

--
-- Index para id
--
ALTER TABLE 'teste'
  ADD PRIMARY KEY ('id');

--
-- AUTO_INCREMENT inicial
--
ALTER TABLE 'teste'
  MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;

Result:

Selecting:

second
Sunday Monday

Insert:

ID | id_item |  id_category   
21 | 21      | 1   
22 | 21      | 2  
23 | 21      | 3  
    
12.02.2016 / 07:27