Filtros e buscas com PHP e MySQL
Desenvolver com PHP e MySQL pode ser muito fácil e divertido, mas há certos momentos que nos deparamos com desafios interessantes. Um sistema, seja ele web ou desktop ou qualquer tipo de plataforma, não é um sistema de verdade se não tiver um filtro ou busca de dados detalhados que permitam aos usuários gerar relatórios e realizar análises para tomada de decisões.
Desenvolver um filtro não é nada difícil quando se utiliza um banco de dados relacional e uma linguagem flexível. Abaixo vou explicar como criar uma página com filtro bastante simples e eficiente. Como exemplo, vou usar uma relação de clientes cadastrados que devem ser filtrados por nome, cidade e estado e apresentar estes e outros dados referentes a eles. É claro que vamos usar banco de dados para isso.
Código para criar o banco de dados:
create table clientes (
id integer(10) not null primary key autoincrement,
nome varchar(50),
endereco varchar(200),
cidade varchar(100),
estado varchar(2),
telefone varchar(14),
email varchar(50)
);
INSERT INTO clientes (id, nome, endereco, cidade, estado, telefone, email)
VALUES (' ', 'José Antônio', 'R. das Orquídeas', 'Curitiba', 'PR', '(41) 3227-5059', 'jose.antonio@hotmail.com');
Abaixo temos o codigo HTML, PHP e MySQL que faz a busca no banco de dados e lista os clientes. Também está neste código os campos que farão o filtro quando for solicitado.
<table cellspacing='0' cellpadding='0' border='1' width='500'>
<tr>
<td colspan='7'>
<form name='busca' id='busca' action='index.php' method='GET'>
Nome: <input type='text' name='buscaNome' id='buscaNome' value=' ' />
Endereço: <input type='text' name='buscaCidade' id='buscaCidade' value=' ' />
UF: <input type='text' name='buscaUf' id='buscaUf' value=' ' />
<input type='submit' name='buscar' id='buscar' value='Buscar' />
</form>
</td>
</tr>
<tr>
<td>ID</td>
<td>Nome</td>
<td>Endereço</td>
<td>Cidade</td>
<td>UF</td>
<td>Telefone</td>
<td>E-mail</td>
</tr>
< ?php
$sqlClientes = "SELECT * FROM clientes";
if ($_GET['buscar'] == 'Buscar') {
// busca apenas por nome
if ($_GET['buscaNome'] != " " AND $_GET['buscaCidade'] == " " AND $_GET['buscaUf'] == " ") {
$sqlClientes .= " WHERE nome LIKE '%".$_GET['buscaNome']."%' ";
}
// busca apenas por cidade
else if ($_GET['buscaNome'] == " " AND $_GET['buscaCidade'] != " " AND $_GET['buscaUf'] == " ") {
$sqlClientes .= " WHERE cidade LIKE '%".$_GET['buscaCidade']."%' ";
}
// busca apenas por estado
else if ($_GET['buscaNome'] == " " AND $_GET['buscaCidade'] == " " AND $_GET['buscaUf'] != " ") {
$sqlClientes .= " WHERE estado LIKE '%".$_GET['buscaUf']."%' ";
}
// busca nome e cidade
else if ($_GET['buscaNome'] != " " AND $_GET['buscaCidade'] != " " AND $_GET['buscaUf'] == " ") {
$sqlClientes .= " WHERE nome LIKE '%".$_GET['buscaNome']."%' AND cidade LIKE '%".$_GET['buscaCidade']."%' ";
}
// busca nome e estado
else if ($_GET['buscaNome'] != " " AND $_GET['buscaCidade'] == " " AND $_GET['buscaUf'] != " ") {
$sqlClientes .= " WHERE nome LIKE '%".$_GET['buscaNome']."%' AND estado LIKE '%".$_GET['buscaUf']."%' ";
}
// busca cidade e estado
else if ($_GET['buscaNome'] == " " AND $_GET['buscaCidade'] != " " AND $_GET['buscaUf'] != " ") {
$sqlClientes .= " WHERE cidade LIKE '%".$_GET['buscaCidade']."%' AND estado LIKE '%".$_GET['buscaUf']."%' ";
}
// busca nome, cidade e estado
else if ($_GET['buscaNome'] != " " AND $_GET['buscaCidade'] != " " AND $_GET['buscaUf'] != " ") {
$sqlClientes .= " WHERE nome LIKE '%".$_GET['buscaNome']."%' AND cidade LIKE '%".$_GET['buscaCidade']."%' AND estado LIKE '%".$_GET['estado']."%' ";
}
} // fim do get_buscar
$queryClientes = mysql_query($sqlClientes) or die(mysql_error());
while ($rowCliente = mysql_fetch_array($queryClientes)) {
?>
<tr>
<td> < ? echo $rowCliente['id'];?> </td>
<td> < ? echo $rowCliente['nome'];?> </td>
<td> < ? echo $rowCliente['endereco'];?> </td>
<td> < ? echo $rowCliente['cidade'];?> </td>
<td> < ? echo $rowCliente['estado'];?> </td>
<td> < ? echo $rowCliente['telefone'];?> </td>
<td> < ? echo $rowCliente['email'];?> </td>
</tr>
< ? } ?>
</table>
Bom, vamos à uma breve explicação:
A página contém uma tabela onde serão organizados todos os dados que vêm do banco de dados. Na primeira linha da tabela, linha 02, existe um formulário com todos os campos de texto para entrarmos com nossas buscas.
A partir da segunda linha da tabela, linha 12, montamos o cabeçalho da grid. Entre esta linha e a terceira linha da tabela encontramos todo o SQL responsável por fazer a busca no banco. A lógica é simples: na linha 23 verificamos se foi o botão ‘buscar’ do formulário foi pressionado. Se foi, ele deve aparecer da seguinte maneira no fim da barra de endereços: “&buscar=Buscar”.
Caso o botão foi pressionado, então verificamos cada uma das possibilidades, ou seja, se foi digitado algum conteúdo nos campos nome, endereço e estado, realizando a busca conforme o que foi digitado. Repare que a consulta SQL foi iniciada na linha 22 e dentro dos IFs ela está sendo contatenada.
Sendo assim, caso não tenha ocorrido busca nenhuma, a execução do código não vai entrar no IF da linha 23 e o SQL executado será apenas o existente na linha 22.
A partir da linha 53 o SQL é executado. Na linha 54 iniciamos um WHILE para guardar no vetor $rowCliente o resultado da consulta e já percorrê-lo até o final, aproveitando-o para imprimir o resultado. Assim, da linha 56 até a 64 temos uma linha da tabela que terá em cada célula o conteúdo correspondente ao cabeçalho.
É isso aí! Claro que faltou o cabeçalho HTML da página e a conexão com o banco de dados. Isso vocês podem fazer da forma como quiserem.
Lembrem-se: ao copiar o código acima para um editor, repare se ele reconheceu alguns caracteres especiais como as aspas simples e duplas. Geralmente acontece erros em relação a isso.
Por hoje é isso. Deixem suas dúvidas nos comentários. Até o próximo post.
No related posts.
32 Comments + Add Comment
Got anything to say? Go ahead and leave a comment!
Categorias
Posts Recentes
- Formas normais e consultas com PHP e MySQL – Parte 02
- Formas normais e consultas com PHP e MySQL – Parte 01
- 3G, 3G+ e 4G: quais as diferenças entre essas tecnologias?
- 10 mitos da incompatibilidade nos navegadores para HTML/CSS/JS
- AgiDC – Metodologias Ágeis na prática
- Hackers x Crackers: Quem são os mocinhos?
- Utilidade pública – reimpressão de boletos bancários
- Criando um menu DropDown dinâmico com CSS3, PHP e MySQL
- Lendo e escrevendo arquivos de texto (.txt) com PHP
- Selecionando itens de registros com Javascript
Tags
Acessibilidade Acessórios apple apps banco de dados blog chefe Complementos Conhecimentos Gerais desenvolvedor web desenvolvimento designer e-mails firefox foco gmail google HTML internet Java Script javascript JQuery MySQL navegadores Novidades On-line Orientação a Objetos php POO profissionais programador Programação recursos segurança sistema Sistemas Operacionais site software Softwares tabela tarefas Tendências Tecnológicas Tutoriais usuário web
WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.




Posted under:
found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later
Muito bom seu script, foi o unico que achei na NET, deste tipo, parabéns. Eu sou estou tentando limitar um numero certo de resultado para o caso da pessoa não colocar todos os paramentros, teria como postar, ai ou mandar por e-mail, obrigado.
Oi, Leandro, tudo bem?
Obrigado pela visita e pelo comentário.
Para limitar o número de linhas no resultado você pode usar o LIMIT no SQL.
Por exemplo, entre as linhas 52 e 53 você pode adicionar assim:
$sqlClientes .= ” LIMIT 10 ORDER BY id DESC”;
Isso vai concatenar o SQL independente de haver ou não um busca, fazendo com que se exiba apenas os dez ÚLTIMOS registros (os mais atuais) gravados na tabela clientes.
É isso ae… Qualquer dúvida, posta denovo.
Dental Assistant,
thak you for your visit!
Any questions, please leave a post.
Cara, na boa, bota isso em um looping pra checar, menos chance de erro é meio exaustivo repetir um IF pra cada campo…
Ex:
$campos = array(‘buscaNome’ => ‘nome’, ‘buscaEndereco’ => ‘endereco’, ‘buscaCidade’ ‘cidade’, ‘buscaEstado’ => ‘estado’);
$out = array();
foreach ($campos as $key => $value) {
if (isset($_GET[$key])) {
$out[] = $key . ” LIKE %$value%”;
}
}
print_r(‘WHERE ‘ . join(‘ AND ‘, $out));
Opa!!
Mandrake, obrigado pela visita e pela dica.
Realmente dá para se fazer da forma que disse. Coloquei assim mais para efeitos de falicitar a aprendizagem do pessoal que está iniciando… é um pouco mais cansativo ficar repetindo… mas é melhor para entender.
De qualquer forma, sua dica é muito válida.
Obrigado.
Boa tarde,
Consegui resolver com a primeira forma, já na segunda não tive sucesso:
Segue o meu código sem sucesso :
/*
* 2°Forma
*/
$sql = “SELECT * FROM contatos “;
$campos = array(‘nome’ => $nome, ‘email’ => $email , ‘empresa’ => $empresa);
$out = array();
foreach ($campos as $key => $value) {
if (isset($_GET[$key])) {
$out[] = $key . ” LIKE %$value%”;
}
}
print_r(‘WHERE’ . join(‘AND’, $out));
Muito bom esse tuturial, parabens… para mim de um modo funcionou perfeitamente, fiz minhas alterações e deu certo, só que nos testes encontrei um problema e gostaria de ver se voce pode me ajudar,
a minha busca é feita entre duas datas e tambem um checkbox.
quando eu faço a busca entre as duas datas e um checkbox funciona perfeitamente, mas quando eu busco entre as duas datas e dois checkbox não busca nda, ou quando busco somente um campo individual também não funciona,
Voce sabe oque eu poderia fazer para arrumar isso?
Valew
Olá, Gustavo, tudo bem?
Primeiramente obrigado pela visita e pelos elogios. Fiquei feliz em saber que pude ajudar alguém.
Então, pelo que você me descreveu, vc deve colocar os dois checkboxes com nomes/ids diferentes, ou seja, não podem fazer parte de um grupo de checkbox, para verificá-los isoladamente se estão ou não marcados (true/false ou 0 e 1).
Caso seja necessário obrigatoriamente que os checkboxes estejam em um grupo (com o mesmo nome, mas ids diferentes), então a verificação é de acordo com o valor deles, mas utilizando o AND ou ainda o OU para analisar cada um dos valores.
Não sei se tentou dessa maneira. É difícil te dar uma opinião sem visualizar o código. Se for possivel, envie-me o código da forma como o adaptou e tentou fazer com dois checkboxes que dou uma olhada pra ti, blza?
Espero ter ajudado. Abs.
Oi Sergio Novelli,
Primeiramente, parabéns pelo post!
Aqui está dando o seguinte erro quando clico em buscar:
“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘LIKE ‘%Pri%” at line 1″
Criei a tabela no banco certinho, criei um arquivo chamado index.php e coloquei seu código, nas na hora que busco não me retorna nada!
Você sabe me dizer o que poder ser?
Muito obrigada!
Oi, Priscila.
Obrigado. Faço o que posso para ajudar assim como outros me ajudaram e ajudam ainda quando preciso.
O erro que reportou trata-se de sintaxe de SQL. Verifique o jogo de aspas simples e aspas duplas e também os pontos (de concatenação do PHP). É normal que se erre nesses caracteres quando se está iniciando no aprendizado de PHP/MySQL.
Outra dica é: se vc copiou do post, verifique se seu editor está reconhecendo as aspas (simples e duplas). Apague-as e digite-as novamente. Alguns editores não reconhece esses caracteres ao colar o código e aí acontece esses problemas de sintaxe.
Qualquer dúvida, entre em contato novamente.
Abs.
Olá…muito bom o post…era o que eu procurava, porém nao estou conseguindo filtrar.
Cadastrei dois “clientes” na tabela clientes e quando filtro pelo nome de qualquer um nao me retorna nada.
Algum ajuste a ser feito no codigo?
Obrigado.
Tudo bem, Rafael?
O único ajuste necessário é às suas necessidades. Coloque o um ” print $sql ” antes da execução do sql em si e verifique o que está tentando executar. Também verifique se a passagem de parâmetros do filtro está correta.
Qualquer coisa envie seu código para dar uma olhada (utilize o form de contato do blog, por favor).
Olá, código muito útil.. parabéns Sérgio!
Estou com um probleminha aqui, vamos ver se você consegue me ajudar. To desenvolvendo uma aplicação web e sua principal funcionalidade é consulta ao banco de dados. O negócio é o seguinte, tenho um formulário parecido com esse. O problema é que tem alguns dados que estão em outra tabela.
Ex: Tenho a tabela clientes e preciso fazer uma busca pelo estado, só que existe uma tabela especifíca para estado.. ou seja, estado é chave estrangeira na tabela cliente, ai teria que usar um join..
mas não sei como fazer.. se possível me da uma dica ai.
Desde já agradeço!
Robson, obrigado pela visita e comentário. É muito bom saber que nosso conhecimento é útil também fora do ambiente de trabalho. Vamos ver se consigo te ajudar.
Primeiramente, se você tem uma tabela “estados”, certamente tem uma tabela “cidades” e ambas estão vinculadas, correto? A tabela “clientes” deve estar vinculado a tabela “cidades” também.
Portanto, para fazer uma consulta de clientes por estado, nesse caso, o código é este:
SELECT clientes.*, cidades.*, estado.* FROM clientes
INNER JOIN cidades ON clientes.idcliente = cidades.idcidade
INNER JOIN estado ON cidade.idestado = estado.idestado
O código acima busca todos os campos das três tabelas e filtra o que você precisar vinculando essas tabelas através de suas chaves primárias e chaves estrangeiras. Com este SQL você consegue ter qualquer informação de qualquer uma das tabelas utilizadas.
Não sei se esse é o seu caso, mas tentei simplificar ao máximo. Em sistemas mais completos, com certeza haveriam outras tabelas envolvidas, como “endereço”, “telefones”, “regioes”, etc…
Espero ter ajudado… qualquer dúvida, comente ai.
Abs.
Sergio, muito legal sua atenção com os que acompanham o seu blog.. Tirando as dúvidas do pessoal. Está de parabéns!
Obrigado pela ajuda ai, entendi direitinho. Só mais uma coisa… como faço pra usar essa consulta ai no código que você postou, ou seja, utilizando a mesma estrutura. Será que é possível?
Forte abraço!
Robson,
pelo que vejo, você está montando seu banco de dados e já programando encima. Uma dica: Monte primeiro seu banco de dados com tudo o que você consegue imaginar que ele deve ter. Faça todos os relacionamentos entre as tabelas e deixe-o o mais próximo do que você precisa. Depois comece a programar, criar os cadastros e consultas encima desse banco, porque assim, as alterações que terá que fazer no banco serão de pouco impacto no seu sistema e se torna mais fácil fazer a manutenção.
Se queres mesmo montar um banco de dados bem estruturado para utilizar consultas como o código que te passei, sugiro a leitura de materiais de mysql. Leia e aprenda sobre banco de dados relacionais e as três normas para criar um banco com alta integridade de dados. No site http://www.apostilando.com/pagina.php?cod=1 tem muito material bom sobre isso. Dê uma olhada lá. Outra dica é participar do fórum de PHP/MySQL do iMasters… o pessoal lá é gente boa e vai te ajudar bastante a tirar dúvidas. (provavel que nos encontraremos por lá também
)
Obrigado pelas visitas. Espero ter ajudado.
Abs.
Infelizmente ele não retorna nada, perdi meu tempo!
Rene, estude lógica de programação, métodos GET e POST, MySQL e PHP que com certeza vai funcionar!
Olá Sergio Novelli… Parabéns pelo post muito bom…Eu fiz iguazinho vc fez no seu código, estou comerçando php e achei a lógica muito facil de ser compreendida, mas foi fazer e dá um erro que não consigo resolver… se vc puder me ajudar agradeço.
Fiz igual o seu codigo mudando apenas as minhas variaveias….
este erro:
Notice: Undefined index: supervisao in C:\xampp\htdocs\Portal\consultaFuncionarioGeral.php on line 185
Notice: Undefined index: cargo in C:\xampp\htdocs\Portal\consultaFuncionarioGeral.php on line 186
Notice: Undefined index: funcao in C:\xampp\htdocs\Portal\consultaFuncionarioGeral.php on line 187
Codigo:
Supervisor:
Cargo:
Funcao:
Matricula
Nome
Supervisor
Cargo
Funcao
<?php
$sqlClientes = "SELECT `matricula`,`nomeFunc` FROM `funcionario`";
if ($_GET['buscar'] == "buscar") {
// busca apenas por supervisor
if ($_GET['buscaSupervisor'] != " " AND $_GET['buscaCargo'] == " " AND $_GET['buscaFuncao'] == " ") {
$sqlClientes .= " WHERE supervisao LIKE '%".$_GET['buscaSupervisor']."%' ";
}
// busca apenas por Cargo
else if ($_GET['buscaSupervisor'] == " " AND $_GET['buscaCargo'] != " " AND $_GET['buscaFuncao'] == " ") {
$sqlClientes .= " WHERE cargo LIKE '%".$_GET['buscaCargo']."%' ";
}
// busca apenas por Funcao
else if ($_GET['buscaSupervisor'] == " " AND $_GET['buscaCargo'] == " " AND $_GET['buscaFuncao'] != " ") {
$sqlClientes .= " WHERE funcao LIKE '%".$_GET['buscaFuncao']."%' ";
}
// busca supervisao e cargo
else if ($_GET['buscaSupervisor'] != " " AND $_GET['buscaCargo'] != " " AND $_GET['buscaFuncao'] == " ") {
$sqlClientes .= " WHERE supervisao LIKE '%".$_GET['buscaSupervisor']."%' AND cargo LIKE '%".$_GET['buscaCargo']."%' ";
}
// busca supervisao e funcao
else if ($_GET['buscaSupervisor'] != " " AND $_GET['buscaCargo'] == " " AND $_GET['buscaFuncao'] != " ") {
$sqlClientes .= " WHERE supervisao LIKE '%".$_GET['buscaSupervisor']."%' AND funcao LIKE '%".$_GET['buscaFuncao']."%' ";
}
// busca cargo e funcao
else if ($_GET['buscaSupervisor'] == " " AND $_GET['buscaCargo'] != " " AND $_GET['buscaFuncao'] != " ") {
$sqlClientes .= " WHERE cargo LIKE '%".$_GET['buscaCargo']."%' AND estado LIKE '%".$_GET['buscaFuncao']."%' ";
}
// busca supervisao, cargo e funcao
else if ($_GET['buscaSupervisor'] != " " AND $_GET['buscaCargo'] != " " AND $_GET['buscaFuncao'] != " ") {
$sqlClientes .= " WHERE supervisao LIKE '%".$_GET['buscaSupervisor']."%' AND cargo LIKE '%".$_GET['buscaCargo']."%' AND funcao LIKE '%".$_GET['buscaFuncao']."%' ";
}
} // fim do get_buscar
$queryClientes = mysql_query($sqlClientes) or die(mysql_error());
while ($rowCliente = mysql_fetch_array($queryClientes)) {
echo("");
echo("".$rowCliente['matricula']."");
echo("".$rowCliente['nomeFunc']."");
echo("".$rowCliente["$supervisao"]."");
echo("".$rowCliente["$cargo"]."");
echo("".$rowCliente['funcao']."");
echo("");
}
?>
Olá, Jailton. Obrigado pela visita ao blog e pelo comentário.
Vamos a algumas correções no seu código.
1. Verifique através de um editor (recomendo muito o notepad++) como estão as aspas simples e duplas do código copiado aqui do blog, pois ao copiar o código que postou aqui no comentário, encontrei em alguns lugares onde esses caracteres estão diferentes. Se usar o notepad++, lembre-se de configurar a linguagem para PHP para que o editor lhe mostre o código corretamente. Se encontrar problemas com esses caracteres, nada que um comando substituir todos não resolva…
2. Sua SELECT está errada. Veja bem: você quer imprimir a matricula, nome do funcionário, supervisão, cargo e função, mas na string do SELECT está buscando apenas os campos matricula e nome do funcionário. Para conseguir buscar todas essas informações, em primeiro lugar todos esses campos devem existir na tabela funcionarios; assim, você pode ou simplesmente fazer um SELECT * FROM… ou, se preferir, colocar cada um dos campos que você quer, separando-os por vírgula.
3. Na hora de imprimir os dados, dentro do WHILE você está colocando os atributos cargo e funcao de forma errada, como se fossem variáveis/atributos do PHP. Lembre-se que ali você coloca o nome do campo de sua tabela no banco de dados e não as variáveis. Basta retirar o cifrão ($) do inicio, caso os nomes desses atributos na tabela estejam corretos.
OBS: De acordo com sua SELECT, achei estranho você colocar esses campos todos apenas na tabela funcionarios. O correto seria colocar alguns desses campos em tabelas apropriadas, como cargo e funcao, por exemplo. Recomendo estudar sobre as três formas normais de banco de dados relacional. Dê uma olhada neste blog que está muito bem explicado: http://www.luis.blog.br/normalizacao-de-dados-e-as-formas-normais.aspx.
Espero ter te ajudado. Qualquer dúvida, volte a postar.
Abs.
Muito Obrigado, otimas explicações, vc viu o que eu nem imaginava.
Fiz da forma como vc me falou e dei certo, muito obrigado msm. A questão da normalização já estudei sobre, mas fiz este como forma de apredizado, pra ficar mais simples a consulta.
Só que tem uma questão que gostaria que você me ajudasse, gostaria de quando escolher supervisor aparece só a coluna de supervisor, omitindo as colunas de cargo e função que não quis pesquisar.
A coluna de matricula e nome do funcionario sempre vão aparecer, quero que aparece supevisor, cargo e função apenas se eu colocar dados pra pesquisar.
Desde já gradeço.
Jailton, isso é fácil fazer.
Basta mandar imprimir os dados que deseja esconder dentro de IFs, assim como fez lá no filtro. Dentro do WHILE ficaria mais ou menos assim:
echo("".$rowCliente['matricula']."");
echo("".$rowCliente['nomeFunc']."");
if ($_GET['buscaSupervisor'] != " " {
echo("".$rowCliente["supervisao"]."");
}
if ($_GET['buscaCargo'] != " ") {
echo("".$rowCliente["cargo"]."");
}
if ($_GET['buscaFuncao'] != " ") {
echo("".$rowCliente['funcao']."");
}
Acho que isso resolve seu problema.
Fique à vontade para tirar outras dúvidas.
Abs.
Sergio Novelli,
Perfeito cara, deu certinho, aprendi bastante aí com vc, brigado pelo conhecimento passado.
Agora me apareceu outra coisa pra resolver, fiz como vc me falou, está filtrando apenas os campos que preciso blz, mas não filtra mais todos os supervisores como antes, busca apenas o que pesquisei, quero fazer na pesquisa uma forma que me faça ter todos os supervisores ou dodas os cargos etc.
Ex. quero selecionar todos os supervidores, com todos os cargo e com funcao tal.
Por enquanto tenho supervisor tal para cargo tal pra funcao tal, não me traz todos de uma tabela.
Tentei mundar na consulta, nos IFs, só que não tive sucesso ainda, Vc tem alguma luz pra isso.
Desde já agradeço.
Olá Jailton.
Se eu entendi bem a sua dúvida, você quer fazer consultas dinâmicas, ou seja, conseguir fazer combinações mais avançadas entre supervisor, cargo e função. Para conseguir isso, o primeiro passo é separar os dados em tabelas diferentes. Tudo numa só é impossível.
Crie uma tabela de cargos, outra funções e outra supervisores e faça o relacionamento entre elas e com a tabela funcionários. A partir daí, você terá que alterar sua consulta, usando INNER JOIN para selecionar todos os dados.
Assim você conseguirá trazer para o cargo X todas as funções atribuídas a ele. Para o cargo Y, as funções dele e assim por diante.
Outra possibilidade, que exige conhecimento mais avançado de programação, é usar um recurso chamado tabela dinâmica. Você já deve ter visto softwares onde você arrasta os cabeçalhos das colunas e linhas e a tabela é reorganizada de acordo como ficou. Eu, pessoalmente, nunca utilizei esse recurso no PHP, mas creio que tenha alguma biblioteca pronta Orientada à Objetos e com recursos de flash para se usar.
Esses dias criei algumas através da ferramenta Genexus, fácil, fácil… mas lá a história é muito diferente do PHP, Java, C#, etc…
De qualquer forma, se quiser, me manda seu script PHP e também o SQL da tabela, ambos atualizados e funcionando que posso te dar umas dicas mais detalhadas à respeito.
Abs.
Olá Sergio Novelli,
Segui seu conselho e dei uma estudada em Normalização e Relacionamentos de Tabelas, peguei um exercicio que pede a seguinte solução.
1- Crie 4 tabelas, CategoriaTreinamento, Treinamento, Escola, Funcionario, InsesirTreinamento. Treinamento deve está relacionado com CategoriaTReinamento, pois para cadastrar um novo treinamento devo associar a uma categoria.
2- Para inseri um treinamento para um funcionario, vc deve buscar os dados de Todas as Tabelas anteriores, os dados categoria, os dados da tabela treinamento, da escola e do funcionario.
Na minha tela de cadastro de Inserir Treinamento, vou ter os seguiintes campos.
- MatriculaFuncioanario
- Nome funcionario (carrega automaticamente quando colocar a matricula)
-Categoria de treinamento (Combo q puxa os dados da tabela Categoria Treinametno)
-Nome do treinamento (Carrega automaticamente quando selecionar a categoria)
-Quantidade de horas (carrega automaticamente de acordo com o treinamento)
-Validade treinamento (idem)
-Data de inicio
-Data conclusão
-Escola (puxar da tabela Escola)
-Endereço (carrega automaticamente quando escolher a escola)
Fiz um estudo de relacioanamentos e fiz este banco abaixo.
CREATE TABLE Funcionario (
matricula INTEGER(8) UNSIGNED NOT NULL AUTO_INCREMENT,
nomeFuncionario VARCHAR(30) NOT NULL,
CPF VARCHAR(14) NULL,
telefone VARCHAR(12) NULL,
celular VARCHAR(12) NULL,
PRIMARY KEY(matricula)
);
CREATE TABLE Escola (
idEscola INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT,
nomeEscola VARCHAR(40) NULL,
enderecoEscola VARCHAR(60) NULL,
PRIMARY KEY(idEscola)
);
CREATE TABLE CategoriaTreinamento (
idCategoriaTreinamento INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT,
categoria VARCHAR(20) NULL,
PRIMARY KEY(idCategoriaTreinamento)
);
CREATE TABLE Treinamento (
idTreinamento INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT,
CategoriaTreinamento_idCategoriaTreinamento INTEGER(4) UNSIGNED NOT NULL,
nomeTreinamento VARCHAR(60) NULL,
quantidadeHoras VARCHAR(3) NULL,
validadeTreinamento VARCHAR(10) NULL,
PRIMARY KEY(idTreinamento),
INDEX Treinamento(CategoriaTreinamento_idCategoriaTreinamento),
FOREIGN KEY(CategoriaTreinamento_idCategoriaTreinamento)
REFERENCES CategoriaTreinamento(idCategoriaTreinamento)
ON DELETE NO ACTION
ON UPDATE CASCADE
);
CREATE TABLE InserirTreinamento (
idInserirTreinamento INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT,
Funcionario_matricula INTEGER(8) UNSIGNED NOT NULL,
Treinamento_idTreinamento INTEGER(4) UNSIGNED NOT NULL,
Escola_idEscola INTEGER(4) UNSIGNED NOT NULL,
dataInicio VARCHAR(10) NULL,
dataConclusao VARCHAR(10) NULL,
PRIMARY KEY(idInserirTreinamento),
INDEX TreinamentoFuncionario(Escola_idEscola),
INDEX TreinamentoFuncionario(Treinamento_idTreinamento),
INDEX InserirTreinamento(Funcionario_matricula),
FOREIGN KEY(Escola_idEscola)
REFERENCES Escola(idEscola)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(Treinamento_idTreinamento)
REFERENCES Treinamento(idTreinamento)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(Funcionario_matricula)
REFERENCES Funcionario(matricula)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Não sei se minha tabela inserirTreinamento esta totalmente Correta.
Gostaria de uma ajuda sua no sentido de quando cadastrar um Treinamento conseguir associar a uma categoria pela chave estrangeira via PHP mysql. E quando For inserir treinamento pra um funcionário na Tabela “InserirTreinamento” conseguir buscar os dados das outras tabelas que se relacionam com ela.
Depois de ter feito isso tudo minha cabeça deu um nó e não sei pra onde ir, não sei se minha solução proposta pra resolver esse problema é a mais adequada, mas seria interessante se conseguisse implementa – lá.
Um grande Abraço e desde já agradeço.
Olá Jailton.
Kara, fiquei muito feliz em ver que você seguiu meu conselho de estudar normalização e está se esforçando bastante para aprender do jeito correto. Agradeço pelos elogios já feitos. São atitudes como a sua que dão ânimo de continuar escrevendo no blog.
Olhando seu código superficialmente, parece estar correto.
Mas vamos fazer o seguinte: leia o blog nesse dia 24 de março… lá tem o primeiro post de uma série que vai explicar detalhadamente como analisar e criar este seu execício na prática, inclusive finalizando a série com consultas feitas em PHP.
Obrigado pelo apoio e continue em contato. Estarei sempre à disposição.
Abs.
Ok.. legal pela ajuda e iniciativa, parabéns.
Grande abraço.
Ok. Gostaria apenas de saber como resolver essa primeira questão pois aprtir dela devo achar o caminho pra tentrar resolver o resto.
Como relacionar um novo Treinamento com a CategoriaTReinamento, pois para cadastrar um novo treinamento devo associar a uma categoria. Como fazer isso via PHP/Mysql?
Desde já agradeço.
Olá Sergio Novelli,
primeiramente achei mega ultra interessante o seu post fui dormir ontem/hoje as 4 da madrugada procurando algo como o seu post e não havia encontrado NADA pela net inteira até busquei pelos sites gringos e nada mas graças a sua postagem encontrei muito obrigada mesmoooooo.
Agora vou dizer a minha dúvida e espero de verdade que vc possa me ajudar com isso pois estou meio enrolada:
Bom eu estou montando um site para uma empresa de RH e o formulario que eles solicitaram foi basicamente um curriculo super extenso e fiz ele bonitinho conectei com o banco de dados porem agora eles querem uma busca por 40 campos diferentes.
Esta tudo na mesma tabela chamada candidato e o bd se chama koren, eu segui o seu codigo e mudei apenas as partes nas quais eu necessito da busca porem queria saber se tenho que fazer todas as combinações com os 40 campos, ex:
cpf e data_nascimento , cpf e naturalidade e assim por diante?
Vou postar meu codigo (incabado) aqui e espero que me ajude de verdade =/
Desde ja sou imensamente grata.
Oi, Jailton, tudo bem?
Desculpe a demora em lhe responder. Estive olhando seu SQL mais detalhadamente devo lhe dar os parabéns novamente. Você entendeu bem as normalizações de banco de dados. Não está 100% correto, mas já ficou bom do jeito que montou.
Em relação à tabela ‘inserirTreinamento’, fiz alguns ajustes:
1. Se essa é a tabela onde serão armazenados os dados dos treinamentos realizados, com todos os funcionários que fizeram o treinamento, e todas as escolas que ofereceram o mesmo, então seu nome correto é ‘inscricao’. Assim fica mais claro o seu objetivo.
2. Fiz alguns ajustes na padronização dos nomes de chaves primárias e estrangeiras. Recomendo que use uma padronização como essa ou crie a sua própria, pois fica muito mais fácil de ler e entender o código gerado, além de evitar problemas posteriores com o ‘case sensitive’. Segue como ficou o código:
CREATE TABLE inscricao (
pk_inscricao INTEGER(4) UNSIGNED NOT NULL AUTO_INCREMENT,
fk_funcionario INTEGER(8) UNSIGNED NOT NULL,
fk_treinamento INTEGER(4) UNSIGNED NOT NULL,
fk_escola INTEGER(4) UNSIGNED NOT NULL,
dataInicio VARCHAR(10) NULL,
dataConclusao VARCHAR(10) NULL,
PRIMARY KEY(pk_inscricao),
INDEX TreinamentoFuncionario(escola_pk_escola),
INDEX TreinamentoFuncionario(treinamento_pk_treinamento),
INDEX TreinamentoFuncionario(funcionario_pk_inscricao),
FOREIGN KEY(escola_fk_scola) REFERENCES Escola(pk_escola)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(treinamento_fk_treinamento) REFERENCES treinamento(pk_treinamento)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(funcionario_fk_funcionario) REFERENCES funcionario(pk_funcionario)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
As chaves primárias coloquei o prefixo ‘pk’ e as estrangeiras ‘fk’ separando o restante do nome do campo por um underline. Tomei o cuidado de alterar também o nome nos índices… mas se você usou um programa para gerar o sql, basta renomear os campos no seu DER que ele vai corrigir isso para você. Procure não utilizar letras iniciais maiúsculas, nem em nomes de tabelas e nem em campos. Maiúsculas apenas em nomes compostos como ‘categoriaTreinamento’.
Bom, acho que é isso. Continue acompanhando o blog que vou fazer um post com a análise geral de seu código e você vai entender melhor como tudo funciona.
Espero ter ajudado.
Abs.
Muito legal a sua dica.
Grato pela ajuda.