-
Conteúdo Similar
-
Por eacpaula
Olá Pessoal!
Estou com problema para inserção de tabelas relacionadas, pesquisei diversos sites e fóruns para tentar entender qual seria a melhor forma.
Então, vi que precisaria capturar o último ID inserido da tabela pai (coluna autoincrement) para chave pk da tabela filha, encontrei os seguintes métodos:
LAST_INSERT_ID() - MYSQL
mysql_insert_id() - PHP
lastinserid() - PDO
Realmente, tive uma exaustiva tentativa de uso destes métodos, não sou experiente com PHP e tenho bastante dificuldade.
Além deste problema de inserção de tabelas relacionadas, nesta ocasião a uma "coluna pk" que não vou precisar preencher, porém, como é obrigatório o preenchimento, após não saberei como proceder.
Então vamos ao meu cenário:
//DADOS BANCARIOSCREATE TABLE IF NOT EXISTS `dados_bancarios_pf` ( `id` int(11) unsigned NOT NULL, `banco` varchar(50) NOT NULL, `agencia` varchar(15) NOT NULL, `conta` varchar(15) NOT NULL, `tipo` varchar(30) NOT NULL, `titular` varchar(50) NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;//CLIENTESCREATE TABLE IF NOT EXISTS `clientes_pf` ( `id` int(11) unsigned NOT NULL, `banco_id` int(11) unsigned NOT NULL, `titulo_id` int(11) unsigned NOT NULL, `nome` varchar(20) NOT NULL, `sobrenome` varchar(50) NOT NULL, `nome_completo` varchar(70) NOT NULL, `cpf` varchar(11) NOT NULL, `rg` varchar(10) NOT NULL, `cep` varchar(8) NOT NULL, `endereco` varchar(45) NOT NULL, `bairro` varchar(30) NOT NULL, `cidade` varchar(50) NOT NULL, `estado` varchar(30) NOT NULL, `pais` varchar(30) NOT NULL, `telefone_residencial` varchar(11) NOT NULL, `celular` varchar(11) NOT NULL, `email` varchar(50) NOT NULL, `cargo` varchar(30) NOT NULL, `sexo` varchar(12) NOT NULL, `estado_civil` varchar(12) NOT NULL, `data_nascimento` date NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; a coluna abaixo, no cadastro de clientes não precisa ser iniciada visto que de primeiro momento é só cadastro de clientes
`titulo_id` int(11) unsigned NOT NULL, Quanto ao código php que segue abaixo, está bem básico, sei que posteriormente tenho que ver algo para consultar se os dados já existem e deixar de uma forma mais consistente, porém, de momento gostaria de entender bem este insert com tabelas relacionadas:
<?php include "../include/conecta_banco.inc"; require_once ('../include/funcoes.php'); conexao(); //dados bancarios $banco = $_POST["bancoPF"]; $agencia = $_POST["agenciaPF"]; $conta = $_POST["contaPF"]; $tipo = $_POST["tipoBancoPF"]; $titular = $_POST["titularPF"]; $string_sql_banco = "INSERT INTO dados_bancarios_pf (banco, agencia, conta, tipo, titular) VALUES ('$banco','$agencia','$conta','$tipo','$titular')"; /*RECUPERANDO ÚLTIMO ID - TENTATIVA COM FUNÇÃO NATIVA PHP $ref_id_banco = mysql_insert_id($link); printf ("Nova gravação dos dados bancários inserida com o id %d.\n", $ref_id_banco); */ //RECUPERANDO ÚLTIMO ID - TENTATIVA COM COMANDO MYSQL $consult_last_id = "SELECT LAST_INSERT_ID()"; //CONSULTA $resultado = mysql_query($consult_last_id) or die ("PROBLEMAS COM A CONSULTA; ".mysql_error()); // CONSULTA ENVIADA AO SGBD $ref_id_banco = mysql_fetch_row($resultado); // RECUPERANDO O QUE FOR RETORNADO EM UM ARRAY - $ref_id_banco echo $ref_id_banco[0]; /* //RECUPERANDO ÚLTIMO ID - TENTATIVA 2 COM COMANDO MYSQL $consult_last_id = "SELECT LAST_INSERT_ID() AS id FROM dados_bancarios_pf"; $resultado = mysql_query($consult_last_id) or die ("PROBLEMAS COM A CONSULTA; ".mysql_error()); $ref_id_banco = mysql_result ($resultado, 0, 'id'); echo $ref_id_banco[0]; */ //dados do cliente $nome = $_POST["nomePF"]; $sobrenome = $_POST["sobrenomePF"]; $nome_completo = $_POST["nomeCompletoPF"]; $rg = $_POST["rgPF"]; $cpf = $_POST["cpfPF"]; $cep = $_POST["cepPF"]; $endereco = $_POST["enderecoResidencial"]; $bairro = $_POST["bairroPF"]; $cidade = $_POST["cidadePF"]; $estado = $_POST["estadoPF"]; $pais = $_POST["paisPF"]; $telefone_residencial = $_POST["telPF"]; $celular = $_POST["celPF"]; $email = $_POST["emailPJ"]; $cargo = $_POST["cargoPF"]; $sexo = $_POST["sexoPF"]; $estado_civil = $_POST["estadoCivilPF"]; $data_nascimento = $_POST["dataNascimentoPF"]; $string_sql_cliente = "INSERT INTO clientes_pf (id, banco_id, titulo_id, nome, sobrenome, nome_completo, cpf, rg, cep, endereco, bairro, cidade, estado, pais, telefone_residencial, celular, email, cargo, sexo, estado_civil, data_nascimento) VALUES (null,'$ref_id_banco',null,'$nome','$sobrenome','$nome_completo','$cpf','$rg','$cep','$endereco','$bairro','$cidade','$estado','$pais','$telefone_residencial','$celular','$email','$cargo','$sexo','$estado_civil','$data_nascimento')"; if (inserir($string_sql_banco)){ if (inserir($string_sql_cliente)){ echo ('Registros incluídos com sucesso! <a href="">voltar</a>'); }else{ echo('<p align=center>Erro durante a inserção de registros! - Cliente PF <a href="">voltar</a></p>'). mysql_error(); } }else{ echo('<p align=center>Erro durante a inserção de registros! - Dados Bancários <a href="">voltar</a></p>'). mysql_error(); }?> Então como podem ver constam as minhas tentativas de captura, sendo que a mais assertiva foi a "primeira tentativa com comando", pelas minhas pesquisas, ví que melhor opção seria com o comando de SQL, pois:
Retorna sempre o último ID num sério de inserções múltiplas e é o mais seguro;
Quero fazer esta implementação sem gambiarras usando um select para ver o último ID inserindo, quero sempre implementar com as melhores práticas possíveis para poder levar este conhecimento em qualquer cenário, agradeço muiiiiitíssmo a ajuda!
Se alguém puder me dar um help?
-