Aula 02 PHP+MySQL - LabMM4

1,395 views

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,395
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
135
Comments
0
Likes
2
Embeds 0
No embeds

No notes for 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

×