• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Sistema de enquetes PHP e MySQL

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Construção de uma aplicação web para criar um sistema de enquetes com a tecnologia PHP e o banco de dados MySQL.



Capítulos do manual1.- Sistema de enquetes. Banco de dados a utilizar
A motivação que pode nos fazer criar um sistema de enquetes e uma descrição do banco de dados a utilizar.


2.- Imagens e páginas a utilizar no sistema de enquetes
Vamos utilizar várias imagens para criar as barras que aparecerão na resposta da enquete. Também vemos uma descrição das páginas PHP que utilizaremos na aplicação.


3.- Página que mostra a enquete
Vemos e explicamos o código da página que mostra a enquete em um formulário com todas as possíveis respostas para votar uma.


4.- Página que contabiliza e mostra os resultados da enquete
A explicação e o código da página que recebe o voto de um usuário, o contabiliza e mostra os resultados parciais da enquete até esse momento.


5.- Outro exemplo de enquete com PHP e MySQL
Vemos um novo exemplo da criação de um sistema de enquete, realizado em PHP e MySQL.


 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Sistema de enquetes. Banco de dados a utilizar


A motivação que pode nos fazer criar um sistema de enquetes e uma descrição do banco de dados a utilizar.
Por Carlos Eduardo Sotelo Pinto





Algumas vezes desejamos saber certas preferências dos visitantes de nossa página ou que opiniões têm sobre algum tema específico. Uma solução a isto é ter um sistema de enquetes, que contenha opções, as quais possamos votar. Antes de começar devemos ter em conta que nosso sistema de enquete deve ter os seguintes requerimentos.
•Permitir ao usuário votar entre um número de opções pré-definidas
•Permitir ao usuário ver o resultado das enquetes
•Permitir ao usuário conhecer o total da população avaliada no momento da leitura das enquetes
•Os resultados se mostrarão em forma gráfica e numérica
Referências: Este manual supõe que o leitor tem conhecimentos, mesmo que sejam básicos, sobre as tecnologias PHP e MySQL. Em CriarWeb dispomos do material necessário para dispor de tal base, principalmente em nossa seção PHP a fundo, e particularmente em nosso Manual de PHP e no Manual de MySQL.

Para resolver isto utilizaremos um banco de dados com duas tabelas, uma correspondente às opções da enquete e a outra para os dados do administrador.

Nota: A tabela de administração afeta diretamente ao funcionamento do sistema de enquetes. Simplesmente serviria para salvar nomes de usuários e senhas das pessoas que poderiam administrar a aplicação de enquetes. Porém, não a veremos por agora.
Ainda assim, queremos indicar que a criação do banco de dados poderia variar dependendo do desenvolvedor que a realize, podendo haver outras opções também interessantes para modelar este sistema de enquetes.


Nossa primeira tabela constará de 11 campos da seguinte maneira:
1.Um campo para a pergunta da enquete
2.Quatro possíveis respostas, as quais serão as que nos interessa saber
3.Quatro valores acumulativos do número de votos por cada resposta
4.Um campo para o valor total de votos
Até agora só indicamos 10 campos. O campo 11, que na verdade é o primeiro, é a nossa chave primária da tabela. O script SQL para a criação da tabela se encontra a seguir.

DROP TABLE IF EXISTS tblenc;
CREATE TABLE tblenc (
encid int(11) NOT NULL auto_increment,
encprg varchar(50) default NULL,
encrpt1 varchar(50) default NULL,
encrpt2 varchar(50) default NULL,
encrpt3 varchar(50) default NULL,
encrpt4 varchar(50) default NULL,
encval1 int(11) NOT NULL default '0',
encval2 int(11) NOT NULL default '0',
encval3 int(11) NOT NULL default '0',
encval4 int(11) NOT NULL default '0',
enctot int(11) NOT NULL default '0',
PRIMARY KEY (encid)
) TYPE=MyISAM;
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Imagens e páginas a utilizar no sistema de enquetes


Vamos utilizar várias imagens para criar as barras que aparecerão na resposta da enquete. Também vemos uma descrição das páginas PHP que utilizaremos na aplicação.
Por Carlos Eduardo Sotelo Pinto





Será importante ter quatro imagens, as quais servirão para mostrar o resultado gráfico da enquete. Cabe ressaltar que o tamanho das imagens pode ser expressado em forma percentual à respeito da posição onde se encontra. Assim:

<IMG HEIGHT="5" WIDTH="100%" SRC="imagens/barra1.gif">

As imagens que teremos serão as seguintes:

barra1.gif
barra2.gif
barra3.gif
barra4.gif

As páginas envolvidas

Antes de começar a entrarmos com o código PHP deste sistema de enquetes vamos descrever as principais páginas envolvidas.

Página que mostra a enquete
Teremos uma primeira página onde poderemos ver a enquete atual, com suas diferentes respostas, colocadas dentro de um formulário. Poderemos escolher uma resposta e envia-la para a contagem do voto.

Página que contabiliza o voto e mostra os resultados
A segunda página é a que recebe os dados do formulário e os registra na tabela da enquete, acrescentando uma unidade à resposta escolhida e ao campo onde introduzimos o número total de respostas. Posteriormente, esta mesma página mostrará uma tabela com os resultados parciais da enquete, depois da contagem do voto emitido pelo usuário.

Página de administração
Não a veremos, pelo menos por enquanto. Serviria para editar os dados de uma enquete ou criar novas enquetes. Seria acessível somente pelo administrador da página.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Página que mostra a enquete



Vemos e explicamos o código da página que mostra a enquete em um formulário com todas as possíveis respostas para votar uma.
Por Carlos Eduardo Sotelo Pinto





Agora desenharemos nosso formulário da enquete. Este formulário deverá se conectar ao nosso banco de dados para obter a pergunta e as possíveis respostas.

Embora nosso sistema esteja preparado para mostrar uma única enquete, o banco de dados é capaz de salvar várias. Deste modo poderíamos ter a enquete atual e o histórico de todas as enquetes que foram realizadas na página. A última enquete introduzida será a que se mostrará na página atual.

encuesta.gif



Para extrair a última enquete introduzida se utilizará uma sentença SQL na qual se ordenarão as enquetes pelo seu identificador, de maneira descendente.

SELECT * FROM tblenc order by encid desc

Outro detalhe no qual devemos observar é na criação de um campo hidden (oculto) de formulário para enviar à página de resultados o identificador da enquete à qual está sendo votada.

<?
$servidor="localhost";
$usuario="nobody";
$password="nobody";
$base="enqute";
$SQLid = mysql_connect($servidor,$usuario,$password);
mysql_select_db($base,$SQLid);
$SQLquery = "SELECT * FROM tblenc order by encid desc";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLrow = mysql_fetch_array($SQLresult);
?>
<form name="form1" method="post" action="enquete.php">
<input type=hidden name="encid" value="<?echo $SQLrow[0]?>">
<table width="270" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#006600"><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">::::::::::::::::::::::::::::::::::::::</font></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>
<? echo $SQLrow[1]?>
</strong></font></div></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <p> <font size="2">
<label>
<input type="radio" name="voto" value="1">
<? echo $SQLrow[2]?></label>
<br>
<label>
<input type="radio" name="voto" value="2">
<? echo $SQLrow[3]?></label>
<br>
<label>
<input type="radio" name="voto" value="3">
<? echo $SQLrow[4]?></label>
<br>
<label>
<input type="radio" name="voto" value="4">
<? echo $SQLrow[5]?></label>
<br>
</font></p></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <div align="center">
<input type="submit" name="Submit" value="Aceitar">
</div></td>
</tr>
</table>
</form>

Esta página armazena em uma variável chamada voto o valor da resposta de nosso participante, para logo ser enviada à página de resultados.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Página que contabiliza e mostra os resultados da enqueteA explicação e o código da página que recebe o voto de um usuário, o contabiliza e mostra os resultados parciais da enquete até esse momento.
Por Carlos Eduardo Sotelo Pinto





Agora definimos nossa página de resultados, na qual, o primeiro que deverá fazer, é obter o valor da variável voto e do identificador da enquete que foi votado.

Para poder atualizar nosso banco de dados com o objetivo de registrar o voto recebido, usaremos uma instrução deste tipo:

UPDATE tblenc SET encval$voto = encval$voto+1, enctot = enctot+1 where encid=$encid

Como podemos observar, utilizamos o valor da variável voto como parte do nome do campo a avaliar, incrementamos o mesmo e incrementamos o campo total, que é onde se acumulará o número de votos realizados. Para nos asseguramos de que se incrementam só os votos relacionados com a enquete atual, com o enunciado where, limitamos a atualização somente à enquete com o identificador recebido do formulário.

resultados.gif


Finalmente, nossa página mostrará o resultado da enquete, aqui dimensionaremos o tamanho das imagens para mostrar os resultados mediante porcentagens, que serão obtidas pela divisão do número de votos de uma resposta multiplicado por cem, entre o número total de votos. Assim:

<IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval1"]*100/$SQLrow["enctot"]?>%" SRC="imagens/barra1.gif">

Nosso script ficará da seguinte maneira:

<?
//recebo o voto
$voto = $_POST["voto"];
//recebo o id da enquete
$encid = $_POST["encid"];

$servidor="localhost";
$usuario="Administrador";
$password="";
$base="prova";
$SQLid = mysql_connect($servidor,$usuario,$password);
mysql_select_db($base,$SQLid);
$SQLquery = "UPDATE tblenc SET encval$voto = encval$voto+1, enctot = enctot+1 where encid=$encid";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLquery = "SELECT * FROM tblenc where encid=$encid";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLrow = mysql_fetch_array($SQLresult);
?>
<P ALIGN="center"><font size="4"><strong><em>RESULTADOS PARCIAINS DA
ENQUETE</em></strong></font></P>
<P ALIGN="center"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<?
echo $SQLrow["encprg"]
?>
</font></strong></P>
<TABLE ALIGN="center" WIDTH="75%" BORDER="0" CELLSPACING="1" CELLPADDING="1">
<!--DWLayoutTable-->
<TR>
<TD ALIGN="left" WIDTH="23%"><? echo $SQLrow["encrpt1"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval1"]*100/$SQLrow["enctot"]?>%" SRC="imagens/barra1.gif"></TD>
<TD ALIGN="center" WIDTH="14%"><? echo $SQLrow["encval1"]?> votos</TD>
</TR>
<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt2"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval2"]*100/$SQLrow["enctot"]?>%" SRC="imagens/barra2.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval2"]?> votos</TD>
</TR>
<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt3"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval3"]*100/$SQLrow["enctot"]?>%" SRC="imagens/barra3.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval3"]?> votos</TD>
</TR>
<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt4"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval4"]*100/$SQLrow["enctot"]?>%" SRC="imagenes/barra4.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval4"]?> votos</TD>
</TR>
</TABLE>
<P ALIGN="center">Total de votos emitidos: <? echo $SQLrow["enctot"]?></P>

Só falta definir a página de administração da enquete, a qual deverá contar com um administrador que torne possível a alteração destes dados, isto pode ser feito com um sistema de autentificação com senha encriptada para dar segurança, também pode-se utilizar cookies e/ou sessões para que um usuário não vote mais de uma vez na página, e outros truques que podem ser de grande utilidade para este sistema. Porém, já não é um tema de estudo deste manual. Fica ao engenho do desenvolvedor e aos requerimentos do sistema.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Outro exemplo de enquete com PHP e MySQL


Vemos um novo exemplo da criação de um sistema de enquete, realizado em PHP e MySQL.
Por Emmanuel García De Caro





Realizaremos uma simples enquete; porém muito funcional e sutil, utilizada em muitos web sites como uma coleta de opiniões e preferências ante opções e uma pergunta central.

Para isso utilizaremos uma tabela de dados Mysql.



Estrutura da tabela:

CREATE TABLE `enquete_blt` (
`id_enquete` varchar(5) NOT NULL default '',
`id_opcao` varchar(5) NOT NULL default '',
`ip` varchar(15) NOT NULL default '' )
TYPE=MyISAM;

O código Fonte:

enquete_blt.ini.php

<?
mysql_connect('localhost','root','')or die('ERRO NA CONEXAO:'.mysql_error());
mysql_select_db('banco_de_dados_')or die('ERRO AO ESCOLHER O BD :'.mysql_error());

function show_enquete($id_ENQUETE,$protecao_IP){
// COLOCO TODAS MINHAS PERGUNTAS E OPCOES
$enquete[1]=array('Qual Tecnologia voce utiliza?',array('Php','Asp','ColdFusion','Cgi','Perl','Jsp','Otra'));
//END
if (!array_key_exists($id_ENQUETE,$enquete)) return ('O id da enquete nao se encontra disponivel');
else
$pergunta_da_enquete = array_shift($enquete[$id_ENQUETE]);
$opcoes_da_enquete = array_pop ($enquete[$id_ENQUETE]);
if(isset($_POST[opcao])){
$ssqls=mysql_query('SELECT * FROM enquete_blt WHERE ip="'.$REMOTE_ADDR.'"')or die(mysql_error());
if($protecao_IP && mysql_num_rows($ssqls)>=1){
$html_enquete='<font color="#FF0000" face="tahoma" size="2"><strong>Voce ja tem um voto registrado</strong>o </font>';
}
else {mysql_query(' INSERT INTO enquete_blt VALUES("'.$id_ENQUETE.'","'.$_POST[opcao].'","'.$REMOTE_ADDR.'")')or die(mysql_error()); }
}

$ssql=mysql_query('SELECT * FROM enquete_blt WHERE id_enquete="'.$id_ENQUETE.'"')or die(mysql_error());
$total_votos=mysql_num_rows($ssql);

// IMPRIMIR OS RESULTADOS.
$html_enquete.='<form action="'.$_SERVER[REQUEST_URI].'" method="POST">';
$html_enquete.= '<strong>'.$pergunta_da_enquete.'</strong>';
$html_enquete.='<br>';
foreach($opcoes_da_enquete as $KEY => $OPCAO){
$ssql=mysql_query('SELECT * FROM enquete_blt WHERE id_enquete="'.$id_ENQUETE.'" and id_opcao="'.$KEY.'"')or die(mysql_error());
$votos_x_opcao=mysql_num_rows($ssql);
$estimar_porcentagem= @round($votos_x_opcao*100/$total_votos,1);
$html_enquete.= '<input name="opcao" type="radio" value="'.$KEY.'"';
if($_POST[opcao]==$KEY && isset($_POST[opcao])){$html_enquete.='checked'; }

$html_enquete.= '>'.$OPCAO.' '.$estimar_porcentagem.'% <strong>Votos: '.$votos_x_opcao.'</strong> <br>';
}

$html_enquete.='<br><input type="submit" value="Votar">';
$html_enquete.='</form>';
return $html_enquete;
}
?>

Explicação do código
Antes que nada, como de costume criaremos a conexão com o servidor Mysql e selecionaremos o banco de dados com o qual trabalharemos.

Definiremos uma função com o nome de show_enquete($id_enquete, $protecao_IP), onde $id_enquete, se refere ao identificador da enquete que utilizaremos. Este sistema está adaptado para suportar um sem fim de enquetes, e $protecao_IP cujo valor deve ser sempre um booleano (TRUE ou FALSE) e é o encarregado de não permitir que um usuário vote mais de uma vez, utilizando seu endereço IP como referência.

Associamos em um array multidimencional o conteúdo de nossa enquete:
$enquete[1]=array('Pergunta ',array('A','B','C','D','E','…',));

Onde 1, é o identificador de nossa enquete, se quisermos inserir uma nova pergunta utilizaremos $enquete [2] e assim sucessivamente seguindo o esquema, em ordem ascendente, cabe destacar que não podemos repetir o valor numérico, já que mudaríamos o conteúdo por este último. Pergunta, é a pergunta central da enquete e A,B,C,D,E,… são as opções a escolher pelos usuários. Podemos utilizar um sem fim de opções sempre e quando sigamos o esquema.

Logo, utilizamos a função array_key_exists(), para verificar que existe o identificador da enquete, esta função comprova se existe o índice ou a chave de um array. Colocamos o (!) ao começo para indicar se a condição da função anterior devolve FALSE, para retornar uma mensagem de erro; return ('O id da enquete nao…);

Agruparemos na variável $pergunta_da_enquete, o primeiro valor da matriz $enquete[$id_ENQUETE] com a função array_shift(), o que seria praticamente o mesmo utilizando $enquete[$id_ENQUETE][0]., porém, neste caso usamos uma função definida em PHP para este rol; como é o caso de array_pop(), que nos extrai o último valor da matriz $enqueta[$id_ENQUETE], que seria por sua vez outra matriz ou array com todas nossas opções da pergunta: array('A','B','C','D','E','…',)

Comprovaremos se $_POST[opcao] está definida ou toma algum valor, onde opção, é o nome do botão de OPCAO ou Radio. Se esta condição avalia TRUE, indica que alguma opção foi clicada e foi processado o formulário.

Para executar as seguintes instruções:

Enviaremos uma petição ao servidor Mysql com mysql_query(consulta…) para obter todos os registros onde coincidem a fila IP, com o endereço IP do cliente $REMOTE_ADDR, utilizando a cláusula WHERE. Logo, iniciamos uma nova condição, agora indicando se $protecao_IP é TRUE e (Lógico &&) o total de registros da consulta anterior é igual ou maior a 1. Para gerar uma mensagem de erro e impedir o registro do novo voto.

Algo como:
Meu IP é: 127.0.0.1

Executo a consulta Mysql e me indica que esse IP já está registrado em um voto anterior.
O valor que atribui a $protecao_IP quando chamar minha função é TRUE .
Então estes dois valores são VERDADEIROS. E o programa me responde bye, bye, bye. Você já votou…

Se $protecao_IP for FALSE, então posso votar um montão de vezes mesmo estando registrado o IP

Do contrário ( else )
Insere-se um novo registro com dados essenciais para o funcionamento desta enquete.

Fim do else

A partir deste ponto trabalharemos sem importar se está definida ou não $_POST[opcao].

Realizando uma nova consulta a Mysql, para obter o total de registro correspondente à enquete que está correndo. Para utilizar este valor no cálculo da porcentagem de cada opção.

$html_enquete, esta variável conterá o resultado que se imprimirá em tela, por isso usam-se conectores (.=) e seu conteúdo são etiquetas de HTML, com o formulário e os demais textos.

Utilizamos o prático loop FOREACH, para fazer um percorrido rápido de todas as opções (a,b,c,d,..) onde obteremos o valor do $KEY ou Chave e o nome da $OPCAO.

Voltaremos a realizar uma consulta para buscar agora todos os votos dessa opção e dessa enquete. Obtemos o total de registros.

Para logo com a função round() arredondar o valor de ($votos_x_opcao*100/$total_votos) com 1 decimal. Onde $votos_x_opcao são todos os votos por essa opção e $total_votos o total de votos por toda a enquete.

O mesmo processo empregado para obter qualquer porcentagem, colocamos o (@) para evitar que se mostre um erro por acaso $total_votos eh == a 0 ( ZERO)

Finalmente com return, retornamos o conteúdo de $html_enquete;

Para chamar a função executamos o seguinte:

<?
include('enquete_blt.ini.php');
echo show_enquete(1,true);
?>
 
Topo