Ir ao conteúdo
  • Cadastre-se

Como Cadastrar dados em tabelas relacionadas


Ir à solução Resolvido por smarthome,

Posts recomendados

Olá colegas.

 

Busquei no Google e não consegui achar uma solução 

para esta necessidade.

 

Tenho um banco de dados mysql conectado a um sistema 

em php + html5.

 

Os dados do usuário estão em várias tabelas.

 

Usuários (é o usuario do sistema)

Anunciantes (são cadastrados pelo usuário)

dados_pf (nome, cpf, rg...)

dados_pj (razão social, cnpj...)

contatos (telefones e email)

enderecos (rua, ciade etc..)

 

Após me logar com o usuário quero cadastrar um Anunciante.

porém os dados do anunciantes estão nas tabelas 

relacionadas descritas acima.

 

01 - Bom, ao cadastrar o anunciante, ele receberá o código

do usuário logado em uma chave estrangeira.

Como obter o id do usuario logado no momento?

 

02 - Como cadastrar os dados de todas as tabelas de uma

só vez visto que os dados das tabelas dados_pf, dados_pj, 

contatos e enderecos precisam do id do anunciante "anun_id"?

 

Existe uma forma de ao clicar no botão de cadastro ele

faça por etapas, por exemplo:

 

Envie primeiro os dados do Anunciante, que irá gerar o 

anun_id automaticamente com autoincremento, e irá capturar

o usu_id para a chave estrangeira.

 

E depois disso ele envia os demais dados e assim obtem o 

anun_id recem gerado para as chaves estrangeiras das demais

tabelas.

 

Obrigado a quem puder ajudar.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...
  • Solução

Olá amigo,

 

Vou tentar responder suas dúvidas.

 

1)

 

Quando um usuário se loga no sistema, provavelmente com login ou email que são campos textos, você deve validar o usuário e a senha.

 

Uma vez validado o usuário e senha, você deve guardar na memória do servidor o usuário da sessão (id dele).

 

Existem outras formas de fazer a mesma coisa, por exemplo:

 

Você pode ter um campo de id da sessão na tabela de usuário e atualizar com o id da sessão do usuário logado, então em toda requisição você busca o id da sessão na tabela do usuário pelo id de sessão que o browser enviou.

 

Você também poderia guardar o id do usuário em um cookie no browser e pegar esse id em toda a requisição. 

 

Você também pode trafegar o id do usuário em todas as requisições em campos hidden.

 

Eu utilizo a primeira opção, ou seja, após o usuário se logar, eu guardo o id dele na sessão do servidor.

 

Não se deve guardar muita coisa na sessão para não ocupar a memória do servidor que geralmente é baixa.

 

2)

 

Você não grava em tabelas diferentes de uma vez. Não tem um comando para fazer isso. Você grava tabela por tabela.

 

O que você precisa fazer é criar uma transação e dentro da transação você vai enviar cada comando para o banco. No final você faz o commit ou, se der erro, você captura o erro (catch) e faz o rollback.

 

Provavelmente o id do anunciante é um campo serial ou auto incremento. Então você não passa esse campo no seu insert do anunciante, para que o mysql automaticamente insira o próximo.

 

Depois que você inseriu na tabela de anunciante, você deve executar um outro comando para obter o último serial inserido para a conexão, ou seja, exatamente o id do anunciante que acabou de inserir. Para obter ele você executa a função LAST_INSERT_ID().

SELECT LAST_INSERT_ID();

Então você pode inserir nas outras tabelas usando o ID retornado pela função.

 

Abs.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderador

Praticamente já falaram quase tudo.. mas eu digo que você manipula isso pela linguagem de programação(PHP).

 

No script php que você valida o usuário, você insere na variável de sessão o ID do usário. assim você sabe qual é o usuário logado no momento.

 

Sobre seu banco de dados,  normalmente você precisa seguir as normas formais,  ou seja, deixar suas tabelas o mais "esmiuçadas" possíveis. por exemplo:

 

Tabela usuarios contendo dados do usuário, tabela anunciantes contendo os dados dos anunciantes... se o anunciante tiver mais de um telefone, crie uma tabela só para telefones...  e por ai vai,

Deve lembrar também que cada tabela DEVE ter um campo auto incrementado e   deve conter um campo para receber o ID da chave primária, que chamamos de chave estrangeira.(so para fazer os relacionamentos)

Link para o comentário
Compartilhar em outros sites

Olá Smarthome e Dif, 
Obrigado pelas respostas, pesquisando bastante eu consegui fazer o que desejava.

Estou usando o Dreamweaver e ele gerou alguns código que eu não sei exatamente o que fazem, como ainda estou estudando em breve descobrirei.
Mas analisando o código eu tentei descobrir algo e separei as partes dos códigos  com os comentários para estudar futuramente e até me ajudar a reproduzir o cadastro de dados em outras situações.

Alguém poderia olhas o meu código e os comentários e me ajudar a corrigir algo que talvez eu tenha escrito errado ou até acrescentar alguma explicação sobre o procedimentos que o código está fazendo?

Muito obrigado.

 

<!-- LIGAÇÃO rs_anunciantes_dados E ENVIA DADOS PARACADASTRO DE ANUNCIANTE NO BANCO DE DADOS --><?php/* ESTE CÓDIGO SERVE TANTO PARA O RECORDSET QUANTO PARA O ENVIO DE DADOS */if (!function_exists("GetSQLValueString")) {function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") {  if (PHP_VERSION < 6) {    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;  }  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);  switch ($theType) {    case "text":      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";      break;        case "long":    case "int":      $theValue = ($theValue != "") ? intval($theValue) : "NULL";      break;    case "double":      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";      break;    case "date":      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";      break;    case "defined":      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;      break;  }  return $theValue;}}/* CÓDIGO DO RECORDSET RS_ANUNCIANTES_DADOS__F_MM_USERNAME */$colname_rs_anunciantes_dados_f_mm_username = "-1";if (isset($_SESSION['MM_Username'])) {  $colname_rs_anunciantes_dados_f_mm_username = $_SESSION['MM_Username'];}mysql_select_db($database_conSisDtv, $conSisDtv);$query_rs_anunciantes_dados_f_mm_username = sprintf("SELECT * FROM anunciantes_dados_view WHERE anun_usu_login = %s", GetSQLValueString($colname_rs_anunciantes_dados_f_mm_username, "text"));$rs_anunciantes_dados_f_mm_username = mysql_query($query_rs_anunciantes_dados_f_mm_username, $conSisDtv) or die(mysql_error());$row_rs_anunciantes_dados_f_mm_username = mysql_fetch_assoc($rs_anunciantes_dados_f_mm_username);$totalRows_rs_anunciantes_dados_f_mm_username = mysql_num_rows($rs_anunciantes_dados_f_mm_username);/* CÓDIGO DO ENVIO DE DADOS AO BANCO DE DADOS */$editFormAction = $_SERVER['PHP_SELF'];if (isset($_SERVER['QUERY_STRING'])) {  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);}/* Insere os dados da tabela ANUNCIANTES */if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {  $insertSQL = sprintf("INSERT INTO anunciantes (anun_responsavel, anun_ativo, anun_parceiro, anun_usu_login) VALUES (%s, %s, %s, %s)",                       GetSQLValueString($_POST['anun_responsavel'], "text"),                       GetSQLValueString(isset($_POST['anun_ativo']) ? "true" : "", "defined","1","0"),                       GetSQLValueString(isset($_POST['anun_parceiro']) ? "true" : "", "defined","1","0"),                       GetSQLValueString($_POST['usu_login'], "text"));  mysql_select_db($database_conSisDtv, $conSisDtv);  $Result1 = mysql_query($insertSQL, $conSisDtv) or die(mysql_error());/* SELECIONA ULTIMO ID REGISTRADO NO ANUN_ID */		$sqlUltimo = "SELECT MAX(anun_id) as id FROM anunciantes";	$ResultUlt = mysql_query($sqlUltimo, $conSisDtv) or die(mysql_error());					   		while($linha = mysql_fetch_array($ResultUlt)){		$ultimo_numero = $linha['id'];	}  mysql_select_db($database_conSisDtv, $conSisDtv); /* Insere os dados da tabela DADOS_PF */		     $insertSQL = sprintf("INSERT INTO dados_pf (dpf_nome, dpf_est_civil, dpf_rg, dpf_cpf, dpf_dt_nasc, dpf_anun_id) VALUES (%s, %s, %s, %s, %s, %d)",                       GetSQLValueString($_POST['dpf_nome'], "text"),                       GetSQLValueString($_POST['dpf_est_civil'], "text"),                       GetSQLValueString($_POST['dpf_rg'], "text"),                       GetSQLValueString($_POST['dpf_cpf'], "int"),					                          GetSQLValueString($_POST['dpf_dt_nasc'], "date"),					                          GetSQLValueString($ultimo_numero, "int"));				     mysql_select_db($database_conSisDtv, $conSisDtv);   $Result1 = mysql_query($insertSQL, $conSisDtv) or die(mysql_error());/* Insere os dados da tabela DADOS_PJ */		     $insertSQL = sprintf("INSERT INTO dados_pj (dpj_razao_social, dpj_fantasia, dpj_cnpj, dpj_insc_est, dpj_anun_id) VALUES (%s, %s, %s, %s, %d)",                       GetSQLValueString($_POST['dpj_razao_social'], "text"),                       GetSQLValueString($_POST['dpj_fantasia'], "text"),                       GetSQLValueString($_POST['dpj_cnpj'], "int"),                       GetSQLValueString($_POST['dpj_insc_est'], "text"),                       GetSQLValueString($ultimo_numero, "int"));				     mysql_select_db($database_conSisDtv, $conSisDtv);   $Result1 = mysql_query($insertSQL, $conSisDtv) or die(mysql_error());/* Insere os dados da tabela CONTATOS */		     $insertSQL = sprintf("INSERT INTO contatos (conta_tel1, conta_tel2, conta_email, conta_anun_id) VALUES (%s, %s, %s, %d)",                       GetSQLValueString($_POST['conta_tel1'], "text"),                       GetSQLValueString($_POST['conta_tel2'], "text"),                       GetSQLValueString($_POST['conta_email'], "text"),                       GetSQLValueString($ultimo_numero, "int"));				     mysql_select_db($database_conSisDtv, $conSisDtv);   $Result1 = mysql_query($insertSQL, $conSisDtv) or die(mysql_error());/* Insere os dados da tabela ENDERECOS */		     $insertSQL = sprintf("INSERT INTO enderecos (end_pais, end_estado, end_cidade, end_bairro, end_rua, end_numero, end_obs, end_cep, end_anun_id) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %d)",                       GetSQLValueString($_POST['end_pais'], "text"),                       GetSQLValueString($_POST['end_estado'], "text"),                       GetSQLValueString($_POST['end_cidade'], "text"),                       GetSQLValueString($_POST['end_bairro'], "text"),                       GetSQLValueString($_POST['end_rua'], "text"),                       GetSQLValueString($_POST['end_numero'], "text"),                       GetSQLValueString($_POST['end_obs'], "text"),					                          GetSQLValueString($_POST['end_cep'], "text"),					                          GetSQLValueString($ultimo_numero, "int"));				     mysql_select_db($database_conSisDtv, $conSisDtv);   $Result1 = mysql_query($insertSQL, $conSisDtv) or die(mysql_error());/* Redireciona após cadastro e passa o último_numero "id", como parametro */    $insertGoTo = "anunciantes_dados.php?anun_id=" . $ultimo_numero . "";  if (isset($_SERVER['QUERY_STRING'])) {    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";    $insertGoTo .= $_SERVER['QUERY_STRING'];  }  header(sprintf("Location: %s", $insertGoTo));}?>
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!