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

Post on 18-Dec-2014

574 views 4 download

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.