Вы находитесь на странице: 1из 19

CGI e Formulrios HTML

1. Introduo ao HTML 2. Introduo ao CGI 3. Formulrios em HTML 1. Campos Texto (text, textarea e password) 2. Caixas de Seleo e Botes de Rdio (checkbox e radiobutton) 3. Campos de Seleo de Arquivos (browse) 4. Campos de Imagens (image) 5. Campos Ocultos (hidden) 6. Botes de Presso (button) 7. Botes de Processamento (submit e reset) 4. Sobre a C_CGI 1. Onde Obter 2. Definies 3. void iniciar_cgi(char *tipo); 4. tcgivar* pega_arg(); 5. int tot_arg(tcgivar* t); 6. char* val_arg(const char *arg, tcgivar* args); 7. char** val_marg(const char *arg, tcgivar* args); 5. Construindo um CGI, usando a C_CGI 6. Compilando um Programa que use a C_CGI 7. Exerccios

Introduo ao HTML
O que um documento HTML A sigla HTML significa HyperText Markup Language. Documentos HTML so formados por texto puro (formato ASCII), portanto podem ser criados e editados por qualquer editor de textos (como o Bloco de Notas no Windows, Edit do DOS ou vi no Linux/Unix). Este formato texto possui algumas particularidades, pois sua formatao feita atravs das chamadas tags. Estas so estruturas formadas por um sinal de menor que (<), o nome da tag, e um sinal de maior que (>), o que usado para iniciar a instruo. Para finalizar a instruo de uma tag, normalmente usa-se a mesma tag, mas com um sinal de barra (/) antes do nome da tag. Tags HTML Um exemplo o ajudar a entender melhor como funciona a insero de tags em documentos HTML:

Em um documento texto criado com o Bloco de Notas do Windows, por exemplo, no podemos criar um documento em que um determinado texto aparea em negrito. Entretanto, em um documento HTML isso possvel usando-se uma instruo, que inicia com a tag <B> e termina com </B>. Por exemplo:
Texto <B>Exemplo</B> em Negrito.

Num documento HTML, a palavra Exemplo do texto apareceria em negrito e a frase seria exibida como mostrada abaixo: Texto Exemplo em Negrito. Como voc pode ver, podemos usar uma tag para fazer com que um determinado texto fique em negrito. Mas no apenas isso, tambm podemos usar tags de diferentes nomes para mudar a fonte do texto, deixa-lo em itlico, sublinhado, criar tabelas, caixas de texto e muitas outras coisas que vemos em documentos deste tipo. Assim como a tag <B> pode deixar o texto em negrito, a tag <I> pode deixa-lo em itlico. Editores HTML Existem editores especializados na criao de documentos HTML. Alguns deles auxiliam na insero de tags HTML, outros mostram visualmente como ficar sua pgina quando for visualizada (so os chamados editores WYSIWYG - What You See Is What You Get). O Microsoft Word (a partir de sua verso 97), pode ser usado como exemplo de editor WYSIWYG, pois seus documentos podem ser salvos em formato HTML. Se voc edita no Word o seguinte texto: Este um exemplo de uso do Word para criar documentos HTML... e salva o mesmo como um documento HTML, ele se parecer com o seguinte quando for aberto em um editor de texto puro (como o Bloco de Notas):
Este um <B>exemplo</B> de uso do <I>Word</I> para criar documentos <B><I>HTML</I></B>...

Observe que como a palavra HTML est em negrito e itlico, as duas tags so usadas em conjunto. Tags Fundamentais Existem algumas tags que so fundamentais para que um documento seja reconhecido pelo browser (navegador) como um documento HTML. Embora o exemplo mostrado na seo anterior seja correto, quando formos abrir no Bloco de Notas um documento que o word salvou como HTML, no veremos apenas o texto com as tags mostradas. Veremos, na verdade, algo mais parecido com:

<html> <head> <title>Este um exemplo de uso do Word para criar documentos HTML</title> </head> <body> Este um <b>exemplo</b> de uso do <i>Word</i> para criar documentos <b><i>HTML</i></b>... </body> </html>

Tags como <HTML> e <BODY> sempre esto presentes em um documento HTML. Note que neste exemplo usamos as tags com letras minsculas, o que mostra que o navegador no faz distino entre maisculas e minsculas. Vamos analisar as tags usadas no documento mostrado anteriormente. HTML Esta instruo informa para o browser que o arquivo contem informaes de um documento HTML. A exteno de arquivo .html (ou apenas .htm) tambm indica isso e deve ser usada. dentro desta tag que esto localizadas as de cabealho (head) e corpo de texto (body). HEAD e TITLE Indica a primeira parte do cdigo HTML (o cabealho), que contm o ttulo. Este ttulo exibido normalmente na barra de ttulo da janela de seu browser. Normalmente voc deve deixar seu ttulo com no mximo 64 caracteres. BODY A segunda e maior parte de seu documento. Dentro desta tag ficar o corpo de seu documento, e onde voc usar as tags de negrito, itlico, sublinhado etc. Todas as tags que sero mencionadas neste pequeno tutorial ficaro dentro de <BODY>.

Introduo ao CGI
Primeiramente, CGI a sigla para Common Gateway Interface e serve, basicamente, para permitir que uma pgina web possua um contedo dinmico, isto , que a pgina seje criada baseada em informaes entradas pelo usurio. Exemplos muito evidentes de pginas que possam ser criadas atravs de um CGI so: mecanismos de buscas, formulrios para cadastramento de clientes, consulta de boletim escolar e etc.. Um script CGI pode ser criado usando qualquer linguagem suportada pela plataforma em uso (entenda-se como plataforma o sistema operacional e o servidor WEB que esto rodando na mquina em que o CGI ser executado). Por exemplo, se estivermos usando o

Apache sob Linux, podemos rodar um CGI em perl, c, flagship (uma ferramenta para fazer programas em clipper rodarem sob Linux), pascal; mas no poderamos executar um CGI feito em Delphi, pois ele no rodaria no Linux. Isto se deve ao fato de que o CGI nada mais que a execuo de um programa com as entradas pr-definidas, sendo que a sada do programa ser a prpria pgina a ser enviada pro usurio. O processo de execuo de um script CGI segue os seguintes passos: 1. O usurio preenche um formulrio e envia esse formulrio para o CGI (normalmente esse envio feito ao se pressionar um boto no formulrio); 2. O servidor WEB receber essa informao, identificar que ela se destina a um programa e executa esse programa. 3. O programa ento pega e trata as entradas fornecidas pelo usurio, enviando ao servidor WEB uma pgina no formato HTML como resposta. 4. O servidor WEB, por sua vez, remete essa pgina para o usurio como se fosse uma simples pgina esttica. Vale a pena ressaltar dois aspectos relativos ao CGI: primeiramente ele executado na mquina servidor e, portanto, se o CGI precisar ler, escrever ou executar algum arquivo ele (o usurio no qual o CGI utilizado, em alguns casos ser o nobody) deve ter permisso para tal; por ltimo, o usurio, que est na mquina cliente, no pode ver o cdigo fonte do CGI porque ele no baixa o programa, ele apenas recebe a sada que o programa gera.

Formulrios em HTML
Os formulrios so usados para enviar dados entrados pelo usurio para o servidor web. O servidor o responsvel por fornecer as informaes do formulrio para o programa CGI que ser executado e tratar as mesmas, enviando como resposta a sada de dados que ser enviada ao computador do usurio.

Por exemplo, vamos imaginar que voc esteja fazendo um cadastro de pessoas que vo no seu site, mas voc deseja que a pessoa fornea apenas seu nome, e-mail e o esporte que ele

mais gosta, sendo este ltimo escolhido entre trs opes (futebol, basquete e handball). Um formulrio como o mostrado abaixo ser apresentado: Nome: E-mail: Esporte favorito:
Enviar Apagar

futebol

basquete

handball

O cdigo HTML para o formulrio acima :


<form method="POST" action="/cgi-bin/submit.exe"> <p> Nome: <input type="text" name="nome" maxlength="15" size="20"><br> E-mail: <input type="text" name="email" size="20"><br> Esporte favorito: <input type="radio" value="futebol" name="esporte"> futebol <input type="radio" value="basquete" name="esporte">basquete <input type="radio" value="handball" name="esporte">handball </p> <p> <input type="submit" value="Enviar" name="submit_button"> <input type="reset" value="Apagar" name="reset_button"></p> </form>

Repare que todo o formulrio est entre as tags <FORM> e </FORM>, que definem o limite dos campos que nele esto contidos. O tag FORM mostrado acima possui dos parmetros. O primeiro indica o mtodo de envio dos dados (GET ou POST) e o segundo indica o que deve ser feito ou o programa que deve ser executado quando clicado o boto para envio do formulrio. No caso acima, ser chamado o CGI submit.exe, que est no diretrio de CGI's cgi-bin. Os tipos de campos utilizados acima (caixas de texto e botes de rdio) sero analisados a seguir. A maior parte dos campos so formados pela tag input, e tem seu tipo alterado de acordo com o valor do parmetro type.

Campos de Texto e Senha (text, textarea e password)


Caixa de texto de uma linha A caixa de texto utilizada para obter uma informao escrita em um campo de uma nica linha. No exemplo mostrado acima, podemos ver a caixa de texto onde o usurio entra seu nome, que possui o seguinte cdigo HTML:
<input type="text" name="nome"
maxlength="15"

size="20">

Os parmetros utilizados so os seguintes:

type="text"

informa que o tipo de entrada ser um campo de texto, que consiste em uma caixa de texto de uma s linha.
name="nome"

define um nome qualquer para a tag.


size="20"

define o tamanho da caixa de texto (em caracteres).


maxlength="15"

define o nmero mximo de caracteres que podero ser digitados. rea de texto (vrias linhas) A rea de texto utilizada para obter uma informao escrita em um campo de mais de uma linha. Veja o exemplo abaixo:
Texto Inicial

O bloco de cdigo abaixo mostra como montada a rea de texto acima em cdigo HTML
<textarea name="text_field" rows="5" cols="60">Texto Inicial</textarea>

Os parmetros so, respectivamente, o nome do campo, o nmero de linha e o nmero de colunas. Entre o tag inicial e final existe o texto padro que entrar no campo. Caixa de texto com senha Os campos de senha (password) so semelhantes ao campo de caixa de texto de uma linha, porm, o texto digitado pelo usurio substitudo por asteriscos (*). Veja o exemplo abaixo: Digite sua senha: que possui o seguinte cdigo:
<input type="password" name="pass1" maxlength="5" size="20">

O parmetro "Value" Os campos de texto e de senha, alm dos parmetros mostrados, possuem um outro, denominado value. Este campo usado para guardar o texto neles contido. Voc pode

escolher um valor iniciar para o mesmo adicionando o parmetro value="texto padro", onde texto padro ser o texto inicialmente contido neste campo. A caixa de texto abaixo possui o parmetro value, que igual a "teste". Nome:
teste

Este valor pode ser alterado pelo usurio, e o texto final ser o enviado pelo formulrio.

Caixas de Seleo e Botes de Rdio (checkbox e radiobutton)


As caixas de seleo so usadas para que o usurio marque ou desmarque determinadas opes, dentre vrias. J os botes de rdio so usados para selecionar uma s entre vrias opes. Veja os exemplos abaixo: Marque os esportes pelos quais voc se interessa: futebol vlei basquete baseball handball

Cdigo da caixa de seleo: <input type="checkbox" name="futebol" value="SIM"> Cada campo tem um nome diferente e voc pode escolher quantas opes quiser, inclusive nenhuma, ou todas. Cada uma das opes possui um nome e um valor (parmetro value), assim como o campo de texto, entretanto, aqui o valor no ser definido pelo usurio, vai apenas conter o valor predeterminado caso o usurio marque esta opo. Assim como uma caixa de texto que pede para o usurio digitar seu esporte favorito ir conter como valor o texto digitado (se o usurio digitar "vlei", este ser o valor da caixa de texto), a caixa de seleo futebol possuir o valor do parmetro value, se o usurio a tiver marcado, ou simplesmente no existir, caso o usurio no a tenha marcado. No caso acima, as caixas de seleo tm o valor SIM, ento este ser o valor deste campo (considerando q ele esteja marcado) quando o formulrio for enviado. Marque o esporte do qual voc mais gosta: futebol vlei basquete baseball handball

Cdigo: <input type="radio" value="futebol" name="esportes"> No caso acima, o que temos so botes de rdio, isto , campos de seleo em que apenas um dentre os campos com o mesmo name podem ser marcados. Assim sendo o que ser enviado pelo formulrio ser um campo com o nome igual a esportes e com valor igual ao

valor do campo que o usurio selecionou, funcionando assim da mesma forma que uma caixa de texto com name="esportes" e em que o usurio digitou o que est no parmetro value do campo selecionado.

Campos de Seleo de Arquivos (browse)


Estes campos so usados para que o usurio escolha um arquivo em disco. Veja o exemplo abaixo: Este formulrio tem o seguinte cdigo:
<input type="file" name="select_file">

O parmetro type informa que o campo do tipo file e o parmetro name informa o nome do campo.

Campos de Imagens (image)


Tambm possvel inserir imagens como campos de formulrio. Uma imagem pode funcionar como um boto de envio do formulrio. Veja o exemplo abaixo:

... esta imagem possui o seguinte cdigo dentro do formulrio: <input type="image"
border="0" src="submit.gif" name="image1" width="69" height="24">

Os parmetros so semelhantes ao de uma imagem comum: type border src name width height tipo de campo de formulrio espessura da borda ao redor da imagem url da localizao da imagem nome atribudo ao objeto de formulrio (neste caso a imagem) largura da imagem, que pode ser o tamanho real ou diferente deste (neste caso a imagem ser distorcida) altura da imagem, que pode ser o tamanho real ou diferente deste (neste caso a imagem ser distorcida)

Clicar na imagem mostrada possui o mesmo efeito que um clique no boto de envio (submit) do formulrio.

Campos Ocultos (hidden)


Os campos oculto so como todos os outros, no entanto serve apenas para enviar somente informaes que no precisam ser lidas pelo usurio. Por exemplo, um campo que informe para que pagina devemos ir aps o envio dos dados. Veja o exemplo abaixo: <input type="hidden" name="forward" value="http://www.dcc.ufrj.br"> Neste caso um CGI poderia pegar o valor do campo forward, e redirecionar para esta URL, atravs de uma tag ou de um java script, por exemplo. Note que isto funciona como uma caixa de edio, s que o usurio no pode ver este campo, que possui valor fixo.

Botes de Presso (button)


So botes como os que vemos em quase qualquer programa, como o mostrado abaixo: A tag para este boto fica como mostrado abaixo: <input type="button" value="mensagem" name="buttonmsg"> O campo value especifica o rtulo do boto, que o valor que ser enviado para o CGI. Voc pode usar botes como esse para fornecer ajuda sobre determinados campos. Por exemplo, poderia usar um boto com o rtulo "ajuda" associado a um javascript para fornecer uma caixa de mensagem dizendo o que o usurio deve preencher naquele campo...

Botes de Processamento (submit e reset)


Estes botes funcionam como os anteriores, no entanto, os botes submit e reset, enviam e resetam as informaes de formulrio, respectivamente. <input type="submit" value="Enviar" name="enviar"> <input type="reset" value="Apagar" name="apaga"> O exemplo acima teria como resultado:

Enviar

Apagar

Caso o formulrio tenha como parmetro action="sumit.exe", ento o boto Enviar, mostrado acima, enviar as informaes do formulrio preenchido para o CGI submit.exe. O boto Apagar, far com que todos os campos voltem a ter seus valores iniciais.

Sobre a C_CGI
A C_CGI foi criada com o objetivo nico de fazer com que o programador no tenha que se preocupar em como pegar os argumentos passados por um formulrio HTML. Assim a tarefa de se criar um CGI, fica resumida apenas a criar o algoritmo necessrio para implementar o que se deseja sem perder tempo tratando se o formulrio foi enviado pelo mtodo GET ou POST. Todos os argumentos passados por um formulrio html ficam armazenados numa varivel do tipo tcgivar, aps o uso da funo pega_arg. Para se acessar o valor de um argumento, tm-se duas funes: val_arg e val_marg

val_arg: a forma mais imediata e, certamente, ser a forma mais usada. Essa funo devolve o valor do argumento especificado pelo seu primeiro parmetro. val_marg: muito til para tratamento de campos booleanos (checkboxes), pois permite que mais de um campo do formulrio tenha o mesmo nome.

A C_CGI traz ainda duas outras funes: tot_arg e iniciar_cgi. A primeira simplesmente retorna o nmero total de valores armazenados na variavel tcgivar e a segunda envia, ao servidor web, o content-type.

Onde Obter
Voce poder fazer o download aqui mesmo, por seu prprio risco. A C_CGI funciona perfeitamente sob Linux ou Windows, pois possui apenas funes de bibliotecas padro do C. O arquivo compactado abaixo vem com o cdigo fonte. Para saber como compilar seus programas em C, usando a C_CGI, veja a seo abaixo. Download: c_cgi.tar.gz

Definies

So valores definidos na C_CGI.H que do informaes importantes ao programador. No momento h apenas quatro definies:

PAG_CGI: contm o endereo da pgina referente ao CGI que est sendo executado. PAG_ORIG: contm o endereo da pgina anterior ao CGI, isto , da pgina que contm o formulrio. Ser de muito valor quando um nico CGI controlar dois ou mais formulrios. USU_NAVEG: contm informaes referentes ao browser utilizado pelo cliente. USU_IP: informa o endereo IP do cliente.

Exemplos (rodando na mquina local, como teste): printf("%s", PAG_CGI); retornaria algo como /cgi-bin/teste. printf("%s", PAG_ORIG); retornaria algo como http://127.0.0.1/teste/. printf("%s", USU_NAVEG); retornaria algo como Mozilla/4.7 [pt_BR] (X11; U; Linux 2.2.12-5cl i686). printf("%s", USU_IP); retornaria algo como 10.0.0.1.

void iniciar_cgi(char *tipo)


Objetivo: Enviar ao servidor web qual ser o tipo da sada do CGI. Parmetros:

tipo: o tipo da sada do CGI. Se tipo for igual a nulo, ento ser assumido, como padro, a sada text/html.

Exemplos:

iniciar_cgi(NULL); Inicializa um CGI que retornar, ao servidor web, uma pgina no formato HTML. iniciar_cgi("image/gif"); Inicializa um CGI que retornar, ao servidor web, uma figura no formato GIF.

tcgivar* pega_arg();

Objetivo: Armazenar todos os argumentos passados pelo formulrio, j decodificando os caracteres estranhos. Essa funo tem que ser usada antes das funes tot_arg, val_arg e val_marg. Exemplo: void main() { tcgivar* args; args=pega_arg(); (...) } Armazena na varivel args, todos os argumentos preenchidos no formulrio da pgina anterior.

int tot_arg(tcgivar* t);


Objetivo: Retornar o total de argumentos passados pelo formulrio. Parmetros:

t: a varivel do tipo tcgivar, que recebeu o valor de pega_arg().

Exemplo: void main() { tcgivar* args; iniciar_cgi(NULL); args=pega_arg(); printf("Total de Argumentos: %d",tot_arg(args)); } Mostra o nmero total de argumentos passados para o CGI.

char* val_arg(const char *arg, tcgivar* args);


Objetivo: Retornar o valor do argumento identificado por arg.

Parmetros:

arg: o nome do argumento. args: varivel que recebeu o valor de pega_arg().

Exemplo: void main() { tcgivar* args; iniciar_cgi(NULL); args=pega_arg(); printf("Seja bem-vindo %s",val_arg("login",args)); } D uma mensagem de boas-vindas ao usurio que acabou de informar nome e senha.

char** val_marg(const char *arg, tcgivar* args);


Objetivo: Retornar o valor de todos os argumentos identificados pelo nome arg. Parmetros:

arg: o nome do argumento. args: varivel que recebeu o valor de pega_arg().

Exemplo: void main() { tcgivar* args; int i; char **hob; iniciar_cgi(NULL); args=pega_arg(); hob=val_marg("hobbies",args); printf("Hobbies Escolhidos: "); for(i=0; hob[i]; i++) printf("%s ", hob[i]); }

Faz uma listagem de todos os hobbies escolhidos atravs de um campo booleano (checkbox). Todos os campos tinham o mesmo nome (name), mas possuiam valores (value) diferentes.

Construindo um CGI, usando a C_CGI


Para construir um CGI voc precisar primeiramente de um formulrio em HTML que remeta os dados ao CGI (isso no necessrio, mas na maioria dos casos ser utilizado). Neste exemplo eu usarei o formulrio HTML cgi_exemplo.htm. Abaixo esta transcrito o CGI criado para interpretar os dados do formulrio de exemplo. Esse CGI ser explicado calmamente mais tarde. O formulrio de exemplo contm todos os tipos de campos de um formulrio (exceto o campo file) a fim de ilustrar o uso da C_CGI com esses campos. /* Parte 1 */ #include <stdio.h> #include "c_cgi.h" void main() { /* Parte 2 */ tcgivar *args=pega_arg(); char ok=1, *fnome, *fend, *fbairr, *fcep, *ftel, *fcid, *fest, *femail, *fwin9x, *fwinnt, *funix, *foutsop, **fpagto, *fpropg, *fsugest; int i; /* Parte 3*/ fnome=val_arg("fnome",args); fend=val_arg("fend",args); fbairr=val_arg("fbairr",args); fcep=val_arg("fcep",args); ftel=val_arg("ftel",args); fcid=val_arg("fcid",args); fest=val_arg("fest",args); femail=val_arg("femail",args); fwin9x=val_arg("fwin9x",args); fwinnt=val_arg("fwinnt",args); funix=val_arg("funix",args); foutsop=val_arg("foutsop",args); fpagto=val_marg("fpagto",args); fpropg=val_arg("fpropg",args); fsugest=val_arg("fsugest",args); /* Parte 4*/

ok=(strlen(fnome) && strlen(fend) && strlen(fbairr) && strlen(fcep) && strlen(ftel) && strlen(fcid) && strlen(fest) && strlen(femail) && (fwin9x || fwinnt || funix || foutsop) && fpagto && fpropg); /* Parte 5*/ iniciar_cgi(NULL); printf("<html><title>Processando Cadastro</title>\n"); printf("<body>\n\n"); /* Parte 6*/ if(!ok) printf("Um ou mais campos no foram preenchidos. Apenas o campo de sugestes no precisa ser preenchido.\n"); else { /* Parte 7*/ printf("Parabns %s, seu cadastro foi preenchido com sucesso. ",fnome); printf("Se voc precisar alterar algum dos dados abaixo, utilize a opo \"alterar dados\" do menu.<p>\n"); printf("<b>Nome:</b> %s<br>",fnome); printf("<b>Endereco:</b> %s<br>",fend); printf("<b>Bairro:</b> %s<br>",fbairr); printf("<b>CEP:</b> %s<br>",fcep); printf("<b>Telefone:</b> %s<br>",ftel); printf("<b>Cidade:</b> %s<br>",fcid); printf("<b>Estado:</b> %s<br>",fest); printf("<b>Email:</b> %s<br>",femail); /* Parte 8*/ if(fwin9x) printf("Usa Windows 95.<br>"); if(fwinnt) printf("Usa Windows NT.<br>"); if(funix) printf("Usa Unix.<br>"); if(foutsop) printf("Usa um sistema operacional ainda no cadastrado.<br>"); /* Parte 9*/ printf("<b>Formas de Pagamento:</b>"); for(i=0; fpagto[i]; i++) printf(" %s",fpagto[i]); printf("<br><b>Receber Propagandas:</b> %s<br>",fpropg); printf("<b>Sugesto:</b> %s<br>",fsugest); } /* Parte 10*/ printf("</body></html>"); }

O CGI acima foi dividido em diversas partes, para facilitar a explicao: Parte 1: a simples declarao das bibliotecas que sero utilizadas pelo programa. Se voc for usar as funes de C_CGI, no poder esquecer de declarar a c_cgi.h. Parte 2: Ao declarar as variveis que sero utilizadas no programa deve-se, obrigatoriamente, declarar um ponteiro do tipo tcgivar que receber as informaes da funo pega_arg(), caso contrrio nenhuma outra funo da c_cgi poder ser utilizada. Nesse exemplo eu declarei tambm um ponteiro do tipo char para cada um dos campos do formulrio. Repare que o campo fpagto um ponteiro para ponteiro, visto que ele receber as informaes de quais formas de pagamento foram escolhidas (todos os checkboxes referentes forma de pagamento possuem o mesmo nome). J na escolha do sistema operacional cada um dos checkboxes possui um nome diferente, por isso fui obrigado a declarar uma varivel para cada opo de sistema operacional. O uso da primeira forma (todos os checkboxes com o mesmo nome) util quando se quer saber quais opes foram selecionadas (no caso da forma de pagamento), j o segundo caso (cada checkbox com um nome diferente) se faz necessrio quando se deseja saber se uma determinada opo est selecionada ou no (que o caso do sistema operacional, visto que eu posso permitir que o usurio baixe determinados arquivos caso seu sistema operacional for X). Parte 3: Aps declarar cada uma das variveis, preciso dar valores a elas. para isso que serve a funo val_arg e val_marg. A funo val_arg retorna o valor especificado pelo primeiro parmetro, enquanto que a funo val_marg retorna todas as opes marcadas de um checkbox onde todos os itens possuem o mesmo nome. Parte 4: Devo agora testar se todos os campos foram preenchidos, para isso eu atribuo valor 1 OK caso todos os campos foram preenchidos e atribuo 0 se ocorrer o contrrio. Para os campos de tipo texto eu devo testar se seu comprimento zero (para isso uso a funo strlen da stdio). J os campos booleanos (checkboxes) e campos de mltiplas escolhas (radios) eu simplesmente testo se o valor da varivel nulo. Parte 5: Antes de escrever qualquer coisa na pgina, devo informar ao servidor que o resultado desse cgi uma pgina HTML, para isso uso a funo iniciar_cgi passando o valor nulo. Logo em seguida eu coloco a parte inicial da pgina que ser escrita tendo o usurio preenchido todos os campo ou no. Parte 6: Agora testo o valor da varivel ok e, caso seje zero, forneo uma mensagem de erro ao usurio. Parte 7: Se a varivel ok tiver valor 1, simplesmente imprimo o valor de cada varivel. Se a varivel

se referir a um campo texto ou a um textarea eu simplesmente trato eles como se fossem strings normais do C (podendo usar qualquer funo que imprima uma string). Parte 8: Se a varivel for um checkbox onde cada opo possui um nome diferente, eu devo testar se o valor dessa varivel nulo. Se for porque a opo referente no foi marcada, caso contrrio ela foi marcada. Parte 9: Se a varivel for um checkbox onde todas as opes possuem o mesmo nome, eu devo fazer um loop dentro da varivel at encontrar um nulo. Parte 10: Resta apenas colocar a parte final da pgina que ser escrita tendo o usurio preenchido todos os campo ou no.

Compilando um Programa que use a C_CGI


Para explicar como se compila um programa usando a C_CGI, irei usar como conveno que o nome do arquivo fonte fonte.c e que a c_cgi.c (ou c_cgi.o) est no mesmo diretrio de fonte.c. Explicarei como compilar o fonte.c usando os seguintes compiladores: Borland C 3.1 para DOS, Borland C/C++ para Windows, DJGPP com Rhide e GCC do Linux. Alm disso, ser mostrada uma forma genrica para o uso da c_chi, que dever funcionar em qualquer compilador.

Borland C 3.1 para DOS:

Primeiro deve-se criar um projeto que contenha o fonte.c e o c_cgi.c ou c_cgi.obj. Para isso basta abrir o editor do Borland C e no menu Project / Open Project. Escolha um nome adequado para o seu projeto (o arquivo executvel ter o mesmo nome do projeto, porm com extenso EXE). Feito isso utilize o menu Project / Add Item para inserir os dois arquivos (fontes.c e c_cgi.c ou c_cgi.obj). Pronto para compilar basta ir no menu Compile / Build All.

DJGPP com Rhide: A forma de se compilar um programa com o DJGPP idntica do Borland C 3.1. Primeiro cria-se um projeto, inclui os arquivos relacionados ele e,

por fim, utiliza-se a opo compile / build all. A nica diferena que o arquivo objeto no ser mais o c_cgi.obj, mas sim o c_cgi.o. O c_cgi.o, compilado com o DJGPP, no pode ser utilizado no Borland, assim como o c_cgi.obj, compilado pelo Borland C 3.1, no pode ser usado num projeto do DJGPP.

GCC do Linux ou DJGPP do DOS (sem usar o Rhide): Atravs da linha de comando deve-se utilizar o comando gcc com a seguinte sintaxe: gcc -o fonte fonte.c c_cgi.c Com isso ser criado um arquivo executvel chamado fonte (se tiver utilizando o DJGPP pra DOS substitua o fonte por fonte.exe, logo aps o -o). Se voc s tiver o arquivo c_cgi.o, basta utilizar a sintaxe abaixo: gcc -o fonte fonte.c c_cgi.o

Voc pode criar um CGI com estes e quaisquer outros compiladores da forma que mostraremos a seguir. Para isto basta ter os arquivos c_cgi.c e c_cgi.h, que so os fontes da C_CGI. Vamos supor novamente que estes esto no mesmo diretrio do seu arquivo fonte.c. Primeiramente, abra seu cdigo fonte (fonte.c) com um editor qualquer. Deve haver uma referncia ao arquivo da c_cgi.c, tal como mostrada abaixo: #include "c_cgi.c" Isto far com que as funces da c_cgi sejam reconhecidas em seu programa e voc as possa usar normalmente Feito isso, basta recompilar seu projeto como se ele fosse um simples programa, isto , como se ele no utilizasse nenhuma biblioteca adicional. A forma como voc far isso depende do seu compilador. No caso do Borland C/C++ 5, por exemplo, v no menu Compile e escolha Build All.

Exerccios

Contador de Acessos: o Proposta: Criar um CGI que incremente a contagem de acessos a uma pgina. O nmero de acessos fica num arquivo e pode ser armazenado de qualquer forma. Sugesto: 1. Abrir (ou criar) o arquivo; 2. Se no houver nmero algum, colocar o contador em 0; 3. Incrementar o contador de acessos; 4. Exibir o nmero de acessos (em modo texto). o CGI comentado: exerc1.c

Cadastramento de Usurio: o Proposta: Criar um CGI que pegue os dados recebidos pelo formulrio abaixo e grave num arquivo caso o usurio ainda no exista na base de dados. o Formulrio HTML: exerc2.htm o CGI comentado: exerc2.c Login no Sistema: o Proposta: Criar um CGI que receba nome de usurio e senha do formulrio abaixo e verifique, na base de dados criada no exemplo acima, se as informaes de login so vlidas. o Formulrio HTML: exerc3.htm o CGI comentado: exerc3.c Busca de uma ocorrncia em um arquivo em modo texto: o Proposta: Criar um CGI que abra um arquivo em modo texto (dados.txt, por exemplo) e em seguida busca uma sentena escolhida no formulrio abaixo, exibindo a linha do texto que a contem. Por exemplo, dado um arquivo dados.txt com as trs linhas seguintes como seu contedo: Este um teste de CGI para busca Preencha o formulrio com a sentena que deseja procurar e clique em Localizar Ultima linha do arquivo. Se procurarmos por "deseja procurar", devemos obter como resposta a segunda linha, ou seja: Preencha o formulrio com a sentena que deseja procurar e clique em Localizar Formulrio HTML: exerc4.htm CGI comentado: exerc4.c

o o