Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
LabMM4 (T18 - 12/13) - Navegação e insert
1. PHP + MySQL: navegação/paginação, insert
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 17, 07-05-2013
2. 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
3. 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
4. Navegação - número total de registos
Recordset 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 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
6. 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
7. 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
8. 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
9. 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.php
POST querystring(?)
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 no
formulá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çã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
14. 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
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 criar
elementos 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 gerados
dinamicamente porque a informação pode mudar na BD!
18. 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
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>
<?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!
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="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?
}
22. Problemas com encoding?
na inserção na BD
• utf8_encode($_POST['...'])
na visualização na página
• utf8_decode($row_rs['...'])
24. 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.