3
Iniciando o PHP e o MySQL Tome‐se como exemplo a base de dados de uma livraria, que contém informações sobre os livros disponíveis, autores e vendas, em que o elemento central desta base de dados serão os próprios livros. Neste caso, podiam ser utilizadas três tabelas, com a estrutura que a Figura 3.3 mostra.
FIGURA 3.3 – Tabelas da base de dados livraria
Quando se criam tabelas em bases de dados, é fundamental que haja um campo que identifique inequivocamente cada um dos registos. Por exemplo, no caso de uma livraria, poderia utilizar‐se o ISBN1 como número identificativo de cada livro mas, para o caso dos autores, teria de se utilizar um outro código, que pode ser atribuído pelo próprio sistema informático, aquando do registo de um novo autor. Isto é feito inserindo um novo campo de identificação, que aumenta de 1 em 1, de cada vez que é feito um novo registo, seja livro, autor ou venda. A este novo campo dá‐se o nome de chave primária, uma vez que é esta “chave” que identifica o registo da tabela. Os outros campos da tabela podem funcionar como chaves estrangeiras, uma vez que podem assumir‐se como chave primária noutra tabela diferente. Nalguns programas, é assumido automaticamente o primeiro campo da tabela como sendo a chave primária; noutros, aparece identificado o campo com o símbolo de uma chave. Entre a chave primária e a chave estrangeira pode ser estabelecida uma relação. A relação entre a chave primária e a chave estrangeira é muito importante para quem trabalha em bases de dados, pois permite obter os valores de uma determinada tabela de forma quase automática, através da relação estabelecida entre ambas. 1
ISBN é a sigla de International Standard Book Number – número que identifica cada livro de forma única, sendo utilizado em livros e publicações não periódicas. FCA – Editora de Informática 45
5
Desenvolvimento de Aplicações em PHP
5.3.3. Funções de data e hora Em linguagem PHP, existem funções que permitem trabalhar com datas, sendo de grande utilidade quando se pretende construir um calendário. As funções que permitem trabalhar com datas e horas são várias, entre as quais se destacam:
date()– Permite formatar uma data ou hora; getdate()– Retorna a informação sobre uma data ou hora; checkdate()– Permite obter informação sobre a data ou hora; time()– Devolve o timestamp em utilização; mktime()– Permite obter um timestamp para uma data ou hora específica.
A função date() pode incluir diferentes argumentos que mostrarão a data ou hora num determinado formato. Os argumentos desta função no que diz respeito a datas podem corresponder a informação sobre dias, meses, anos ou datas completas, mas todos eles são devolvidos em inglês, pelo que é necessário converter para português. A função date() é utilizada quando se pretende trabalhar com datas (Tabela 5.2). Argumento
Resultado
D
Devolve o mês do ano, em formato de texto
d
Devolve o dia do mês, com dois dígitos (por exemplo, 02 ou 31) Devolve cada dia em formato numérico (ISO‐8601), sendo o número “1” a segunda‐feira Devolve cada mês em formato numérico, sem zeros (por exemplo, janeiro = 1; dezembro = 12) Devolve o ano com apenas dois dígitos (por exemplo, 98 ou 12) Devolve o ano com quatro dígitos (por exemplo, 1998 ou 2012) Devolve o mês por extenso (por exemplo, January, February)
N n y Y F
TABELA 5.2 – Argumentos da função date()para datas
No caso em que se pretende obter o nome dos meses ou dias por extenso, e como o resultado é devolvido em inglês, é necessário criar uma instrução que os faça corresponder aos respetivos nomes dos meses/dias em português, o que é conseguido através de um switch/case. Esta situação será objeto de tratamento ao longo da criação do calendário e será aplicada sempre que se revele necessário.
112
FCA – Editora de Informática
5
Desenvolvimento de Aplicações em PHP
5.5. Utilização de Javascript no calendário online A linguagem Javascript é de grande aplicabilidade em páginas Web pois permite executar operações do lado do cliente. Por exemplo, quando se pretende verificar se um formulário foi totalmente preenchido, não é necessário executar uma operação do lado do servidor, uma vez que o formulário está do lado do cliente e pode ser verificado antes do processamento. Outro exemplo ocorre quando se pretende inserir uma hiperligação que volte à página que foi visualizada anteriormente, o que pode ser feito recorrendo à instrução javascript:history.back();.
5.5.1. Janela de aviso Um exemplo de utilização de Javascript em páginas Web poderia ser dado com a utilização de uma janela de aviso para o utilizador. As janelas de aviso podem ser incluídas sempre que se pretenda avisar o utilizador de algo que ocorre na aplicação e, no caso do calendário, estas irão aparecer quando o utilizador, por engano, colocar uma hora de início do evento que seja superior à hora de fim do evento. Para que surja uma janela de aviso, recorre‐se à instrução alert(), onde se inclui o alerta que se pretenda dar ao utilizador: <script> alert('A hora de fim não pode ser inferior à hora de início! Clique para continuar...'); window.location.href='calendario.php'; </script>
Desta forma, o utilizador é avisado sobre o problema em causa (Figura 5.9).
FIGURA 5.9 – Janela de aviso com Javascript
134
FCA – Editora de Informática
6
Fórum para a comunidade O código que se segue funciona por pequenos “blocos” que têm objetivos específicos. Para ser mais fácil a sua compreensão, resumem‐se de seguida as diferentes tarefas que estes terão de desempenhar:
Tarefa 1: procurar tópicos associados ao fórum e ordená‐los por data – O código referente a esta tarefa tem como objetivo aceder à base de dados, procurar os tópicos associados ao fórum identificado em id_forum e ordenar todos os registos obtidos. Caso não sejam encontrados tópicos, o utilizador é informado desta situação; Tarefa 2: calcular o número de mensagens já colocadas e associadas a cada tópico – Nesta tarefa irão ser pesquisadas as mensagens associadas a cada tópico, através da chave id_topico, cujo valor será utilizado no cruzamento das tabelas topicos e mensagens; Tarefa 3: elaborar a tabela que apresenta os tópicos com título, número de mensagens, autor e data da criação do tópico – O código referente a esta tarefa irá apresentar uma tabela na qual o utilizador pode visualizar título, número de mensagens, autor do tópico e data da criação do tópico, sendo a data convertida para o formato português; Tarefa 4: se o utilizador é administrador, colocar hiperligação que permite eliminar o tópico – Esta hiperligação solicita o ficheiro “apagar_topico.php”, que se encontra na pasta administrador, passando por URL a indicação do tópico que deve ser eliminado (id_topico).
A primeira tarefa é realizada pelo seguinte script: // procurar tópicos associados ao fórum selecionado $sql_topicos = "SELECT MAX(data_topico) AS ultima_data, topicos.*, utilizadores.* FROM topicos, utilizadores WHERE topicos.id_utilizador = utilizadores.id_utilizador AND topicos.id_forum = " . $id_forum . " GROUP BY topicos.id_topico ORDER BY ultima_data DESC;"; // realizar consulta $consulta_topicos = mysql_query($sql_topicos); $resultado_topicos = mysql_num_rows($consulta_topicos);
A instrução MAX(data_topico) permite que seja obtida a data mais recente do total dos tópicos registados, à qual se atribui a designação ultima_data, o que permite fazer a ordenação da data mais recente para a data mais antiga, utilizando depois a instrução ORDER BY ultima_data DESC.
FCA – Editora de Informática 165
6
Fórum para a comunidade
6.5. Administração do fórum No caso de um fórum, existem funções específicas que apenas estão disponíveis para administradores. Entre estas funções, incluem‐se: iniciar ou eliminar categorias, fóruns, tópicos ou mensagens, bem como gerir os utilizadores.
6.5.1. Menu de administração O acesso ao menu de administração é feito com base na hiperligação presente no cabeçalho, disponível apenas para administradores, tal como foi explicado. Ao clicar‐se nessa hiperligação, é solicitado o ficheiro “menu_admin.php” que apresenta uma tabela com um conjunto de opções que irão permitir executar diferentes tarefas:
Criar ou eliminar categorias; Criar fóruns; Validar utilizadores ou torná‐los inativos; Ver lista de utilizadores.
O aspeto deste menu é o que vemos representado na Figura 6.12.
FIGURA 6.12 – Menu de administração
O script do ficheiro “menu_admin.php” é aquele que permite construir esta página, sendo realizado sobretudo em linguagem HTML e constituído por uma tabela que apresenta diferentes hiperligações, que solicitam os respetivos ficheiros. Os únicos casos em que é utilizada a linguagem PHP são a solicitação da ligação à base de dados e a inclusão do cabeçalho: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> FCA – Editora de Informática 181
7
Mailing list
7.3.3. CAPTCHA Para evitar o registo de utilizadores em massa, pode utilizar‐se um sistema que obrigue o utilizador a inserir um código que é gerado aleatoriamente quando um determinado utilizador pretende realizar um registo. Este sistema pode ser aplicado em inúmeras situações, como aquelas que foram vistas no capítulo anterior (por exemplo, no registo de utilizadores ou envio de mensagens para o fórum), designando‐se por CAPTCHA. A sigla CAPTCHA é o acrónimo para Completely Automated Public Turing test to tell Computers and Humans Apart, referindo‐se a um teste que pode ser realizado para determinar se um dado utilizador é humano ou não, baseado no “Teste de Turing”, proposto por Alan Turing na década de 1950. Apesar de poder parecer um pouco estranho, existe a possibilidade de haver registos feitos continuamente por outros computadores, de forma automática, pelo que o objetivo do CAPTCHA é precisamente prevenir o registo automático e posterior envio de spam, a partir de contas criadas sem intervenção humana. No caso de uma mailing list, esta situação torna‐se especialmente relevante, pois poderia haver a tentativa de registo de utilizadores de forma automática, com vista a produzir um ataque informático. Numa explicação muito simplista, podia afirmar‐se que este sistema se baseia na comparação entre uma informação que é mostrada ao utilizador e a respetiva replicação dessa informação, por parte do utilizador. A informação, que é gerada aleatoriamente quando o script é executado, pode ser uma pergunta comum, a soma de dois números (em que o utilizador tem de colocar o resultado), a cor da imagem mostrada ou ainda um texto que o utilizador tem de replicar. De seguida, ambos os códigos são comparados e, caso coincidam, o script continua a ser executado; caso contrário, é gerado um novo exemplo e o utilizador tem de efetuar nova tentativa de acesso. Atualmente, é possível gerar códigos que apareçam ondulados ou distorcidos, com vista a dificultar ainda mais o acesso indevido, uma vez que alguns programas já conseguiam decifrar a resposta que era necessário inserir.
Nota Aquando da codificação da chave gerada, pode ser utilizado o algoritmo do tipo SHA1 em vez do algoritmo MD5. Tal como explicado no Capítulo 4, a chave gerada também é diferente.
A título de exemplo, cria‐se o ficheiro “captcha.php”, que vai conter o script que dará origem ao procedimento de verificação do registo feito por um utilizador humano. Este irá gerar um código aleatório, baseado na função RAND(), o qual será codificado utilizando o algoritmo SHA1.
FCA – Editora de Informática 205
7
Desenvolvimento de Aplicações em PHP
7.5.1. Funcionamento da paginação de resultados Se é verdade que o crescente número de registos traduz um crescente interesse nas novidades que podem ser recebidas através de uma newsletter, também é verdade que será quase inevitável que a base de dados aumente exponencialmente de tamanho. Uma vez que há um número cada vez maior de registos de endereços de correio eletrónico que poderia ser apresentado, torna‐se necessário “limitar” o número de registos que cada página apresenta, para que a gestão e mesmo a visualização se tornem confortáveis para o administrador. Quando se pretende paginar um elevado número de registos de uma base de dados, é necessário calcular o número total de registos na base de dados, fixar o total de registos que vão ser mostrados por página e depois “dividir” o número de registos por várias páginas, mantendo‐as sempre com o mesmo aspeto gráfico, além de ser necessário percorrer os registos por blocos que vão sendo exibidos em função do número de página selecionado. As operações referidas são realizadas por etapas, uma vez que o cálculo do número total de registos está ligado a operações relacionadas com a base de dados, enquanto a visualização dos resultados por página está relacionada com a tabela que os apresenta. Essas etapas são realizadas em sequência e, com vista a ser mais fácil compreender o sistema de paginação que vai ser desenvolvido, apresenta‐se de seguida um resumo das mesmas: 1) 2) 3) 4) 5)
Verificar o número de página inicial (por predefinição, deve ser a página 1). Percorrer a base de dados, obtendo um número definido de registos de cada vez Apresentar os registos obtido. Adicionar uma página ao valor da página inicial e repetir novamente os passos 2 e 3. Mostrar hiperligações para as páginas seguintes e anteriores, à medida que estas vão sendo apresentadas.
Para verificar o número de página atual, pode utilizar‐se a variável $_GET['pagina '], que vai confirmar se já existe um número de página (caso não seja a página inicial). No caso de ser a primeira página que está a ser exibida por solicitação de outro ficheiro, esta variável está vazia, pelo que lhe é atribuído o valor “1”; nas seguintes, este valor é alterado em função da página que se está a visualizar. Quanto ao segundo passo, define‐se o total de registos a serem obtidos através da aplicação da instrução LIMIT() na consulta SQL, o que permite informar a base de dados sobre o número de registos que queremos que esta devolva. Esta instrução tem a sintaxe LIMIT (A, B), em que a letra A diz respeito ao primeiro registo onde deve ser iniciada a contagem e a letra B se refere ao total de registos mostrados de cada vez.
216
FCA – Editora de Informática
8
Gráficos e relatórios
8.3. Desenhos com PHP A linguagem PHP permite a obtenção de figuras simples (por exemplo, quadrados) ou mesmo a construção de gráficos do mesmo género dos que são apresentados nas comuns folhas de cálculo. Contudo, o termo “gráfico” não se limita apenas a gráficos, mas sim a todo um conjunto de figuras (desenhos) que se podem produzir, uma vez que as mesmas bibliotecas e classes podem até ser utilizadas para produzirem códigos de barras. No entanto, e apenas por uma questão de coerência, designar‐se‐á por “desenhos” todos os comuns desenhos, como quadrados, círculos, circunferências ou retângulos, enquanto a designação “gráficos” será atribuída a todos os gráficos idênticos aos obtidos num programa de folha de cálculo.
Nota Conforme o browser utilizado, a localização dos desenhos/gráficos construídos com a biblioteca Graphics Draw pode variar, tendo‐se detetado que podiam aparecer localizados à esquerda sobre um fundo branco (Internet Explorer) ou no centro da página sobre um fundo negro (Mozilla Firefox).
8.3.1. Biblioteca Graphics Draw – instalação Para se poderem construir desenhos ou gráficos em linguagem PHP, é necessário ter instalada uma biblioteca de funções que dá pelo nome de Graphics Draw, cuja confirmação de instalação é necessária antes de se iniciar o desenvolvimento de uma aplicação que dela necessite. Se esta biblioteca estiver presente e a funcionar corretamente, poderá experimentar executar o seguinte script, que permitirá visualizar no monitor um pequeno retângulo verde: <?php header("Content-type: image/jpeg"); $imagem = imageCreate (300, 100); $cor_imagem = imageColorAllocate ($imagem, 40, 170, 40); imageJPEG ($imagem); imageDestroy ($imagem); ?>
FCA – Editora de Informática 247
8
Desenvolvimento de Aplicações em PHP A Figura 8.14 mostra o resultado deste código de barras que é gerado dinamicamente, em função do texto inserido na penúltima instrução: $Barcode->draw($myPicture,"Código funcionar!",50,50,$Settings);
de
barras
a
FIGURA 8.14 – Código de barras produzido com a classe pChart
Caso se pretenda, em vez de se inserir um texto estático, pode fazer‐se a ligação à base de dados e obter valores que podem gerar códigos de barras, por exemplo, em função do número de série de um artigo ou do tipo de produto, tal como acontece com os códigos de barras que se encontram em produtos alimentares. Uma vez que a classe utiliza a normalização EAN128 ou EAN39, os códigos gerados podem ser lidos por qualquer leitor comum de códigos de barras. A classe pChart apenas disponibiliza este tipo de normalização, pese embora também pudessem ser gerados gráficos do tipo QRCode.
8.5. Criação de gráficos dinâmicos com bases de dados Para criar um gráfico dinâmico, pode utilizar‐se qualquer uma das classes referidas até aqui, mas o facto de se poder utilizar a classe pChart torna muito mais simples e eficaz a criação dos gráficos, pelo que se irá desenvolver todo o trabalho utilizando esta classe. Os scripts que foram desenvolvidos para a criação de gráficos estáticos poderiam ser adaptados e utilizados para a criação dos gráficos dinâmicos com bases de dados, uma vez que a principal diferença entre este tipo de gráficos e os apresentados antes (estáticos) está relacionada com a forma como é criado o array para serem exibidos os valores no gráfico.
274
FCA – Editora de Informática
10
Desenvolvimento de Aplicações em PHP
10.6. Upload de ficheiros As operações de envio de ficheiros de imagem para o álbum apenas podem ser realizadas por utilizadores registados, embora todos os que acedam à aplicação possam ver as imagens que já se encontram disponíveis. O envio de ficheiros de imagem obriga à criação de vários scripts, tal como foi exemplificado no Capítulo 9.
10.6.1. Selecionar ficheiros para upload O envio de ficheiros de imagem (ou outro tipo) assenta num formulário que disponibiliza um campo de procura desses ficheiros e, de seguida, solicita um script que verifica o estado do ficheiro e o copia para uma pasta do servidor, registando, simultaneamente, diversos itens na base de dados, como a identificação do utilizador ou a categoria a que pertence. Poderia desenvolver‐se o formulário que se apresenta na Figura 10.10.
FIGURA 10.10 – Formulário para envio de imagens
No caso do álbum de fotos, cria‐se o ficheiro “envio_imagem.php”, no qual se encontra um script que elabora o formulário apresentado na figura e que permite inserir dados; este formulário tem de conter a indicação de que vai ser submetido um tipo de dados diferente do tipo texto, utilizando‐se para o efeito a expressão enctype=”multipart/form-data”. Esta informação permite que os dados sejam reconhecidos como formato de dados e não como texto, mas é também necessário especificar (no campo de submissão) que a hiperligação que aparece diz respeito a um ficheiro, o que é feito através da expressão <input name="…" type="file"/>.
384
FCA – Editora de Informática