Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por DiF,

Posts recomendados

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/

 

Link para o comentário
Compartilhar em outros sites

  • Moderador
  • Solução

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Moderador

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

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