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);
?>