Jump to content
Fábio.info7

Como gravar dados de um formulário em duas tabelas diferentes do Postgres com PHP?

Recommended Posts

Possuo um formulário com os seguintes dados, nome, idade, cpf, sexo, logradouro, bairro, cidade, eu possuo 1 banco com as seguintes tabelas, TABELA PESSOA E TABELA ENDERECO, ao enviar o formulário eu preciso gravar os dados pessoais na tabela pessoa e os dados de endereço na tabela endereco, o banco é postgres, como fazer isso? Poderiam me dar um exemplo?

Só uma observação: Estou usando PDO e com relação as tabelas, elas estão relacionadas entre si pela chave primária. 

 

Acredito que a solução seja simples, mas sou iniciante em php, preciso dessa força para continuar meus estudos.

 

nome, idade ,cpf, sexo

Sege as tabelas do meu banco postgres:

create table pessoa(
codigo serial not null,
nome varchar(30) not null,
idade int not null,
cpf varchar(11) not null,
sexo varchar(20) not null
);

CREATE TABLE public.enderecos
(
    codigo integer NOT NULL DEFAULT nextval('enderecos_codigo_seq'::regclass),
    logradouro character varying(80) COLLATE pg_catalog."default" NOT NULL,
    bairro character varying(80) COLLATE pg_catalog."default" NOT NULL,
    cidade character varying(80) COLLATE pg_catalog."default" NOT NULL,
    uf character varying(2) COLLATE pg_catalog."default",
    cep character varying(9) COLLATE pg_catalog."default",
    pessoa integer,
    CONSTRAINT codigo_end PRIMARY KEY (codigo),
    CONSTRAINT enderecos_pessoa_fkey FOREIGN KEY (pessoa)
        REFERENCES public.pessoa (codigo) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.enderecos
    OWNER to postgres;

AQUI MEU FORMULÁRIO:

   <form action="grava.php" method="post">
    Nome: <input type="text" name="nome"><br>
    CPF:<input type="text" name="cpf"><br>
    Sexo: <input type="text" name="sexo"><br>
    Idade: <input type="text" name="idade"><br>
     
    Logradouro: <input type="text" name="logradouro"><br>
    Bairro: <input type="text" name="bairro"><br>
    Cidade: <input type="text" name="cidade"><br>
    Cep: <input type="text" name="cep"><br>
    <input type="submit" value="Cadastrar"> 
    
</form>


ERQUIVO enviar.php:


<?php

try {

    require_once "conexao.php";
    $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);

    // Gravando dados pessoais
    $sql = "insert into pessoa (cpf, nome, sexo, nascimentodata, email ) values (:cpf, :nome, :sexo, :nascimentodata, :email )";
    $inserir = $conn->prepare($sql);
    $inserir->bindParam(":cpf", $dados["cpf"]);
    $inserir->bindParam(":nome", $dados["nome"]);
    $inserir->bindParam(":sexo", $dados["sexo"]);
    $inserir->bindParam(":nascimentodata", $dados["nascimentodata"]);
    $inserir->bindParam(":email", $dados["email"]);
    $inserir->execute();

    // Gravando dados de endereço
    $sql_end = "insert into enderecos (logradouro, bairro, cidade, uf, cep )values(:logradouro,:bairro,:cidade,:uf,:cep)";
    $end = $conn->prepare($sql_end);

    $end->bindParam(":logradouro", $dados["logradouro"]);
    $end->bindParam(":bairro", $dados["bairro"]);
    $end->bindParam(":cidade", $dados["cidade"]);
    $end->bindParam(":uf", $dados["uf"]);
    $end->bindParam(":cep", $dados["cep"]);

    $end->execute();
    echo "Dados gravados com sucesso!";

} catch (Exception $e) {

    echo "Mensagem: " . $e->getMessage() . "<br/>";
    echo "Linha do Erro: " . $e->getLine() . "<br/>";

}

 

Share this post


Link to post
Share on other sites

Segundo a sua estrutura, as tabelas não possuem relacionamento nenhum. Para ter relacionamento precisa-se de FK - Foreigns Keys(chaves estrangeiras). As chaves primárias são para identificar as tuplas(linhas).

 

No meu ver, a melhor prática é ter apenas uma tabela que grave todos os dados da pessoa, fica mais fácil pra processar os dados posteriormente.

 

No seu caso, para ter relacionamento, na tabela pessoa teria que ter um campo id_endereco como FK) e na tabela tabela um campo id_pessoa como FK. Pois com a estrutura que está, você pode inserir normalmente, mas depois não conseguirá consultar, pois não saberá de quem são os dados.

 

Dê uma pesquisada sobre chaves estrangeiras, ou utilize apenas uma tabela(eu indico).

 

 

Share this post


Link to post
Share on other sites
8 horas atrás, marcosmarcolin disse:

Segundo a sua estrutura, as tabelas não possuem relacionamento nenhum. Para ter relacionamento precisa-se de FK - Foreigns Keys(chaves estrangeiras). As chaves primárias são para identificar as tuplas(linhas).

 

No meu ver, a melhor prática é ter apenas uma tabela que grave todos os dados da pessoa, fica mais fácil pra processar os dados posteriormente.

 

No seu caso, para ter relacionamento, na tabela pessoa teria que ter um campo id_endereco como FK) e na tabela tabela um campo id_pessoa como FK. Pois com a estrutura que está, você pode inserir normalmente, mas depois não conseguirá consultar, pois não saberá de quem são os dados.

 

Dê uma pesquisada sobre chaves estrangeiras, ou utilize apenas uma tabela(eu indico).

 

 

Marcos, erro meu, as tabelas estão relacionadas, eu corrigi lá o código acima, eu preciso saber como fazer um insert no php para gravar nas duas tabelas, eu até fiz um insert mas só grava na tabela pessoa, a tabela enderecos não grava nada.

Share this post


Link to post
Share on other sites

Certo, olhando por cima, você precisa inserir a pessoa na tabela de endereço, pois é sua chave estrangeira, certo? Então precisa pegar o id da pessoa que está sendo inserida, e inserir na pessoa da tabela endereço? Como, utilize lastInsertId().

 

Como está utilizando PDO, o que você precisa também é iniciar e terminar as transações, utilizando beginTransaction() e commit(). Veja aqui como utilizar, ou aqui no manual.

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 alexandra174
      Bom dia, 
      Estou aprendendo lógica de programação e isso tem gerado muitos arquivos. Gostaria de saber se é uma ''boa prática'' colocar algoritmos simples no github? Apesar de ser coisa muito simples, são meus primeiros passos no mundo da programação.
    • By Samuel Pietro
      Tenho um select em PDO e preciso que a consulta retornada vire uma variavel, mas a variavel só pega a ultima linha da tabela e eu preciso que pegue todas as linhas que existirem.
       
      $conexao = conexao::getInstance(); $sql = 'SELECT * FROM RegistroE'; $stm = $conexao->prepare($sql); $stm->execute(); $Sql = $stm->fetchAll(PDO::FETCH_OBJ); foreach ($Sql as $SqlReg): $conteudo_meio = picture_X($SqlReg->E_01,1) .picture_X($SqlReg->E_02,25) .picture_9($SqlReg->E_03,4) .picture_X($SqlReg->E_04,14) .picture_9($SqlReg->E_05,8) .picture_9($SqlReg->E_06,8) .picture_9($SqlReg->E_07,8) .picture_9($SqlReg->E_08,8) .picture_9($SqlReg->E_09,8) .complementoRegistro(96,"brancos") .picture_9($SqlReg->E_11,1) .complementoRegistro(1,"brancos") ; endforeach; Como eu poderia está fazendo isto?
    • By peterstefan
      Bom dia, estou fazendo uma cadastro via rest e estou utilizando o curl para cadastrar no webservice...
      Meu código está cadastrando tudo certinho, porem quando ele cadastra e mostra o retorno que foi cadastrado com sucesso ele fica o AGUARDE, CARREGANDO e não para.. não sei oque esta faltando pq já tentei varias coisas e não deu certo... 
       
       
       
      $Data = [ "nomeRazaoSocial" => $PostData['nomeRazaoSocial'], "identMF" => $PostData['identMF'], "email" => $PostData['email'], "telefone" => $PostData['telefone'], "senhaProvisoria" => $PostData['senhaProvisoria'] ]; $DataString = json_encode($Data); $curl = curl_init(WEBSERVICECADASTRO); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_POSTFIELDS, $DataString); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($DataString)) ); $result = curl_exec($curl); if ($result) { $jSON['success'] = "<i class='icon-checkmark'></i>Pronto, cadastro foi realizado com sucesso!"; }else{ $jSON['error'] = "<i class='icon-warning'></i>Oops! Erro ao cadastrar! Por favor, tente novamente!"; }  

       

    • By RSN
      Boa Noite,
      Preciso enviar uma consulta sql no corpo do e-mail, porém não estou conseguindo concatenar o laço while.
      <?php include_once('conexao.php'); require 'PHPMailer/PHPMailerAutoload.php'; $resultado = mysql_query("SELECT * FROM cupom WHERE FlagEstorno = 1;"); $linhas = mysql_num_rows($resultado); $mensagem = '<div class="x_content"> <table id="datatable-buttons" class="table table-striped table-bordered"> <thead> <tr> <th>Loja</th> <th>Nro Cupom</th> <th>Data</th> <th>Operador</th> </tr> </thead> <tbody> while($linhas = mysql_fetch_array( $resultado)){ echo " <tr>"; echo "<td>".$linhas['nroloja']."</td>"; echo "<td>".$linhas['NroCupom']."</td>"; echo "<td>".$linhas['DataProc']."</td>"; echo "<td>".$linhas['Operador']."</td>"; echo " </tr>"; }'; $mail = new PHPMailer(); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->Username = ''; $mail->Password = ''; $mail->Port = 587; $mail->setFrom(''); $mail->addReplyTo(''); $mail->addAddress('', 'Nome'); $mail->isHTML(true); $mail->Subject = 'Assunto do email'; $mail->Body = $mensagem; $mail->AltBody = 'Para visualizar essa mensagem acesse http://site.com.br/mail'; //$mail->addAttachment('/tmp/image.jpg', 'nome.jpg'); if(!$mail->send()) { echo 'Não foi possível enviar a mensagem.<br>'; echo 'Erro: ' . $mail->ErrorInfo; } else { echo 'Mensagem enviada.'; } ?>  
    • By Augustomesquita
      Bom dia pessoal!
      Vocês também estão programando em primeira pessoa? Recentemente escrevi este artigo e gostaria de compartilhar a ideia com vocês.
      Pare de programar em primeira pessoa!
×

Important Information

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