PHP + MySQL: master-detail + navegaçãoCarlos SantosLabMM 4 - NTC - DeCA - UAAula PHP+MySQL 02, 03-05-2012
visualizar dados de várias tabelasQuando queremos visualizar dados que estão distribuídos por duastabelas ligadas entre si...
base para exemplos
listar os mariachis$query = "SELECT idMariachi, nome FROM Mariachi";$rsMari = mysql_query($query , $connection);while ($ro...
listar os mariachis com família$query = "SELECT Mariachi.idMariachi, Mariachi.nome,Familia.nomeFamilia FROM Mariachi INNER...
listar os mariachis com família (not so good)$query = "SELECT idMariachi, nome, Familia_idFamilia FROMMariachi";$rsMari = ...
observaçõesuma página pode ter muitos recordsetsos valores obtidos num recordset podem ser utilizados para filtrarresultado...
master - detailnesta estrutrura de informação temos:  • uma página inicial que lista vários tópicos de um modo genérico;  ...
exemplo: master-detailmaster: listar todas as famíliasdetail: listar os mariachis dessa família
exemplo: master > familias.php$qFami = "SELECT * FROM Familia";$rsFami = mysql_query($qFami , $connection);while ($row_rsF...
exemplo: detail > mariachisFamilia.php$idValue = intval($_GET[id]);$qMari = "SELECT * FROM Mariachi          WHERE Familia...
exemplo: master-detail (parte 2)master: listar todas as famíliasdetail: listar os mariachis dessa família         e inclui...
exemplo: master-detail (parte 2)soluções a discutir:  • um query único baseado num INNER JOIN entre Mariachis e    Mariach...
exemplo: master-detail (parte 2)problema com query único, típico destas situações:  • se um Mariachi não tiver uma ocorrên...
exemplo: master-detail (parte 2)por zonas condicionais entende-se partes do código que devem serprocessadas quando um reco...
navegação e paginaçãoimagina que uma família pode ter centenas de mariachis!  • faz sentido mostrar numa página uma listag...
navegaçãoo que é necessário saber  • número total de registos  • número de itens por página  • número da página atual  • r...
navegação - número total de registosrecordset com query de COUNT de registos da tabela
navegação - número de itens por páginaé um valor definido por nós e pode simplesmente ser guardado numavariávelse o utiliza...
navegação - número da página atualpassado na querystring!  • next -> lê página atual e soma 1  • previous -> lê página atu...
navegação - registos para mostrar na página atualNUNCA fazer uma query a pedir sempre todos os registos!na query do pedido...
desafiocriar uma função genérica que adicione, em qualquer cenário, uma barrade navegação!  • navigation_bar(nrTotalItens, ...
Próximos SlideShares
Carregando em…5
×

Aula 02 PHP+MySQL - LabMM4

1.402 visualizações

Publicada em

Publicada em: Educação
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.402
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
135
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Aula 02 PHP+MySQL - LabMM4

  1. 1. PHP + MySQL: master-detail + navegaçãoCarlos SantosLabMM 4 - NTC - DeCA - UAAula PHP+MySQL 02, 03-05-2012
  2. 2. visualizar dados de várias tabelasQuando queremos visualizar dados que estão distribuídos por duastabelas ligadas entre si, podemos: • criar um query baseado num JOIN que permita obter todos os dados; • criar vários recordsets de acordo com a informação necessáriaA solução adequada depende da situação em que se aplica
  3. 3. base para exemplos
  4. 4. listar os mariachis$query = "SELECT idMariachi, nome FROM Mariachi";$rsMari = mysql_query($query , $connection);while ($row_rsMari = mysql_fetch_assoc($rsMari)){ echo $row_rsMari[“nome"];}
  5. 5. listar os mariachis com família$query = "SELECT Mariachi.idMariachi, Mariachi.nome,Familia.nomeFamilia FROM Mariachi INNER JOIN Familia ONMariachi.Familia_idFamilia = Familia.idFamilia";$rsMari = mysql_query($query , $connection);while ($row_rsMari = mysql_fetch_assoc($rsMari)){ echo $row_rsMari[“nome"].” - “. $row_rsMari[“nomeFamilia].”<br/>”;}
  6. 6. listar os mariachis com família (not so good)$query = "SELECT idMariachi, nome, Familia_idFamilia FROMMariachi";$rsMari = mysql_query($query , $connection);while ($row_rsMari = mysql_fetch_assoc($rsMari)){ $qFami = "SELECT nomeFamilia FROM Familia WHERE idFamilia = ".$row_rsMari[“Familia_idFamilia”]; $rsFami = mysql_query($qFami , $connection); $row_rsFami = mysql_fetch_assoc($rsFami); echo $row_rsMari[“nome"].” - “. $row_rsFami[“nomeFamilia].”<br/>”;}
  7. 7. observaçõesuma página pode ter muitos recordsetsos valores obtidos num recordset podem ser utilizados para filtrarresultados a obter noutro recordsetsoluções com múltiplos acessos há BD são, normalmente, mais lentasno entanto, existem circunstâncias em que a quantidade de informaçãoresultante de um INNER JOIN pode justificar a opção por múltiplosqueries!
  8. 8. master - detailnesta estrutrura de informação temos: • uma página inicial que lista vários tópicos de um modo genérico; • uma página de detalhe que permite ver os detalhes do tópico escolhido na página masterque informação é necessário transferir entre as páginas? querystring: id_item master .../page.php?a=5 detail detalhes do item item1 escolhido na página master item2 item3 voltar
  9. 9. exemplo: master-detailmaster: listar todas as famíliasdetail: listar os mariachis dessa família
  10. 10. exemplo: master > familias.php$qFami = "SELECT * FROM Familia";$rsFami = mysql_query($qFami , $connection);while ($row_rsFami = mysql_fetch_assoc($rsFami)){ $line = ‘<p><a href=”mariachisFamilia.php?id=’. $row_rsFami[“idFamilia”]. ’”>’. $row_rsFami[“nomeFamilia"]. ‘</a></p>’; echo $line;}os URLs na página serão, por exemplo: “mariachisFamilia.php?id=3”
  11. 11. exemplo: detail > mariachisFamilia.php$idValue = intval($_GET[id]);$qMari = "SELECT * FROM Mariachi WHERE Familia_idFamilia = ".$idValue;$rsMari = mysql_query($qMari , $connection);while ($row_rsMari = mysql_fetch_assoc($rsMari)){ $line = ‘<p>$row_rsMari[“nome”]</p>’; echo $line;}Como mostrar nesta página o nome da família?
  12. 12. exemplo: master-detail (parte 2)master: listar todas as famíliasdetail: listar os mariachis dessa família e incluir o número de relacionamentos com chicas
  13. 13. exemplo: master-detail (parte 2)soluções a discutir: • um query único baseado num INNER JOIN entre Mariachis e Mariachi_has_chica com operação de COUNT e filtragem pelo Mariachi? • um query para o nome do Mariachi e um query para contar o número de registos do Mariachi em Mariachi_has_Chica?
  14. 14. exemplo: master-detail (parte 2)problema com query único, típico destas situações: • se um Mariachi não tiver uma ocorrência em Mariachi_has_Chica o resultado será um recordset vazio! Porquê? • não será possível mostrar os dados da informação pessoal do Mariachineste cenário, a solução a adotar deve ser a segunda!ou ainda melhor... uma solução com OUTER JOINTPC -> implementar esta solução :)
  15. 15. exemplo: master-detail (parte 2)por zonas condicionais entende-se partes do código que devem serprocessadas quando um recordset está ou não vaziopor exemplo: • se o mariachi nunca teve relacionamentos apresentar uma mensagem “este mariachi não é um bom exemplo!” • nos outros casos mostrar os relacionamentoscomo implementar este tipo de condição? • if ($rsName) ...
  16. 16. navegação e paginaçãoimagina que uma família pode ter centenas de mariachis! • faz sentido mostrar numa página uma listagem com um número ilimitado de itens?navegação - permite navegar nos itens, tipicamente: • previous - next (page 3 of 6)paginação - mais complexa e permite navegar diretamente para umapágina, tipicamente • 1 ... 5 6 7 8 9 ... 20
  17. 17. navegaçãoo que é necessário saber • número total de registos • número de itens por página • número da página atual • registos para mostrar na página atual
  18. 18. navegação - número total de registosrecordset com query de COUNT de registos da tabela
  19. 19. navegação - número de itens por páginaé um valor definido por nós e pode simplesmente ser guardado numavariávelse o utilizador tiver a possibilidade de alterar então podemos necessitarde uma cookie ou um parâmetro adicional na querystring
  20. 20. navegação - número da página atualpassado na querystring! • next -> lê página atual e soma 1 • previous -> lê página atual e subtrai 1 • chama novamente a página com o novo id da página a visualizar • é necessário ter em atenção as condições para não permitir clicar nas opções quando não existem mais páginas para trás ou para a frente • se não há valor da página deve assumir-se que é a primeira que deve ser mostrada • verificar valores que podem ser introduzidos manualmente no URL
  21. 21. navegação - registos para mostrar na página atualNUNCA fazer uma query a pedir sempre todos os registos!na query do pedido deve ser especificado o LIMIT (length e offset) • SELECT .... LIMIT offset, length • length é o valor do número de itens por página • offset é calculado com base na página atual e o número de itens por página
  22. 22. desafiocriar uma função genérica que adicione, em qualquer cenário, uma barrade navegação! • navigation_bar(nrTotalItens, nrItensPerPage, pageNumber)NOTA: a função não é responsável por mostrar os registos na página! Essalógica é da página e não da função.DICA: para construir o URL ver chaves da super-variável _SERVER

×