Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rcamu

Gravando apenas a ultima linha no BD

Recommended Posts

To fazendo um formulário para dar entrada em produtos no estoque (espelho da NF) para isso estou usando um cód em javascript para clonar as linhas.

 

Até ai tudo bem, o problema e na hora de mandar cadastrar pois ele só cadastra a ultima linha dos produtos, será problema no meu isert, no formulário ou no java?

 

To quebrando a cabeça e não acho onde está o problema, me ajudem por favor....

 

partes do cód:

 

Insert:

mysql_query("INSERT INTO lc_detalhe (cat_id,qtd,valor_unid,valor_total,controle_id) values
      ('$cat_id','$qtd','$valor_unid','$valor_total',LAST_INSERT_ID())");

 

Javascript para duplicar as linhas:

<script type="text/javascript">
$(function () {
  function removeCampo() {
    $(".removerCampo").unbind("click");
    $(".removerCampo").bind("click", function () {
       if($("tr.linhas").length > 1){
        $(this).parent().parent().remove();
       }
    });
  }

  $(".adicionarCampo").click(function () {
    novoCampo = $("tr.linhas:first").clone();
    novoCampo.find("input").val("");
  novoCampo.find(".valor_unid").maskMoney({showSymbol:false, decimal:".", thousands:""});
    novoCampo.insertAfter("tr.linhas:last");
    removeCampo();
  });
});
</script>

 

Parte do formulário que duplica:

 

<table border="0" cellpadding="2" cellspacing="4">
    <tr>
      <td class="bd_titulo">ID</td><td class="bd_titulo">Produto</td><td class="bd_titulo">Quantidade</td><td class="bd_titulo">Valor Unitario</td><td class="bd_titulo">Valor Total</td></tr>
  <tr class="linhas">
    <td><input type="text" name="id" style="text-align:center" disabled="true" /></td>
    <td><select name="cat_id">
<?php
while ($row=mysql_fetch_array($qr)){
?>
<option value="<?php echo $row['id']?>"><?php echo $row['nome']?></option>
<?php }?></td>
    <td>
      <input type="text" name="qtd" class="qtd" required name="qtd"
      style="text-align:center" />
    </td>
    <td> 
      <input name="valor_unid" type="text" required name="valor_unid"
      maxlength="30" 
      onblur="Calc(this)"
      class="valor_unid" />
    </td>
    <td>
      <input type="text" name="valor_total" 
      class="vtotal"   readonly="readonly"
      style="text-align:center"/>
    </td>
    <td><a href="#" class="removerCampo" title="Remover linha"><img src="img/excluir.jpg" border="0" /></a></td>
  </tr>
  <tr><td colspan="4">
        <a href="#" class="adicionarCampo" title="Adicionar item"><img src="img/+.jpg" border="0" /></a>
    </td></tr>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá pra gravar vários registros passando eles separados por vírgula entre parentese

 

mysql_query("INSERT INTO tbl(campo1, campo2, campo3) VALUES('v_1_1', 'v_1_2', 'v_1_3'), ('v_2_1', 'v_2_2', 'v_2_3'), ('v_3_1', 'v_3_2', 'v_3_3')");

 

nesse caso metemos três registros no banco. tu pode concatenar isso pra poder incluir em VALUES

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu "problema" está aqui

Insert:
mysql_query("INSERT INTO lc_detalhe (cat_id,qtd,valor_unid,valor_total,controle_id) values
      ('$cat_id','$qtd','$valor_unid','$valor_total',LAST_INSERT_ID())");

Desta forma você está realizando apenas o comando de inserção de 1 registro e por isso salva-se apenas o último item.

 

Como resolver?

 

você pode dar um name="" nos seus inputs com indicação de matriz/array. Por exemplo:

<input name="cat_id[]" value="$id">
<input name="qtd[]" value="$id">
<input name="valor_unid[]" value="$id">
<input name="valor_total[]" value="$id">

desta forma você conseguira colocar seu INSERT dentro de um loop de acordo com a quantidade de produtos que você está adicionando... Tenta modelar algo assim que vamos ajudando no processo!

 

Para isso você vai precisar aplicar foreach num dos inputs e nos demais aplicar loop indicando suas chaves/posicoes no array/matriz

 

Veja se com esse direcionamento você consegue solucionar ou "codar" algo e posta aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa...tentei seguir sua orientação mas sou bem iniciante.....

 

mudei e não deu certo, ainda não sei aplicar foreach.

 

de: input type="text" name="qtd"

para :  input name="qtd[]"

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como não sei montar array ainda to na pesquisa pela NET e montei conforme abaixo, está correto?

Se estiver, como eu monto o insert?

var arrDetalhe = "";
    arrDetalhe += "[";
    $("#tblDetalhe tbody tr").each(function(){
      arrDetalhe += "{";
      arrDetalhe += "'cat_id':'" + $(this).find("td .cat_id").val() + "', ";
      arrDetalhe += "'qtd':'" + $(this).find("td .qtd").val() + "', ";
      arrDetalhe += "'valor_unid':'" + $(this).find("td .valor_unid").val() + "', ";
      arrDetalhe += "'valor_total':'" + $(this).find("td .valor_total").val() + "', ";
      arrDetalhe += "},";
    });

    arrDetalhe = sql.substring(0,sql.length - 1);
    arrDetalhe += "]";
    $("#sqlHidden").val(arrDetalhe);  

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme, valeu pelo toque...pode deixar...

 

Olha to lendo lendo, montando, desmontando etc..kkkkk

 

e ainda não entendi e nem consegui montar array/foreach

 

você sabe onde posso achar um exemplo de insert com array/foreach mais completo para entender o funcionamento e adaptar para meu caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos supor o seguinte cenário...

 

Você tem 05 inputs e precisa salvar o conteudo de todos em registros distintos no seu banco de dados.

Desta forma você teria a seguinte lista de inputs

<input name="valor[]" value="1">
<input name="valor[]" value="2">
<input name="valor[]" value="3">
<input name="valor[]" value="4">
<input name="valor[]" value="5">

Se você fizer um INSERT no banco de dados deste campo apos o POST você vai ter a inserção de apenas 1 registro e não os 5.

Como resolver isso? Aplicando o termo [] no name="" dos inputs para que eles sejam agrupados num array/matriz apos o POST (apos clicar em submit) do seu formulario.

 

Feito isso você terá os dados num array/matriz mas e ai? Como ler um a um?

Aplicando um loop de leitura de toda a matriz.

 

De que forma?

Atraves da função FOR() ou FOREACH() - Tanto uma como outra tem a mesma finalidade, porem recomendo utilizar o foreach para um entendimento mais facil e menos linhas de código.

 

Vamos a leitura!

 

Sabendo que os seus campos possuem o nome valor nós vamos "transforma-los" em itens unicos e distintos com o foreach, ou seja, como o proprio nome diz - tradução livre: por cada - nós vamos executar uma ação para cada indice dessa matriz. Neste caso, para cada indice, vamos criar um registro no banco de dados, ficando assim:

<?php

//Crio a variavel $valor para cada indice do POST
foreach($_POST['valor'] as $valor){

     //Para cada indice do meu POST eu quero que seja criado um registro na minha base
     $query = "INSERT INTO coluna ('valor') VALUES ('$valor')";
     $sql      = mysqli_query($conexaoBD, $query);

     //Apos a inserção verifico se deu certo ou errado.
     if($sql === TRUE){
             echo "Registros adicionados";
      }else{
             echo "deu pau".mysqli_error($conexaoBD);
     }
  
?>

 

Para complementar o seu estudo indico estudar sobre

 

Array - php.net/manual/pt_BR/function.array.php

For() - http://php.net/manual/pt_BR/control-structures.for.php

Foreach - http://php.net/manual/pt_BR/control-structures.foreach.php

 

OBS: se algum momento falei besteira por falta de didática, os mais experientes poderão nos corrigir :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme valeu pelas dicas....acho que to chegando em algum lugar..kkkk

 

Agora ele ta gravando até demais no BD. quando ele tem apenas uma linha ele grava certinho mas quando tem mais de uma linha ele triplica as linhas no BD e não respeita o LAST_INSERT_ID() 

 

Olha como montei o insert:

foreach($_POST["cat_id"] as $cat_id)
    foreach($_POST["qtd"] as $qtd)
    foreach($_POST["valor_unid"] as $valor_unid)
    foreach($_POST["valor_total"] as $valor_total)

mysql_query("INSERT INTO lc_detalhe (cat_id,qtd,valor_unid,valor_total,controle_id) values
    ('$cat_id','$qtd','$valor_unid','$valor_total',LAST_INSERT_ID())");

olha como está os campos do formulário:

 <td><select name="cat_id[]">
<?php
while ($row=mysql_fetch_array($qr)){
?>
<option value="<?php echo $row['id']?>"><?php echo $row['nome']?></option>
<?php }?></td>
    <td>
      <input type="text" name="qtd[]" class="qtd" required name="qtd"
      style="text-align:center" />
    </td>
    <td> 
      <input name="valor_unid[]" type="text" required name="valor_unid"
      maxlength="30" 
      onblur="Calc(this)"
      class="valor_unid" />
    </td>
    <td>
      <input type="text" name="valor_total[]"
      class="vtotal"   readonly="readonly"
      style="text-align:center"/>
    </td>
    <td><a href="#" class="removerCampo" title="Remover linha"><img src="img/excluir.jpg" border="0" /></a></td>
  </tr>
  <tr><td colspan="4">
        <a href="#" class="adicionarCampo" title="Adicionar item"><img src="img/+.jpg" border="0" /></a>
	</td></tr>
  <tr>
<p><input type="submit" value="Cadastrar" /></p>

Olha como ele gravou no BD: ele perdeu o controle_id a partir do 3º registro que vem do LAST_INSERT_ID(), os valores não batem com o que foi digitado e inseriu varias vezes o mesmo registro

Textos completos id controle_id  cat_id qtd valor_unid      valor_total
Edita Edita Copiar Copiar Apagar Apagar 1 1 533 1630  1.00               1630.00
Edita Edita Copiar Copiar Apagar Apagar 2 1 533 1630  1.00 16.31
Edita Edita Copiar Copiar Apagar Apagar 3 2 533 1630  0.01 1630.00
Edita Edita Copiar Copiar Apagar Apagar 4 3 533 1630          0.01 16.31
Edita Edita Copiar Copiar Apagar Apagar 5 4 533 1631 1.00 1630.00
Edita Edita Copiar Copiar Apagar Apagar 6 5 533 1631 1.00 16.31
Edita Edita Copiar Copiar Apagar Apagar 7 6 533 1631 0.01 1630.00
Edita Edita Copiar Copiar Apagar Apagar 8 7 533 1631 0.01 16.31
Edita Edita Copiar Copiar Apagar Apagar 9 8 534 1630 1.00 1630.00
Edita Edita Copiar Copiar Apagar Apagar 10 9 534 1630 1.00 16.31
Edita Edita Copiar Copiar Apagar Apagar 11 10 534 1630 0.01 1630.00
Edita Edita Copiar Copiar Apagar Apagar 12 11 534 1630 0.01 16.31
Edita Edita Copiar Copiar Apagar Apagar 13 12 534 1631 1.00 1630.00
Edita Edita Copiar Copiar Apagar Apagar 14 13 534 1631 1.00 16.31
Edita Edita Copiar Copiar Apagar Apagar 15 14 534 1631 0.01 1630.00
Edita Edita Copiar Copiar Apagar Apagar 16 15 534 1631 0.01 16.31

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Luiz Henrique
      Olá,
       
      Preciso fazer uma inserção no DB de registros referente a pagamentos, quando for no crédito será realizado o insert com sua respectiva data de compensação e valor da parcela exemplo:
       3 parcelas de 100.00 e cada registro em seu devido mês:
      INSERT INTO tabela (valor, data) VALUES (100, 2022-08-17),(100, 2022-09-17),(100, 2022-10-17) É mais eficiente fazer da forma acima ou colocar 3 INSERT?
      Ou existe forma melhor de fazer isso?
       
      Obrigado.,
       
    • Por Carlos Antoliv
      Senhores, bom dia.
       
      tenho um campo status. Então, a ideia é mudar o status. Consigo alterar o status quando necessário. Daí, pensei em todas vez que alterar, salvar o id do usuário, data, hora, o último status alterado...
      consigo fazer isso com INSERT, depois do UPDATE.
       
      Nao uso trigger. Até tentei fazer, mas não saiu como eu queria.
       
      Então, para os maiores entendedores do assunto, a melhor prática seria a TRIGGER ou INSERT ? Melhor prática ou o que mais funciona na prática ?
       
      Alguém poderia dissertar sobre isso ?
      Vlw..abço
    • Por unset
      Olá, estou com uma falha de lógica pegando aqui se alguém puder ajudar
       
      Eu tenho um formulário tranquilo, como abaixo
      <label for="cidades" class="form-label">Cidades</label> <select class="form-select mb-3" name="cidades[]" id="cidades" multiple="multiple"> <option value="1">Cidade 1</option> <option value="2">Cidade 2</option> <option value="3">Cidade 3</option> <option value="4">Cidade 4</option> <option value="5">Cidade 5</option> </select>  
      Blz eu recebe os dados do formulário ou seja os ids da cidade certinho em um array 
       
      array(3) { [0]=> string(1) "2" [1]=> string(2) "3" [1]=> string(1) "5" }
      <?php $dados = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRIPPED); var_dump($dados); ?> Agora como inserir todos os ids no banco? utilizando um for? um while? algum exemplo?
       
      Pergunto pq ao tentar inserir no banco somente um registro é inserido e não todos do select
       
    • Por leandrodesouza14
      Tenho uma duvida.
       
      Estou recebendo dados de um formulário HTML através do método POST. Um desses dados provem de um campo Select com diversos Options.
       
      Eu vou inserir os dados recebidos dos diversos imputs em varias tabelas, qual das tabelas vai depender do que o usuário selecionar no Select.
       
      Por exemplo: Se a pessoa selecionar BMW no Select, os dados do restante do formulário devem ser inseridos na tabela BMW. / Se a pessoa selecionar Fiat no Select, os dados do restante do formulário devem ser inseridos na tabela Fiat.
       
      O codigo que desenvolvi ate agora foi esse:
       
      <form action="cadastrodeveiculo.php" method="post" name="cadastroveiculo"> <p> Fabricante: <select name="marca"> <option value="audi" >Audi</option> <option value="bmw">BMW</option> <option value="chevrolet">Chevrolet</option> <option value="citroen">Citroen</option> <option value="fiat">Fiat</option> <option value="ford">Ford</option> <option value="hyundai">Hyundai</option> <option value="honda">Honda</option> <option value="jeep">Jeep</option> <option value="mb">Mercedes-Benz</option> <option value="mitsubishi">Mitsubishi</option> <option value="nissan">Nissan</option> <option value="peugeot">Peugeot</option> <option value="renault">Renault</option> <option value="toyota">Toyota</option> <option value="volkswagen">Volkswagem</option> </select> Modelo: <input type="text" id="modelo" name="modelo" maxlength="50"> Versao: <input type="text" id="versao" name="versao" maxlength="100"> Ano: <input type="text" id="ano" name="ano" maxlength="12"> Link: <input type="text" id="link" name="link" maxlength="300"> </p> <input class="submit" type="submit" name="cadastrar" value="Cadastrar"> </form> O codigo PHP, da pagina cadastroveiculo.php e o seguinte:
       
      <?php $conn = mysqli_connect("localhost", "leandro", "123", "afxveiculos"); if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "Connected successfully"; $tabela = $_POST['marca']; $modelo = $_POST['modelo']; $versao = $_POST['versao']; $ano = $_POST['ano']; $link = $_POST['link']; $sql = "INSERT INTO (modelo, versao, ano, link) VALUES ('$modelo', '$versao', '$ano', '$link')"; if (mysqli_query($conn, $sql)) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); header("location: cadastroesquema.html"); ?> Deixei o Insert Into vazio pois não sei que colocar la.
       
      Obrigado galera!
    • Por pandinha_000
      Olá,
      Estou desenvolvendo um código em c++ utilizando manipulação de arquivos .txt (não por ponteiros), e gostaria de saber como fazer para que o algoritmo "pule" a primeira linha em branco do meu arquivo e passe já para a próxima, com dados válidos (na leitura). A propósito, existe a possibilidade de, ao escrever no arquivo, essa primeira linha em branco não exista?
      Desde já agradeço.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.