LabMM4 (T18 - 12/13) - Navegação e insert

  • 569 views
Uploaded on

 

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
569
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
66
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. PHP + MySQL: navegação/paginação, insertCarlos SantosLabMM 4 - NTC - DeCA - UAAula 17, 07-05-2013
  • 2. Navegação e paginaçãoVamos supor que uma família pode ter centenas de mariachis!• faz sentido mostrar numa página uma listagem com um número ilimitadode itens?navegação• permite navegar sequencialmente nas páginas• exemplo: previous - next (página 3 de 6)paginação• mais complexa e permite navegar diretamente para uma página• exemplo: 1 ... 5 6 7 8 9 ... 20
  • 3. NavegaçãoPara construir um sistema idêntico ao exemplo anterior é necessáriosaber:• 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
  • 4. Navegação - número total de registosRecordset com query de COUNT de registos da tabela
  • 5. Navegação - número de itens por páginaÉ um valor definido pelo programador e pode simplesmente ser guardadonuma variável ou numa constanteSe o utilizador tiver a possibilidade de alterar esse valor podemosnecessitar de uma das seguintes soluções:• cookie• variável de sessão• parâmetro adicional na querystring
  • 6. Navegação - número da página atualNormalmente é um valor passado 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 nasopçõ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 sermostrada• verificar sempre os valores passados porque podem facilmente serintroduzidos manualmente no URL
  • 7. Navegação - registos para mostrar na página atualNUNCA fazer uma query a pedir 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 porpágina
  • 8. Inserção simples numa tabelaPara inserir um novo registo numa tabela é necessário:• criar um formulário com os campos a inserir• se necessário, validar dados por javascript• submeter dados por POST• receber dados e voltar a validar• inserir dados na tabela da BD• dar feedback ao utilizador
  • 9. PHP -> BDPara inserir um novo registo numa tabela:• $qFami = "INSERT INTO tabela (campo1, campo2, campo3)VALUES (valor1, valor2, valor3)";form.php insert.php result.phpPOST querystring(?)
  • 10. Base de dados para exemplos
  • 11. Inserir uma nova família - formFamilia.php<html><body><form action="insert_familia.php" method="post">Nome Família: <input type="text" name="nomeFamilia" /><input type="submit" /></form></body></html>As chaves primárias com auto-incremento não precisam de um campo noformulário...
  • 12. Inserir uma nova família - insert_familia.php$nomeFamilia = $_POST[“nomeFamilia”];//Validação de dados de entrada em falta...$query="INSERT INTO Familia (nomeFamilia) VALUES($nomeFamilia)";if (!mysqli->query($query)) {// tratar condição de erro} else {// o que fazer se correr bem?}
  • 13. Feedback!Mostrar feedback na página de inserção• a utilizar com moderação na estrutura indicada anteriormente• tende a criar situações com um passo extra de navegaçãoRedirecionar para outra página automaticamente• página do próprio sítio web onde o utilizador pode continuar a navegar“normalmente”• header(Location: proxPagina.php);• a própria página do formulário de inserção permitindo adicionar maiselementos de um modo muito simples• feedback pode ser passado por querystring
  • 14. PHP -> BDOutra solução: as operações podem ser todas realizadas na mesmapágina!• no início da página verifica se há dados por post: isset(...) (+ verificaçõesde segurança)• se há dados executa a inserção na BD e dá feedback• se não há dados mostra o formulárioform.phpPOST
  • 15. Inserir um novo mariachi - formMariachi.php<html><body><form action="insert_mariachi.php" method="post">Nome: <input type="text" name="nome" />Alcunha: <input type="text" name="alcunha" />Família: <input type="text" name="Familia_idFamilia" /><input type="submit" /></form></body></html>Esta solução tem sentido para o utilizador final?
  • 16. Inserir um novo mariachi - formMariachi.php<html><body><form action="insert_mariachi.php" method="post">Nome: <input type="text" name="nome" />Alcunha: <input type="text" name="alcunha" />Família: <input type="text" name="Familia_idFamilia" /><input type="submit" /></form></body></html>Nunca se deve pedir ao utilizador para inserir valores de chaves!Para as chaves estrangeiras de uma tabela temos de criarelementos de interação adequados ao utilizador final.
  • 17. Inserir um novo mariachi - formMariachi.php<html><body><form action="insert_mariachi.php" method="post">Nome: <input type="text" name="nome" />Alcunha: <input type="text" name="alcunha" />Família:<select name="Familia_idFamilia”><option value="1">Menezes</option><option value="2">Rodriguez</option><option value="3">Costa</option></select><input type="submit" /></form></body></html>Os elementos de interação criados têm de ser geradosdinamicamente porque a informação pode mudar na BD!
  • 18. Drop down menuPara adicionar um drop down menu num formulário é necessário:• criar um recordset com os valores das chave primária e respetivos labels alistar no drop down menu• num ciclo, adicionar todas as opção ao elemento do tipo select, sendo:• o value é o valor da chave primária• o texto é o label extraído da BD
  • 19. Inserir um novo mariachi - formMariachi.php<?php$qFami = "SELECT * FROM Familia";$rsFami = mysqli->query($qFami);?><form action="insert_mariachi.php" method="post">Família:<select name="Familia_idFamilia”><?phpwhile ($row_rsFami = $rsFami->fetch_assoc()){$option = ‘<option value=”‘. $row_rsFami[“idFamilia"]. ’”>’. $row_rsFami[“nomeFamilia"]. ‘</option>’;echo $option}?></select>
  • 20. Inserir um novo mariachi - formMariachi.php<form action="insert_mariachi.php" method="post">Família:<select name="Familia_idFamilia”><option value="0" selected>Escolha uma família</option><?phpwhile ($row_rsFami = $rsFami->fetch_assoc()){$option = ‘<option value=”‘. $row_rsFami[“idFamilia"]. ’”>’. $row_rsFami[“nomeFamilia"]. ‘</option>’;echo $option}</select>?>Neste exemplo, é obrigatório validar se o utilizadorescolheu uma opção e nunca tentar inserir se isso nãoaconteceu!
  • 21. Inserir um novo mariachi$nome = $_POST[“nome”];$alcunha = $_POST[“alcunha”];$Familia_idFamilia = $_POST[“Familia_idFamilia”];//Validação de dados de entrada em falta$query="INSERTINTO Mariachi (nome, alcunha, Familia_ifFamilia)VALUES ($nome, $alcunha, $Familia_idFamilia)";if (!mysqli->query($query)) {// tratar condição de erro} else {// o que fazer se correr bem?}
  • 22. Problemas com encoding?na inserção na BD• utf8_encode($_POST[...])na visualização na página• utf8_decode($row_rs[...])
  • 23. E para inserir um novo relacionamento?
  • 24. Inserção em tabelas de M:NRegras a seguir• criar um recordset com elementos do lado M• criar um recordset com elementos do lado N• no formulário• utilizar esses recordsets para construir os drop down menus para cadauma das chaves estrangeiras da tabelaOu...• o processo de inserção pode ter passos anteriores que permitam saber àpartida um dos elementos. Por exemplo, podia existir uma página anteriorque obriga a escolher o mariachi.