LabMM4 (T18 - 12/13) - Navegação e insert
-
Upload
carlos-santos -
Category
Education
-
view
572 -
download
4
description
Transcript of LabMM4 (T18 - 12/13) - Navegação e insert
PHP + MySQL: navegação/paginação, insert
Carlos SantosLabMM 4 - NTC - DeCA - UAAula 17, 07-05-2013
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
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
Navegação - número total de registos
Recordset com query de COUNT de registos da tabela
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
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
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
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
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(?)
Base de dados para exemplos
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...
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?}
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
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
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?
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.
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!
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
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>
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!
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?}
Problemas com encoding?
na inserção na BD
• utf8_encode($_POST['...'])
na visualização na página
• utf8_decode($row_rs['...'])
E para inserir um novo relacionamento?
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.