Ir ao conteúdo

PHP Como armazenar vários dados do mesmo tipo no banco de dados com PHP?


Ir à solução Resolvido por DiF,

Posts recomendados

Postado

Boa tarde, 

 

estou programando um site utilizando HTML, CSS, PHP e SQL, porém estou com um problema.

 

tenho uma tabela de médicos no banco de dados, e esses médicos podem ter ter várias especialidades. Para isso, usei um código que mostra dinamicamente vários campos de preenchimento para que o médico indique suas especialidades.

A minha dúvida é: como faço para armazenar todas as especialidades do médico através do PHP? Normalmente usa-se essa linha para guardar somente um valor:

$espec = $_POST['especialidade'];

Mas e para guardar várias especialidades considerando que o médico pode ter 1, 2, 3, até 10 especialidades? usa-se algum laço de repetição?

 

Segue também o link do fórum que peguei o código como base: https://forum.imasters.com.br/topic/325267-resolvido-adicionar-remover-campos-dinamicamente/

 

  • Moderador
  • Solução
Postado

@BlackM00n_ Olá.

 

O melhor jeito de resolver esse problema é modelar seu banco de dados para que siga as normalizações do banco de dados.

Vai resolver ele usando a terceira norma formal. 

 

Com base nisso, crie uma tabela chamada "especialidade", onde nela irá conter os seguintes campos:

ID auto incrementado, Nome da especialidade.

 

Com esta tabela, você vai criar uma tabela N:N  fazendo a relação com a tabela espacialidade e a tabela de médicos.

Exemplo visual:

 

Tabela especialidade:

ID  nome
1   Cirurgia geral
2   Dermatologia
3   Endoscopia

Tabela medico

ID nome          registro      email
1  Fulano        38274697234   [email protected]
2  Beltrano      38274697234   [email protected]
3  Ciclano       38274697234   [email protected]

 

Agora a tabela N:N que podemos chamar de  medico_especialidade

ID  ID_medico   ID_especialidade
1       1             1 
2       1             2 
3       2             3 
4       3             1
5       3             3

Vendo a relação das tabelas podemos afirmar que:

O médico Fulano tem as especialidades de Cirurgia Geral e Dematologia

O médico Beltrano tem apenas a especialidade de Endoscopia

O médico Ciclano tem a especialidade de Cirurgia Geral e Endoscopia.

 

Para fazer a consulta e retornar os dados necessários faz da seguinte forma:

 

SELECT medico.nome AS medicos, 
       especialidade.nome AS especialidades 
FROM medico_especialidade
INNER JOIN medico ON medico.ID = medico_especialidade.ID_medico
INNER JOIN especialidade ON especialidade.ID = medico_especialidade.ID_especialidade

 

Lembrando que nesta tabela medico_especialidade, precisa criar os índices(index) de referência para os campos ID_medico e ID_especialidade, pois elas são a chave estrangeira, que farão a ligação com a chave primária das outras tabelas respectivas. 

 

O resultado da consulta acima se bem sucedido ficará assim:

ID medicos  especialidades
 1  Fulano   Cirurgia Geral
 2  Fulano   Dematologia
 3  Beltrano Endoscopia
 4  Ciclano  Cirurgia Geral
 5  Ciclano  Endoscopia

Agora voltando ao PHP,  você pode fazer um array de especialidades baseado em checkbox, multiple select.. 

Então vai percorrer este array com um foreach e fazer um insert into nas tabelas do médico e do medico_especialidade. 

No caso você vai fazer primeiro o insert na tabela de médico e resgatar o ultimo ID inserido, para que seja possível armazenar também na tabela medico_especialidade.

 

Para resgatar o último ID inserido,  usa-se a função  mysqli_insert_id()

 

Exemplo:

 

//Conexao com o banco de dados
$conn =  mysqli_connect("host", "usuario","senha","nome_do_BD");

//recebe os dados do formulário
$nome = $_POST['nome'];
$registro = $_POST['registro'];
$email = $_POST['email'];
//este aqui recebe um array de elementos. seja por checkbox ou multiple select
$espec = $_POST['especialidade'];

//insere na tabela medico primeiro
$mysqli_query($conn, "INSERT INTO medico(nome, registro, email) 
                      VALUES('$nome','$registro','$email')");

//recupera o id do médico
$id_medico = mysqli_insert_id($conn);

//percorre o array de especialidades e cria um insert into para cada especialidade.
foreach($espec as $especialidade):
      $mysqli_query($conn, "INSERT into medico_especialidade(ID_medico, ID_especialidade) 
                            VALUES($id_medico, $especialidade)");
endforeach;

 

Lembrando que o código acima é só um exemplo, por isso use ele somente para estudar e implementar o seu código. 

PS: Não testei nenhum dos códigos. 

Boa sorte.:thumbsup:

  • Curtir 2
  • Obrigado 1
Postado

Olá...

 

Eu acho que PRIMEIRO: para que você grave varias especialidades, você deve ter um banco de dado, mas com tabelas especificas para cada uma das especialidades tipo.

Ex.: Lá no MySQL"Banco de dado" deve ser ter um

Banco tipo: Especialistas.

E tabelas dos especialistas tipo: tb_cardiologista, tb_ortopedista, tb_radiologista...

 

Dai, para gravar especificamente nestas tabelas, user os campos criados para enviar os dados para cada tabela das especialidades.

 

Vou mostra um exemplo1 para a tb_cardiologista.:

1 - No formulário PHP com os campos básico de inserção de dados tipo.

 

Nome do Médico: Mhygay leth brow

Nome do paciente: Throw gree

Horário: 9:00 AM

Data: 19/11/2018

==========================

O metodo POST pega os dados dos campos acima, e envia para o comando abaixo, que mostra o exemplo:

 

 INSERT INTO tb_cardiologista (nome_m, nome_p, hora, data) value('$nome_m ','$nome_p ','hora ','data ');

 

Vou mostra outro exemplo2 para a tb_ortopedista.:

2 - No formulário PHP com os campos básico de inserção de dados tipo.

 

Nome do Médico: Magarena rion hof

Nome do paciente: Rhebeca methe

Horário: 11:00 AM

Data: 21/11/2018

==========================

O metodo POST pega os dados dos campos acima, e envia para o comando abaixo, que mostra o exemplo:

 

 INSERT INTO tb_ortopedista (nome_m, nome_p, hora, data) value('$nome_m ','$nome_p ','hora ','data ');

 

Dai os dados são enviado para a tb_ortopedista, e o mesmo acontece se criar para o comando tb_radiologista.

 

Mas se deseja para todos como você falou: eu acho errado! pois a tabela será atualizado, de maneira desorganizado em todos. Pelo menos em minha lógica já que cada pessoas faz de acordo com a sua lógica.

 

O mesmo comando de inserção de dados seria, mas usando um IF, para saber se é para todos ou não em um arquivo, os comandos.:

 

Veja bem! no formulário já criado como os mesmo campos, e em action, Digite "nome_da_pagina.php?GUARDAR=GRAVAR" <-Este comando do lado, envia os dados do formulário para a pagina das configurações que é: nome_da_pagina.php. Seguida, manda para o servidor MySQL local. 

 

Lembro a você que para enviar os dados do formulário, você deve criar uma conexão com o banco de dado para que os dados seja enviado para o Banco do MySLQ. Já que criamos o  exemplo acima Banco: "Especialistas".

 

Supondo que esta pagina teria o link:nome_da_pagina.php, o comando para gravar os dados seria:

IF($_GET['GUARDAR'] == "GRAVAR"){

INSERT INTO tb_cardiologista (nome_m, nome_p, hora, data) value('$nome_m ','$nome_p ','hora ','data ');



INSERT INTO tb_ortopedista (nome_m, nome_p, hora, data) value('$nome_m ','$nome_p ','hora ','data ');



INSERT INTO tb_radiologista (nome_m, nome_p, hora, data) value('$nome_m ','$nome_p ','hora ','data ');

}

 

Desta forma, tudo que for enviado do formulário, passa direto para a pagina de configuração"nome_da_pagina.php" vai para o Banco"Especialistas", e grava nas Tabelas: tb_cardiologista, tb_ortopedista, tb_radiologista.

 

Espero que tenha entendido e espero que seja de muita utilidade.

Espero ter ajudado e até...

 

 

 

  • Obrigado 1
  • Moderador
Postado

@LuisOPsum Só fico me perguntando, porque você recomendaria violar as boas práticas e normalização de banco de dados criando uma tabela para cada tipo de especialidade, onde nela poderá repetir o nome do médico em cada uma delas?

Imagina se o sistema possuir 215 especialidades.  Vai ter 215 tabela de acordo com sua lógica? 😁

 

Recomendo para você também estudar o método de como eu postei mais acima, que vai otimizar o banco de dados.

Basicamente é melhor pensar que 1 tabela para todas as especialidades, uma tabela para todos os médicos e uma tabela que faz a relação da especialidade com o médico. é bem simples e mais eficiente! :thumbsup:

 

 

  • Obrigado 1
Postado

Olá...@DiF

Acredito que seja  mais por organização de usar uma tabelas especifica para cada especialista. Inclusive, para futuros Backup sobre o Banco. E também, vai facilitar muito para um desenvolvedor poder inserir, editar e até excluir dados na Tabela especifica para cada profissional, enviando dados para todas as tabelas através de um único formulário.

 

Ex.: Se eu tenho um Banco para os profissionais:

Banco: Especialista_medico

Banco: Especialista_seguranca.

 

Isto facilitaria bastante, porque vai distinguir de um banco para outro, para identificar em qual profissição, seria direcionado as informações .

Completando o raciocínio: para o 

Banco: Especialista_medico

Minhas tabelas seriam:  tb_cardiologista, tb_ortopedista, tb_radiologista...

 

Banco: Especialista_seguranca.

Minhas tabelas seriam: tb_seg_portaria, tb_seg_camera, tb_seg_patio...

  

Por isso, eu vejo este lado como forma de ser bem mais elaborado pensado diferentes de alguns claro.

 

Sabendo claro, que uma tabela pode servir para muita  coisas. E que se eu incluir tudo numa só tabela, com certeza, isso futuramente, será uma grande dor de cabeça para os desenvolvedores, e coleta de informações...

 

Espero ter sido bem explícido sobre essa pequena tese, mas claro que sua mensagem é bem vindo para ajudar não só a mim, mas também, a todos que interagem no Clube do Hardware.

 

Obrigado e até...

  

  • Curtir 1
Postado

@DiF muito obrigada pela explicação, percebi que o que estava faltando era o inner join, pois já tenho as tabelas de especialidade e médicos, e por ser um relacionamento N:N, coloquei uma entidade associativa entre elas, recebendo as FKs. Amanhã tentarei implementar com o inner join e qualquer dúvida volto nesse post mesmol

adicionado 6 minutos depois

@LuisOPsum muito obrigada pela resposta! Entendo o seu ponto de vista, entretanto, como sou estudante e estou aprendendo sobre normalização, não posso quebrar as regras.

Além disso, o objetivo desse trabalho seria buscar atender um hospital, que pode ter muitas especialidades diferentes, mas com os mesmos atributos (id, nome e descrição), então pra mim acabaria se tornando inviável tanto para implementação quanto para manutenção.

  • Curtir 1
Postado

Olá...

Verdadeiramente correto...

Eu não lembrei de usar na minha simulação, de pegar as informações pelo ID de identificação no banco.

Mas a lógica sobre o caso, é quase o mesmo que o de @DiF , porém por aqui, eu não fiz nenhuma simulação real pelo software. Apenas tudo foi feito em mente apenas para ajudar a explanar o tema. Em fim, a forma que @Dif diz, é bem mais exata que o meu na pratica sem simulação.

Felicidades e até...

Espero ter ajudado e até...

 

  • Curtir 1
  • Obrigado 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!