Dynamic input (JS) error passed to SQL by PHP

Asked

Viewed 54 times

0

I have the code below referring to the link Add or Remove Inputs with JS

function calcula(){
   
   var total = 0;
   $("span[id^=linha]:visible").each(function(){
      
      var val_unit = parseFloat($(".class_unit input", this).val().replace(",", "."));
      var qnt = $(".class_quant input", this).val();
      var sub_total = val_unit * qnt;

      if(!isNaN(sub_total)) $(".class_total input", this).val(sub_total.toFixed(2).replace(".", ","));
      
      total += parseFloat($("input[id^=total]", this).val().replace(",", "."));

   });

   if(!isNaN(total)) $("#total input.value_total").val(total.toFixed(2).replace(".", ","));
   
}


//Total máximo de campos que você permitirá criar em seu site:
var totalCampos = 10;

//Não altere os valores abaixo, pois são variáveis controle;
var iLoop = 1;
var iCount = 0;
var linhaAtual;


function AddCampos() {
   var hidden1 = document.getElementById("hidden1");
   var hidden2 = document.getElementById("hidden2");

   //Executar apenas se houver possibilidade de inserção de novos campos:
   if (iCount < totalCampos) {

      //Limpar hidden1, para atualizar a lista dos campos que ainda estão vazios:
      hidden2.value = "";

      //Atualizando a lista dos campos que estão ocultos.
      //Essa lista ficará armazenada temporiariamente em hidden2;
      for (iLoop = 1; iLoop <= totalCampos; iLoop++) {
         if (document.getElementById("linha"+iLoop).style.display == "none") {
            if (hidden2.value == "") {
               hidden2.value = "linha"+iLoop;
            }else{
               hidden2.value += ",linha"+iLoop;
            }
         }
      }
      //Quebrando a lista que foi armazenada em hidden2 em array:

      linhasOcultas = hidden2.value.split(",");


      if (linhasOcultas.length > 0) {
         //Tornar visível o primeiro elemento de linhasOcultas:
         document.getElementById(linhasOcultas[0]).style.display = "block"; iCount++;
      
         //Acrescentando o índice zero a hidden1:
         if (hidden1.value == "") {
            hidden1.value = linhasOcultas[0];
         }else{
            hidden1.value += ","+linhasOcultas[0];
         }
      
         /*Retirar a opção acima da lista de itens ocultos: <-------- OPCIONAL!!!
         if (hidden2.value.indexOf(","+linhasOcultas[0]) != -1) {
         hidden2.value = hidden2.value.replace(linhasOcultas[0]+",","");
         }else if (hidden2.indexOf(linhasOcultas[0]+",") == 0) {
         hidden2.value = hidden2.value.replace(linhasOcultas[0]+",","");
         }else{
         hidden2.value = "";
         }
         */
         calcula();
      }
   }
}

function RemoverCampos(id) {
   //Criando ponteiro para hidden1:        
   var hidden1 = document.getElementById("hidden1");

   //Pegar o valor do campo que será excluído:
   var campoValor = document.getElementById("valor_unitario"+id).value;
   //Se o campo não tiver nenhum valor, atribuir a string: vazio:
   if (campoValor == "") {
      campoValor = "vazio";
   }

   if(confirm("O campo que contém o valor:\n» "+campoValor+"\nserá excluído!\n\nDeseja prosseguir?")){
      document.getElementById("linha"+id).style.display = "none"; iCount--;
   
      //Removendo o valor de hidden1:
      if (hidden1.value.indexOf(",linha"+id) != -1) {
         hidden1.value = hidden1.value.replace(",linha"+id,"");
      }else if (hidden1.value.indexOf("linha"+id+",") == 0) {
         hidden1.value = hidden1.value.replace("linha"+id+",","");
      }else{
         hidden1.value = "";
      }
      
      calcula();
   }
}

$(document).ready(function(){
   $('span[id^=linha] input').on("input", calcula);
});

//Escrevendo o código-fonte HTML e ocultando os campos criados:
for (iLoop = 1; iLoop <= totalCampos; iLoop++) {
   document.write("<span id='linha"+iLoop+"' style='display:none'><div class='class_unit'>Valor Unitário "+iLoop+":<input type='text' name='valor_unitario"+iLoop+"' id='valor_unitario"+iLoop+"' /></div><div class='class_quant'>Quantidade "+iLoop+": <input type='text' name='qnt"+iLoop+"' id='qnt"+iLoop+"' value='0' /></div><div class='class_total'>SubTotal "+iLoop+": <input type='text' name='total"+iLoop+"' id='total"+iLoop+"' readonly='readonly' /></div> <input type='button' value='Remover' onclick='RemoverCampos(\""+iLoop+"\")'></span>");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form name="form1" action="" method="post">

   <div id="total">Total: <input class="value_total" readonly></input> </div>
   <br><br><br>
   <input type="button" value="Adicionar campos" onclick="AddCampos()">
   <br><br><input type="text" name="hidden1" id="hidden1">
   <input type="hidden" name="hidden2" id="hidden2">

</form>

I managed to run perfectly, but I can’t pass the input values Unit Value N, Quantity N and Subtotal N to a query in BD through PHP/SQL. I tried it this way: Variable Declaration with PHP Constants ,but to no avail.

In case it would be more or less like this (I left very detailed and commented):

<?php
$sem_linha = str_replace('linha', '', $dados['hidden1']); //tiro a palavra "linha" do valor da input hidden', assim ao invés de linha1, linha2, linhaN... -> fica: 1, 2, N...

$explodido = explode(',', $sem_linha); //explodo o $sem_linha para criar array dos valores separados

$total_explodido = count($explodido); //conto quantos arrays foram gerados

$inc = 0; //contador

while($inc <= $total_explodido){ //laço para inserir todas as inputs

  $input = $explodido[$inc]; //pego os arrays, importante notar que não necessariamente todas as inputs estarão preenchidas, por exemplo, posso ter as inputs 1,5,6,7 e 10 preenchidas
  
  $id_prod = $dados['id_produto'][$input]; //<=isso está certo? aqui deveria buscar "id_produtoN" 
  
  $qnt_prod = $dados['qnt'][$input]; //<=isso está certo? aqui deveria buscar "qntN"
  
  $query = "INSERT INTO produto (id_produto, quantidade produto, criado)
VALUES ($id_prod, $qnt_prod, NOW())"; //inserindo no BD

  $result_query = mysqli_query($conn, $query);
}

?>

However, it is giving error. In this part of PHP I have a huge doubt. It would have another way to pass the two input (id_product and qnt), which can vary from 1 to 10 (20 inputs)?

One of the mistakes is this: NOTICE Undefined offset: 1 on line number 15

Thanks...

1 answer

0


I got it this way:

<?php
$sem_linha = str_replace('linha', '', $dados['hidden1']); //tiro a palavra "linha" do valor da input hidden', assim ao invés de linha1, linha2, linhaN... -> fica: 1, 2, N...

$explodido = explode(',', $sem_linha); //explodo o $sem_linha para criar array dos valores separados

$total_explodido = count($explodido); //conto quantos arrays foram gerados

$inc = 0; //contador

while($inc <= $total_explodido){ //laço para inserir todas as inputs

  $input = $explodido[$inc]; //pego os arrays, importante notar que não necessariamente todas as inputs estarão preenchidas, por exemplo, posso ter as inputs 1,5,6,7 e 10 preenchidas
  
  $a = 'id_produto'.$input; //nomeia id_produtoN
  
  $b = 'qnt'.$input; //nomeia qntN
  
  $id_prod = $dados[$a]; //aqui deveria buscar "id_produtoN" 
  
  $qnt_prod = $dados[$b]; //aqui deveria buscar "qntN"
  
  $query = "INSERT INTO produto (id_produto, quantidade produto, criado)
VALUES ($id_prod, $qnt_prod, NOW())"; //inserindo no BD

  $result_query = mysqli_query($conn, $query);
}

?>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.