Enquete em PHP e MySQL


Autor/fonte: Ândres Oliveira
E-mail/Url: http://www.revistaphp.com.br/artigo.php?id=137
Tags: [ enquete ]



Digg del.icio.us

Montaremos neste artigo 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

Arquivo 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 ('o ID da enquete não se encontra disponível').

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




Enviado por xKuRt em 28/06/2007 às 22:53


Itens relacionados

Exemplo de enquete com PHP e MySQL
PHPSurveyor - software livre de criação de questionários on-line
Montando uma enquete com AJAX e PHP

Avaliação

Esta publicação ainda não foi avaliada!


Avaliar:


A avaliação de publicações é restrita a membros cadastrados e logados no nosso site.



Comentários

Este artigo ainda não foi comentado ou o(s) comentário(s) que foi(ram) enviado(s) a ele ainda não foi(ram) publicado(s).


Envio de comentário:




  

Sexta, 18 de Abril de 2014




Top 5 membros

Últimos membros online

Últimos membros cadastrados



Capa do livro
Dominando Linux Firewall Iptables


Capa do livro
HTML 5 e CSS3: Desenvolva Hoje Com O Padrão De Amanhã


Capa do livro
Certificação Linux: Guia Para os Exames LPIC-1, CompTIA Linux+ e Novell Linux Administrator





Hostnet

IMD