labmm4 (t18 - 12/13) - navegação e insert
DESCRIPTION
TRANSCRIPT
![Page 1: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/1.jpg)
PHP + MySQL: navegação/paginação, insert
Carlos SantosLabMM 4 - NTC - DeCA - UAAula 17, 07-05-2013
![Page 2: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/2.jpg)
Navegação e paginação
Vamos supor 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 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
![Page 3: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/3.jpg)
Navegação
Para construir um sistema idêntico ao exemplo anterior é 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
![Page 4: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/4.jpg)
Navegação - número total de registos
Recordset com query de COUNT de registos da tabela
![Page 5: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/5.jpg)
Navegação - número de itens por página
É um valor definido pelo programador e pode simplesmente ser guardado numa variável ou numa constante
Se o utilizador tiver a possibilidade de alterar esse valor podemos necessitar de uma das seguintes soluções:
• cookie• variável de sessão• parâmetro adicional na querystring
![Page 6: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/6.jpg)
Navegação - número da página atual
Normalmente é 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 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 sempre os valores passados porque podem facilmente ser
introduzidos manualmente no URL
![Page 7: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/7.jpg)
Navegação - registos para mostrar na página atual
NUNCA 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 por
página
![Page 8: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/8.jpg)
Inserção simples numa tabela
Para 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
![Page 9: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/9.jpg)
PHP -> BD
Para inserir um novo registo numa tabela:
• $qFami = "INSERT INTO tabela (campo1, campo2, campo3) VALUES ('valor1', 'valor2', valor3)";
form.php insert.php result.phpPOST querystring(?)
![Page 10: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/10.jpg)
Base de dados para exemplos
![Page 11: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/11.jpg)
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 no formulário...
![Page 12: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/12.jpg)
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?}
![Page 13: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/13.jpg)
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ção
Redirecionar 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 mais elementos de um modo muito simples
• feedback pode ser passado por querystring
![Page 14: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/14.jpg)
PHP -> BD
Outra solução: as operações podem ser todas realizadas na mesma página!
• no início da página verifica se há dados por post: isset(...) (+ verificações de segurança)
• se há dados executa a inserção na BD e dá feedback• se não há dados mostra o formulário
form.php POST
![Page 15: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/15.jpg)
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?
![Page 16: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/16.jpg)
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 criar elementos de interação adequados ao utilizador final.
![Page 17: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/17.jpg)
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 gerados dinamicamente porque a informação pode mudar na BD!
![Page 18: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/18.jpg)
Drop down menu
Para adicionar um drop down menu num formulário é necessário:
• criar um recordset com os valores das chave primária e respetivos labels a listar 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
![Page 19: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/19.jpg)
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”> <?php while ($row_rsFami = $rsFami->fetch_assoc()){ $option = ‘<option value=”‘ . $row_rsFami[“idFamilia"] . ’”>’ . $row_rsFami[“nomeFamilia"] . ‘</option>’; echo $option } ?> </select>
![Page 20: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/20.jpg)
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> <?php while ($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 utilizador escolheu uma opção e nunca tentar inserir se isso não aconteceu!
![Page 21: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/21.jpg)
Inserir um novo mariachi
$nome = $_POST[“nome”];$alcunha = $_POST[“alcunha”];$Familia_idFamilia = $_POST[“Familia_idFamilia”];//Validação de dados de entrada em falta
$query="INSERT INTO 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?}
![Page 22: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/22.jpg)
Problemas com encoding?
na inserção na BD
• utf8_encode($_POST['...'])
na visualização na página
• utf8_decode($row_rs['...'])
![Page 23: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/23.jpg)
E para inserir um novo relacionamento?
![Page 24: LabMM4 (T18 - 12/13) - Navegação e insert](https://reader033.vdocuments.net/reader033/viewer/2022051610/5494c5c2b47959564d8b4b91/html5/thumbnails/24.jpg)
Inserção em tabelas de M:N
Regras 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 cada uma das chaves estrangeiras da tabela
Ou...
• o processo de inserção pode ter passos anteriores que permitam saber à partida um dos elementos. Por exemplo, podia existir uma página anterior que obriga a escolher o mariachi.