Ir ao conteúdo
  • Cadastre-se
lgwebforum

RESOLVIDO Como Cadastrar dados em tabelas relacionadas

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
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));}?>

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×