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 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.,
       
    • By Fabio Jonas
      Pessoal, estou precisando retornar o valor total de receita e valor total de despesas por mês nesse estilo:
                      
                           Despesa        Receita
      Janeiro          50.00            200.00
      Fevereiro               0            500.00
      Março           100.00           500.00
       
      Cheguei a essa consulta abaixo mas esta retornando o mesmo valor para todos os mês
      SELECT MONTHNAME(`data_vencimento`) as mes, (SELECT SUM(`valor`) as valor_total FROM lancamentos WHERE tipo = 'despesa' and YEAR(`data_vencimento`) = 2022 AND `empresa` = 1) as despesas, (SELECT SUM(`valor`) as valor_total FROM lancamentos WHERE tipo = 'receita' and YEAR(`data_vencimento`) = 2022 AND `empresa` = 1) as receitas From lancamentos GROUP BY MONTH(`data_vencimento`) ORDER BY MONTH (`data_vencimento`);  
      O Retorno esta assim 
                           Despesa        Receita
      Janeiro          50.00            200.00
      Fevereiro       50.00            200.00
      Março            50.00            200.00
       
      Alguém consegue me ajudar com essa consulta?
      Obrigado
    • By cmoreira1300
      Meu programa não consegue identificar o dotenv na middleware
      Eu estava fazendo um CRUD simples, implementei o dotenv no meu programa, está funcionando quando faço a conexão com o banco de dados e a inserção e uma função normal,  mais quando vou fazer isso dentro de uma middleware ele não chama meu dotenv, só funciona quando tiro o process.env e ponho as informações direto na função de conexão.
      require( 'dotenv' ).config( { path: '../../.env' } ) const mysql = require( 'mysql2' ) // DESSA FORMA NÃO FUNCIONA const connection_pool = mysql.createPool( { host: process.env.DB_HOST, user: process.env.DB_USER, database: process.env.DB_DATABASE, password: process.env.DB_PASS } ) // DESSA FORMA FUNCIONA // const connection_pool = mysql.createPool( { // host: 'localhost', // user: 'carlos', // database: 'simple_crud', // password: 'pass1241' // } ) module.exports = connection_pool.promise() INSERÇÃO NO BANCO DE DADOS
      const db_conn = require( '../db/connection' ) const createNewClient = ( name ) => { return db_conn.execute( `INSERT INTO client ( name ) values (?)`, [ name ] ) } module.exports = { createNewClient } FAZENDO A INSERÇÃO NO MIDDLEWARE
      const data = require( '../data/client' ) const createClient = ( req, res, next ) => { const client = req.body.name data.createNewClient( client ) .then( () => { res.status( 200 ).json( { 'status': 'sucess', 'client': client } ) } ) .catch( ( err ) => { res.status( 404 ).json( { status: 'error', error: err } ) } ) .finally( () => { next() } ) } module.exports = { createClient } { "status": "error", "error": { "message": "Access denied for user ''@'localhost' (using password: YES)", "code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlState": "28000", "sqlMessage": "Access denied for user ''@'localhost' (using password: YES)" } }  Esse é o erro que obtenho quando uso o dotenv, lenbrando que as informações de login estão todas certas, e que em outra função que não seja um middleware funciona.
    • By ROGERIO MOREIRA
      Olá,
       
      preciso gerar listagem do meu banco de dados mas preciso definir um certo item como cabeça na pesquisa:
       
      ex:
      quero listar meus registros em orderm de:
       
      primeiro ESTADO    (ordem alfabetica)
      depois    CIDADE     (ordem alfabetica)
      depois    BAIRRO,    porém, quero colocar CENTRO em primeiro, depois os outros bairros
       
    • By Sapinn
      Estou usando o editor SummerNote em um projeto mas ele não está enviando os dados com o HTML apenas o texto. Eu estou colocando assim:

               
                                        <textarea id="summernote" class="textarea" required name="content">     <script> $('#summernote').summernote({         tabsize: 2,         height: 500,         toolbar: [           ['style', ['style']],           ['font', ['bold', 'underline', 'clear']],           ['color', ['color']],           ['para', ['ul', 'ol', 'paragraph']],           ['table', ['table']],           ['insert', ['link', 'picture', 'video']],           ['view', ['fullscreen', 'codeview', 'help']]         ]       });           </script>  
       
×

Important Information

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