Ir ao conteúdo
  • Cadastre-se

PHP Buscar dados de duas tabelas e preencher informações conforme ID


Ir à solução Resolvido por DiF,

Posts recomendados

Olá! Bom, tenho duas tabelas e queria buscar a visualização dos dados delas por um ID em comum.

Em si, tenho uma tabela orcamentos:
image.png.55d83a4f371ea1366232f3e7e9dc2259.png

 

E tenho uma tabela de clientes_registros:

image.png.b31d071bb6464d023bb7b5275a75bae9.png

 

Então gostaria de juntar as duas tabelas para exibir informações, com esses dados consigo pegar pelo ID os dados da tabela orcamentos, e com eles consigo dar um echo nos campos e escrever em um campo o valor.

$id = $_GET['id'];
    
    $sqlSelect = "SELECT * FROM orcamentos WHERE id=$id";

    $result = $conn->query($sqlSelect);
    
    if($result->num_rows > 0){
    
    while($user_data = mysqli_fetch_assoc($result))
    {
	$cliente = $user_data['cliente'];
	$id_cliente = $user_data['id_cliente'];
	$equipamento = $user_data['equipamento'];
    $dataserv = $user_data['dataserv'];
    $datavalserv = $user_data['datavalserv'];
    // SERVIÇO 1
    $descricaoserv = $user_data['descricaoserv'];
    $quantidade = $user_data['quantidade'];
    $valorunit = $user_data['valorunit'];
    $desconto = $user_data['desconto'];
    $resultado = $user_data['resultado'];

E por fim, gostaria de exibir os dados do cliente nos campos também, mas não consegui associar as tabelas.

A minha dúvida final é: Como consigo puxar dados da tabela clientes_registros pelo ID dela, tendo o dado id_cliente igual ao ID real do cliente e jogar na tela as informações que faltam. Foi o máximo que consegui explicar kk, enfim, quero preencher os campos que faltam ali embaixo.

 

Minha visualização disso em uma outra pagina, atualmente é assim:

image.thumb.png.737e3bf60bba6da4609d2e1ba599f075.png

 

 

Link para o comentário
Compartilhar em outros sites

  • Moderador
  • Solução

@Fernando V Nogueira Para responder a essa dúvida, preciso entrar no mérito de modelagem de banco de dados.

 

Basicamente, o banco de dados possui normas formais, a fim de evitar inconsistências e problemas. 

Você tem aí duas tabelas,  onde o orçamento é dependente da tabela de clientes.

 

Naturalmente, precisa haver uma relação de 1:N  entre essas duas tabelas. Porém,  para juntar as duas em uma só,  ou você cria uma View ou você cria uma outra tabela que faz um relacionamento de N:N entre essas duas.

 

Porém,  antes de pensar nisso, você precisa modelar seu banco de dados, aplicando pelo menos a  1NF e a 2NF.

Para isso, você precisa criar novas tabelas, para separar alguns dados

 

Por exemplo,  a tabela orçamentos, 

remova o campo cliente, pois esse dado já consta na tabela clientes, pois é o campo "fantasia",  a descrição de serviço, altere para receber um valor ID de chave estrangeira.
Dito isso, você vai criar uma nova tabela chamada "servico", onde vai constar os tipos de serviços.

Talvez, queira aplicar isso também, no campo equipamentos, pois se você tem um campo no formulário para escolher o tipo de equipamento, é melhor do que escrever... então aí uma nova tabela é criada para equipamentos.

Na tabela de clientes, remova os campos de  whatsapp e telefone pois estes dois, você irá criar uma nova tabela para contatos, onde nesta tabela recebe o campo ID do cliente.

Se o cliente tiver por exemplo mais de um endereço, em caso de filiais,  é interessante também criar uma nova tabela para conter estes dados.

Lembrando que para fazer os relacionamentos, é necessário que definas um índice(index) na tabela que vai receber a chave estrangeira.. e definir para que quando uma linha da tabela mandante(clientes) for excluida, uma linha referente a ela seja excluída nas outras também, para evitar inconsistências.  Você pode fazer isso tudo pelo phpmyadmin e para  fazer o relacionamento em si, pode usar o modo designer do phpmyadmin.

Dito tudo isso, fazendo as tabelas e relacionamentos corretamentes, você poderá fazer a tabela N:N que juntará tudo...

No caso esta tabela de N:N, só receberá campos IDs de chave primária...


e ficaria algo assim:

id   id_cliente   id_orcamento
1        76           14


E a consulta para pegar TODOS os dados de TODAS as tabelas e juntar em uma só seria algo assim:

SELECT clientes_registros.razaosocial, 
               clientes_registros.fantasia, 
               clientes_registros.telefone, 
               clientes_registros.cep, 
               clientes_registros.estado, 
               clientes_registros.cidade, 
               clientes_registros.endereco, 
               clientes_registros.bairro,  
               orcamentos.quantidade, 
               orcamentos.valorunit, 
               orcamentos.desconto, 
               orcamentos.resultado, 
               equipamentos.equipamento, 
               servico.descricaoserv 
FROM tabela_final 
INNER JOIN clientes_registros ON clientes_registros.id = tabela_final.id_cliente
INNER JOIN orcamentos ON orcamentos.id = tabela_final.id_orcamento
INNER JOIN equipamentos ON equipamentos.id = orcamentos.equipamento
INNER JOIN servico ON servico.id = orcamentos.descricaoserv
WHERE id_ciente = 76

 

Lembrando, que isso só irá funcionar SE e somente SE, você fazer corretamente os relacionamentos e tabelas.  Nesse exemplo, desconsiderei criação de nova tabela para contatos e endereços...  caso crie, aí teria que acrescentar mais um INNER JOIN para cada tabela nova criada.

No WHERE,  pelo php, você substitui o valor 76, pela variável $id_cliente... 

 

E uma dica, ao criar tabelas,  sempre use nomes no singular.    "cliente", "orçamento"..  e etc..  é mais pelas boas práticas.

Link para o comentário
Compartilhar em outros sites

@DiF

 

Parceiro, tive algumas dificuldades com o código do SQL, fiz como tu disse, criei as tabelas e fiz a ligação de chaves estrangeiras:

image.png.e2b714f28deed989a669873b44bd6643.pngimage.thumb.png.99f3abc2c22ed3bac619adf23d5e7bb4.png

 

Mas quando insiro um registro, ele não incrementa na id_cliente_p, tentei fazer a ligação direta com o ID do clientes_registros, mas não consigo inserir nenhuma informação no banco de dados. E estou utilizando esse código para inserir dados na tabela, todos eles vem de um arquivo em html com campos e envio essas informações por eles, mas com o código está tudo certo, somente no SQL que estou tendo problemas.

    $result_usuario = "INSERT INTO clientes_registros
	(razaosocial, responsavel, cnpj, email, fantasia, cadastro, cep, estado, cidade, endereco, bairro) VALUES 
	('$txt_razaosocial','$txt_responsavel','$txt_cnpj','$txt_email','$txt_fantasia','$txt_cadastro',
	'$txt_cep','$txt_estado','$txt_cidade','$txt_endereco','$txt_bairro')";
	$resultado_usuario = mysqli_query($conn, $result_usuario);
	
	$result_contato = "INSERT INTO contatos
	(whatsapp, telefone) VALUES
	('$txt_whatsapp','$txt_telefone')";
	$resultado_contato = mysqli_query($conn, $result_contato);

 

Queria preencher o id_cliente_p com o id do cliente, mas não estou conseguindo

 

Obs: Só não separei a tabela serviços ainda, pois queria testar essa questão citada.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Fernando V Nogueira Tem erros nas suas tabelas.

 

Na tabela clientes_registros,  você colocou o que chamamos de chave primária composta,  porém não é o caso. Você não precisa da chave primária composta. Esta tabela deve só conter o campo id como chave primária  com auto increment.  Da mesma forma, na tabela de contatos, o campo id_contato,  é uma chave primária auto increment, e nesta tabela deve conter uma chave estrangeira para receber o valor ID da tabela de clientes_registros.

 

Na tabela de equipamentos, o campo com chave primária auto increment, deve ser um ID,  O campo id_cliente precisa ser uma chave estrangeira, que irá receber o valor da chave primária da tabela clientes_registros.

 

Na tabela de orcamentos,   está correta, ali você tem um campo id como chave primária precisa ser auto increment,  e você tem um campo de chave estrangeira que é o id_cliente... Note que pelo modo designer do phpmyadmin,  você pode identificar que a chave estrangeira tem o simbolo de # azul e quando é chave primária é uma chave dourada.

 

Fora isso, alguns campos estão com tipos errados. em contatos, whatsapp e telefone,  deixe como  Varchar. 

Em equipamentos, o campo anofab, deixe como  date, ou  se preferir, pode usar datetime, pois inclui horas juntos. O campo descrição até pode deixar como text, caso seja um texto grande, caso contrário deixe como varchar e especifice um limite de caracteres.. por exemplo 100.   O campo identificador, eu não sei do que se trata, então não posso dizer que tipo de campo ele é.

 

Na tabela de orcamentos,  

o campo equipamento, está como text, onde deveria ser uma chave estrangeira, pois você tem uma tabela de equipamentos... esse campo será relacionado com a chave primaria da tabela de equipamentos.


O dataserv,  deve ser do tipo date ou datetime,  o mesmo para datavalserv pois é uma data.. então deve usar o campo especifico para datas.
O campo descricaoserv é o mesmo caso de descricao,  se for um texto grande, pode usar text, caso contrário deixe como varchar e limite os caracteres.
O campo de quantidade, é um valor numérico.. e inteiro, então deixe como INT e especifique um limite.. por exemplo  3 unidades, no caso o limite dele ficaria com 999.. então ficaria como  INT(3)
O campo valorinit, como é um valor monetário, deve ser do tipo Double com limite  9,2.. ou seja  Double(9,2) onde o 2, é o limite de casas decimais.
O desconto é um valor numérico.. e inteiro então.. use INT(2) porque o limite de 3 números.. no caso vai de 0 a 99, a não ser que você queira colocar 100 por centro de desconto.. aí você troca pra 3.
O campo resultado é desnecessário, pois ele seria o resultado de um cálculo de um valor monetário... .     por exemplo  se no campo quantidade tiver 3,   mas o valor unitario é de 50,  o campo resultado terá um valor de 150...  ou seja.. esse campo receberá o resultado da operação multiplicação ou soma(sum)...

Agora de cabeça não lembro exatamente os calculos.. mas basicamente, no SQL, é permitido fazer consultas colocando somas, multiplicações... subtrações e etc

 

 

Do jeito que está, provavelmente não iria dar muito certo. 

 

Uma vez, eu fiz um pequeno tutorial em vídeo  sobre relacionamentos e criação deles no phpmyadmin..  não é exatamente igual ao que você quer fazer, mas você pode usar a mesma lógica em algumas coisas... como criar as tabelas, usar o modo designer..e criar relacionamentos..

 

Aqui é a parte 1:

 

E aqui é a parte 2:

 

 

Os videos são antigos, mas ainda conseguem ensinar como fazer.  Nessa época, eu não tinha headset e nem mic, para poder falar no vídeo.. então ficou tudo em modo texto...

Acredito que com esses dois videos, você conseguirá implementar o que você deseja.. de forma certa.. no caso, o que mais vai te dar informações é o vídeo da parte 1, que é onde eu modelo o banco de dados.  Na parte dois é mais focado no php.

 

É claro, que no seu caso, o problema é bem mais embaixo do que esses do vídeo que eu mostrei.. mas você pode pegar a ideia básica.   No caso, de inserir o id do usuário em outra tabela,  no php, você pode usar a função mysqli_insert_id

 

No caso, você vai fazer um insert na tabela de clientes,  logo após, você  usa o mysqli_insert_id ...  para recuperar o ultimo id inserido, e aí fazer um novo insert, na outra tabela. 

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

@DiF Cara, simplesmente incrível! Obrigado demais por ter tirado minhas dúvidas novamente, fico muito agradecido pela ajuda! E os vídeos são ótimos sim! Deu pra pegar uma base bem bacana por eles, e a lógica que tu usou foi muito fácil de entender, sou acadêmico em CCO e isso foi muito melhor que uma aula! Valeu, abraços!

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!