Conectividade
em banco de dados - quem pode viver sem ela?
Logo
que acabei de mudar, com sucesso, este site de um servidor NT (onde eu
tinha um banco de dados Access e monstruosos problemas de instabilidade
dos quais não quero nem falar) para um servidor Unix com um banco
de dados MySQL, me pareceu uma boa oportunidade para passar algumas informações
sobre como fazer com que o Flash e o PHP falem um com o outro para descarregar
os conteúdos de um banco de dados de MySQL.
Especificamente,
vamos ver como enviar dados do Flash para uma página PHP, o formato
PHP para conseguir com que os dados requisitados voltem para o Flash,
como checar quando a informação que queremos do banco de
dados tenha sido retornada e como mostrá-los. A aplicação
que criei é do tipo que checa o banco de dados conectado para verificar
quem está visitando o site e o que estão procurando.
Aqui
estão as interações específicas nesta aplicação:
1
- (no Flash) Obter uma data e um número do usuário, que
irá especificar quantos registros retornar, para cada dia.
2 - (no Flash) Verificar que a data e o número estão ambos
dentro de um limite determinado.
3 - (no Flash) Enviar a informação para a página
php.
4 - (no PHP) Examine o banco de dados para achar o total vistas na página,
visitantes, e páginas mais freqüentadas para uma determinada
data.
5 - (no PHP) Retorne um sumário dessas informações
ao Flash.
6 - (no Flash) Mostre a informação retornada.
Antes
que nós escrevamos qualquer código para fazer essas coisas,
temos que definir a estrutura do filme. Quantos quadros vamos precisar,
e o que irá em cada quadro? As variáveis serão passadas
da linha de tempo principal para a página PHP, ou através
de um movieclip? Esta última questão é uma das que
respondemos sempre com "movieclip", já que permite que
somente as variáveis que definimos sejam enviadas (quando um GET
ou POST é feito do Flash para um programa server-side, todas as
variáveis na linha de tempo fazendo a operação serão
enviadas). Se enviarmos da linha de tempo principal, um monte de variáveis
estranhas será enviado desnecessariamente para a página
PHP. Enviar via movieclip também significa que poderemos fazer
uso de onClipEvent(data) para checar o dado retornado.
Nota:
Você pode aprimorar esse tutorial usando o objeto
LoadVars disponível a partir do FlashMX.
Definir
a estrutura do filme
A
linha de tempo para este filme é extremamente simples: um quadro
para obter a saída (input) do usuário, outro quadro para
mostrar os resultados retornados. O primeiro é rotulado "start"
e o segundo "displaydata". O quadro "start" tem saída
de campo de textos, um botão para iniciar a requisição,
um campo de texto dinâmico para exibir o estado corrente, e um movieclip
controlador para fazer o envio e recebimento de dados atuais (este clipe
continua também dentro do quadro exibir). O quadro "displaydata"
possui vários campos de texto dinâmicos para mostrar as informações
sobre o arquivo fonte que são retornadas pelo php. Aqui estão
os conteúdos desses quadros:

Quadro
1: "start"

Quadro
10: "displaydata"
Vamos
iniciar as variáveis
Em
quase todas aplicações Flash, existe a necessidade de iniciar
algumas variáveis. Um bom lugar para fazer isto é nas ações
de quadro do primeiro quadro, que são executadas antes de qualquer
outra coisa no filme, antes mesmo do que as rotinas onClipEvent(load)
nos movieclips no quadro 1. Nosso código de inicialização
se parece com isso:
datavalues._visible
= 0;
ldom = [31, 28, 31, 25, 31, 30, 31, 31, 30, 31, 31, 31];
// get current date values
datenow = new Date();
daynow = datenow.getDate();
monthnow = datenow.getMonth();
// monthnow = 0-11
yearnow = datenow.getFullYear();
lastmonth = (monthnow == 0 ? 11 : monthnow-1);
// set default choosedate values
// default to display yesterday's date
chooseday = (daynow == 1 ? ldom[lastmonth] : daynow-1);
// display last month if current date is 1st
of month
choosemonth = (chooseday == daynow-1 ? monthnow+1 : lastmonth+1);
// display last year if current date is Jan 1
chooseyear = ((daynow == 1 && monthnow == 0) ? yearnow-1 :
yearnow);
stop(); |
A
primeira linha deste código esconde o movieclip "datavalues",
que contém os campos de saída (output), de forma que este
não será mostrado antes de que os dados estejam disponíveis.
Colocamos os campos de texto dentro de um movieclip de forma que estejam
disponíveis no primeiro quadro a ser preenchido pelo nosso clipe
controlador, mas capaz de se fazer invisível ao usuário.
Criamos,
também, algumas variáveis de datas que iremos necessitar
para conferir a entrada do usuário. Configuramos a data padrão
para a data do dia anterior e uma parada no quadro 1 para aguardar a entrada
(input) do usuário.
Na
próxima página, veremos os passos para obter aquela entrada
e a enviarmos para uma página PHP.
Enviar
para o PHP - Adicionar código para obter entrada do usuário,
verificá-la e passá-la ao PHP
Já
que temos uma ação "Stop" no quadro 1, nada acontecerá
neste filme até que o usuário pressione o botão "Show
Me" (presumivelmente depois de preencher a data e os campos de número,
mas não utilizando os valores padrão lá). Assim,
a primeira coisa que o botão deve fazer é verificar que
a data e os números entrados estão dentro do limite. Então,
já que decidimos enviar dados via movieclip, necessitamos ter certeza
de que as variáveis que nós queremos enviar estão
definidas neste movieclip.
Este
é o código no botão "Show Me". Criamos
o campo (mensagem de erro) de status em branco para começar, crie
variáveis de data para fazer nossa comparação e então
conferir os números que o usuário entrou. Caso seja encontrado
um valor fora do limite, uma mensagem é exibida. Caso contrário,
o movieclip controlador de datas (datacontroller) determina às
variáveis que nós desejamos passar ao PHP, e sua bandeira
de "pronto para enviar" (readySend) é configurada para
verdadeiro.
on
(release) {
statusmsg = "";
// check for date between 10/8/2001 and now
userdate = new Date(chooseyear, choosemonth-1, chooseday);
startdate = new Date(2001, 9, 7);
if (!(userdate-startdate>0 && datenow-userdate>0))
{
statusmsg = "Enter a date
between 10/8/2001 and "+(monthnow+1)+"/"+daynow+"/"+yearnow;
} else {
// check for number of records
chosen between 5 and 10
if (!(thisnumber>=5 &&
thisnumber<=10)) {
statusmsg =
"Enter a number between 5 and 10";
} else {
datacontroller.thismonth
= choosemonth;
datacontroller.thisyear
= chooseyear;
datacontroller.thisday
= chooseday;
datacontroller.thisnumber
= thisnumber;
datacontroller.readySend
= 1;
}
}
} |
Agora vamos dar uma olhada no que o movieclip "datacontroller"
está fazendo. Basicamente está sentado sem fazer nada, exceto
a verificação da bandeira "pronto para enviar"
para ver quando ela assinala verdade. Isto é feito através
de um loop onClipEvent(enterFrame), claro. Este é o código
que pusemos nas Ações do Objeto (Object Actions) de "datacontroller"
na nossa primeira interação com este filme:
onClipEvent
(load) {
readySend = 0;
}
onClipEvent (enterFrame) {
if (readySend) {
readySend = 0;
_root.statusmsg = "Getting
data...";
getURL("checkdata.php",
"_self", "POST");
}
} |
Ele
verifica pelo sinal "readySend" é verdadeiro (que foi
configurado pelo botão Show Me), exibe uma mensagem de que ele
vai obter os dados (porque isto não acontece instantaneamente e
seu usuário pode gostar de saber o que está acontecendo)
e então faz um "getURL" para uma página php. Por
que uma getURL e não uma loadVariables? Porque queremos verificar
e certificar-nos de que nossas variáveis estão sendo enviadas
corretamente antes de continuar o desenvolvimento. Daí, chamamos
o checkdata.php utilizando o método POST e especificando que a
página php deve abrir na mesma janela corrente em que o nosso filme
Flash está rodando. Isto é o que o checkdata.php se parece:
<?php
$day = $HTTP_POST_VARS['thisday'];
$number = $HTTP_POST_VARS['thisnumber'];
$month = $HTTP_POST_VARS['thismonth'];
$year = $HTTP_POST_VARS['thisyear'];
echo
"date read in: ".$month." ".$day." ".$year."<br>";
echo "number read in: ".$number;
?>
|
E
a saída na janela do navegador deve se parecer com alguma coisa
como:
data
introduzida: 10 10 2001
número introduzido: 7
A
próxima página olha para o que o php faz com a data e como
ele é retornado ao Flash.
Tradução
Sérgio Ramalho
|