Jump to content
andrelimaverde

Salvar formulário PHP PDO Banco de Dados

Recommended Posts

Pessoal desde já agradeço a todos, e vamos lá.

Primeiro esclareço que meu conhecimento em PHP é básico e em MYSQL praticamente nulo...

Meu objetivo é: Salvar dados do formulário (3 páginas) no mesmo ID (mesma linha) do banco de dados.

Tenho:

<!-- PÁGINA INDEX.PHP -->
<?php
    session_start();
?>
<html>
  <form method="POST" action="1.php">
    <input type="text" name="namenome" placeholder="Nome">
    <input type="text" name="namesobrenome" placeholder="Sobrenome">
    <input type="radio" name="radio" value="Masculino">
    <input type="radio" name="radio" value="Feminino">
    <input type="submit" name="namebtn" value="Próximo Passo">
  </form>
</html>

E assim são as outras duas páginas, exemplificando, muito simples...

No Index o FORM tem action="1.php

Na Pagina2 o FORM tem action="2.php" e assim sucessivamente.

 

1.php funcionando perfeitamente:

<?php
session_start();
include_once 'conexao.php'; 
//conexao.php somente faz a conexão com banco de dados, define as credenciais e atrubi a variável $conn
//$conn = new PDO('mysql:host=' . HOST . ';dbname=' . DBNAME . ';', USER, PASS);

$btn = filter_input(INPUT_POST, 'namebtn', FILTER_SANITIZE_STRING);

if($btn){
    //Recebe os dados do form
    $nom = filter_input(INPUT_POST, 'namenome', FILTER_SANITIZE_STRING);
    $sob = filter_input(INPUT_POST, 'namesobrenome', FILTER_SANITIZE_STRING);
    $rad = filter_input(INPUT_POST, 'radio', FILTER_SANITIZE_STRING);

    //Insere os dados no banco
    $get_data = "INSERT INTO info_tabela (nome, sobrenome, sexo) VALUES (:namenome, :namesobrenome, :radio)";

    $insert_data = $conn->prepare($get_data);
    $insert_data->bindParam(':namenome', $nom);
    $insert_data->bindParam(':namesobrenome', $sob);
    $insert_data->bindParam(':radio', $rad);

    if($insert_data->execute()){
        header("Location:pagina2.php"); //Se enviar corretamente redireciona para segunda página
    }else{
        $_SESSION['msg'] = "<p style='color:tomato;background:#fff;'>Não foi possível enviar suas informações, verifique e tente novamente.</p>";
        header("Location:index.php"); //Se não apresenta o erro
    }
}else{
    $_SESSION['msg'] = "<p style='color:tomato;'>Não foi possível enviar suas informações, verifique e tente novamente.</p>";
    header("Location:index.php"); 
}

Até ai tudo bem, insere corretamente os dados nas respectivas colunas da tabela ID=1, NOME= 'nome', SOBRENOME= 'sobrenome', SEXO= 'sexo'.

No Banco de Dados ainda temos as colunas a serem preenchidas no mesmo ID(mesma linha) --> CIDADE= ' ', ENDEREÇO= ' ', CEP= ' ', 

Que referem-se à pagina2.php:

<!-- PÁGINA PAGINA2.PHP -->
<?php
    session_start();
?>
<html>
  <form method="POST" action="2.php"> <!-- ACTION 2.PHP RESPECTIVAMENTE -->
    <input type="text" name="namecidade" placeholder="Cidade">
    <input type="text" name="nameendereco" placeholder="Endereço">
    <input type="tex" name="namecep" placeholder="Cep">
    <input type="submit" name="namebtn" value="Próximo Passo">
  </form>
</html>

O problema, é que ao enviar o formulário com action="2.php" cujo arquivo possui o mesmo código que o "1.php" mudando somente os dados recebidos,

No Banco de Dados é criado um novo ID(2) ou seja, uma nova linha, com os dados atuais nas colunas (cidade, endereço, cep) preenchidos, e as colunas anteriores (nome, sobrenome, sexo) vazias...

 

Pessoal esta é a minha dúvida, como resolver, salvar todos os dados num mesmo id, mesma linha. O código do arquivo 2.php é o mesmo pois não faço ideia de como implementar isso, como em soluções anteriores tais dados costumava enviar com PhpMailer para e-mail então não entendo de MYSQL.

 

Código simplificado e resumido ao máximo...

Obrigado.

Share this post


Link to post
Share on other sites

No primeiro arquivo normalmente você vai fazer o INSERT, salvando os dados e tal.

 

Já na página 2 você terá que resgatar qual foi o último registro salvo pode usar no caso $insert_data->lastInsertId.

Onde você terá o último ID registrado.

Então nesse segundo arquivo você pode tanto criar um input hidden com essa informação ou armazenar esse valor em cessão.

Para que quando submeter novamente possa usar o valor do input ou da cessão para fazer UPDATE.

 

No caso de um terceiro segue o mesmo conceito, bastando continuar usando a informação do último ID que foi dada no INSERT.

 

 

No entanto acho melhor que apenas registre o usuário, e coloque uma opção já com o usuário logado para alterar as demais coisas que forem necessárias.

 

Além de usar o ID do usuário você pode criar um hash para cada usuário salvando esse valor em uma coluna. E usar a info do hash ao invés do ID (Eu sempre adoto esse recurso, para evitar conflitos no SQL)

Share this post


Link to post
Share on other sites
12 minutos atrás, Omar~ disse:

No primeiro arquivo normalmente você vai fazer o INSERT, salvando os dados e tal.

 

Já na página 2 você terá que resgatar qual foi o último registro salvo pode usar no caso $insert_data->lastInsertId.

Onde você terá o último ID registrado.

Então nesse segundo arquivo você pode tanto criar um input hidden com essa informação ou armazenar esse valor em cessão.

Para que quando submeter novamente possa usar o valor do input ou da cessão para fazer UPDATE.

 

No caso de um terceiro segue o mesmo conceito, bastando continuar usando a informação do último ID que foi dada no INSERT.

 

 

No entanto acho melhor que apenas registre o usuário, e coloque uma opção já com o usuário logado para alterar as demais coisas que forem necessárias.

 

Além de usar o ID do usuário você pode criar um hash para cada usuário salvando esse valor em uma coluna. E usar a info do hash ao invés do ID (Eu sempre adoto esse recurso, para evitar conflitos no SQL)

Certo Omar, vou testar essa função, estava tendo problemas pois estava usando o UPDATE com WHERE id=LAST_INSERT_ID(); não fazia idéia de como implementar, agora vou ver como armazeno esse valor e retorno com resultado.

Share this post


Link to post
Share on other sites
2 horas atrás, Omar~ disse:

No primeiro arquivo normalmente você vai fazer o INSERT, salvando os dados e tal.

 

Já na página 2 você terá que resgatar qual foi o último registro salvo pode usar no caso $insert_data->lastInsertId.

Onde você terá o último ID registrado.

Então nesse segundo arquivo você pode tanto criar um input hidden com essa informação ou armazenar esse valor em cessão.

Para que quando submeter novamente possa usar o valor do input ou da cessão para fazer UPDATE.

 

No caso de um terceiro segue o mesmo conceito, bastando continuar usando a informação do último ID que foi dada no INSERT.

 

 

No entanto acho melhor que apenas registre o usuário, e coloque uma opção já com o usuário logado para alterar as demais coisas que forem necessárias.

 

Além de usar o ID do usuário você pode criar um hash para cada usuário salvando esse valor em uma coluna. E usar a info do hash ao invés do ID (Eu sempre adoto esse recurso, para evitar conflitos no SQL)

Omar, teria uma dica de como implementar esse código de uma melhor maneira. Por exemplo, já estou usando o UPDATE perfeitamente, mas estou com dificuldades no WHERE id= . Não consegui usar a função lastInsertId, como na primeira página fazemos o INSERT teria uma maneira de fazer o UPDATE no último ID inserido no caso pela sessão atual? Pode exemplificar?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By joao b silva
      Tenho uma pequena aplicação em php que gera arquivos pdf com a MPDF e envia email com a PHPMAILER. De repente a app parou de enviar os emails  e apresenta a seguinte mensagem de erro:
       
      Error PHPMailer: SMTP Error: Could not authenticate.
       
      Faço uso de um hotmail para a configuração do PHPMAILER.
    • By violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos.
       
      Quando programava em DOS. utilizava algumas teclas de atalho para: SALVAR / EDITAR / EXCLUIR / IMPRIMIR.
      Por exemplo:
      Salvar ----> ALT+S
      Editar ----> ALT+E
      Excluir --> ALT+X
      Imprimir -> ALT+I

      no PHP tem como colocar esses ATALHOS nos button, para o usuário trabalhar com esses atalhos e como seria ?

      grato,
       
      Cesar
    • By violin101
      Caros Amigos, saudações.
       
      Por favor, me perdoa em postar uma dúvida.
       
      Preciso criar uma Rotina onde o usuário possa buscar na Base de Dados de Produtos, tanto por Código e Descrição, ou seja:
      - caso o usuário digita o Código, mostra os dados do Produto.
      - caso o usuário digita a Descrição, mostra os dados do Produto
       
      Fiz uma Rotina, onde o usuário digita a DESCRIÇÃO com a função AUTOCOMPLETE.    <=== está funcionando certinho.
       
      Minha dúvida é como faço para DIGITAR o Código e mostrar os dados também.
       
      o meu AutoComplete na MODEL está assim.
      public function autoCompleteProduto($q){ $this->db->select('*' ) ->from('produtos') ->where('produtos.statusProd',1) ->like('descricao', $q) ->limit(5) ->order_by('descricao', 'ASC'); $query = $this->db->get(); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $row_set[] = ['label' => str_pad($row['idProdutos'], '5', '0', STR_PAD_LEFT).' - '.$row['descricao'], 'id' => $row['idProdutos'], 'descricao' => $row['descricao'], 'cod_interno' => $row['cod_interno'], 'prd_unid' => $row['prd_unid'], 'estoque_atual' => $row['estoque_atual'] ]; } echo json_encode($row_set); } }  
       
      no CONTROLLER está assim:
      public function autoCompleteProduto() { $this->load->model('estoque/lancamentos_model'); if (isset($_GET['term'])) { $q = strtolower($_GET['term']); $this->lancamentos_model->autoCompleteProduto($q); } }  
       
      na VIEW está assim:
      <div class="col-md-10"> <label for="idProdutos">Produto:</label> <input type="hidden" name="idProdutos" id="idProdutos"> <input type="text" class="form-control" id="descricao" name="descricao" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por descrição do produto" disabled> </div>  
      VIEW + JAVASCRIPT
       
      //Função para trazer os Dados pelo o AutoComplete. function resolveAutocomplete() { $("#descricao").autocomplete({ source: "<?php echo base_url(); ?>estoque/lancamentos/autoCompleteProduto/", minLength: 2, select: function (event, ui) { $("#idProdutos").val(ui.item.id); $("#cod_interno").val(ui.item.cod_interno); $("#descricao").val(ui.item.descricao); $("#prd_unid").val(ui.item.prd_unid); $("#estoque_atual").val(ui.item.estoque_atual); $("#qtde").focus(); } }); } // inicia o autocomplete resolveAutocomplete();  
      Grato,
       
      Cesar
    • By belann
      Olá!
       
      Estou tentando criar um projeto laravel e está dando o seguinte erro 
      curl error 60 while downloading https://getcomposer.org/versions: SSL certificate problem: unable to get local issu
        er certificate
      Já tentei atualizar o composer, mas dá o mesmo erro acima.
    • By violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.