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

24
PHP + MySQL: navegação/paginação, insert Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 17, 07-05-2013

description

 

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

Page 1: 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

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

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

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

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

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

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

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

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

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

Base de dados para exemplos

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

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

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

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

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

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

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

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

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

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

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

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

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

E para inserir um novo relacionamento?

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

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.