PDA

Ver Versão Completa : Enquete - PhpMySql



pedrojr
19/12/2009, 01:17
Olá, venho compartilhar uma enquete simples em php, para estudo e uso.
Esta enquete foi feita no mini-curso de Php-MySql, do qual participei, realizado pela Secomp na UECE.

Tabela do banco:


CREATE TABLE enquetes (
id int(2) NOT NULL default '0',
nome varchar(100) NOT NULL default '',
op1 varchar(100) NOT NULL default '',
votos1 int(3) NOT NULL default '0',
op2 varchar(100) NOT NULL default '',
votos2 int(3) NOT NULL default '0',
op3 varchar(100) NOT NULL default '',
votos3 int(3) NOT NULL default '0',
op4 varchar(100) NOT NULL default '',
votos4 int(3) NOT NULL default '0',
exibir char(1) NOT NULL default ''
) TYPE=MyISAM;

INSERT INTO enquetes VALUES (1, 'O Que Você Achou do Meu Site', 'BOM', 0, 'Você chama isto de Site', 1, 'Nada Mal', 0, 'Péssimo', 0, 'S');


Código "config.php":


<?php
$host="localhost";
$user="root";
$senha="";
$dbname="banco";
?>


Código "open_db.php":


<?php
//Usuário e Senha
$con = mysql_connect($host,$user,$senha) or die("Erro ao conectar com o Banco");
//acessa ao banco especifico
mysql_select_db($dbname);
?>


Código "enquete.php":


<?php
/*Trecho para Computar Votos*/
include("config.php");
include("open_db.php");
if(isset($_POST['ok'])){
$enq = $_POST['enq'];
$ok = $_POST['ok'];
$id = $_POST['id'];

//Verifica se o visitante votou e se ele pode votar
if($ok=='Votar' && isset($enq) && !isset($_COOKIES['vota'])){
$query =("SELECT * FROM enquetes WHERE id=$id");
$resultado = mysql_query($query, $con); //Executa a consulta
$arr = mysql_fetch_array($resultado);
$voto = $arr[$enq];
$voto++;
$query2 = "UPDATE enquetes SET $enq = $voto WHERE id=$id";
$res = mysql_query($query2, $con); //Envia o voto
if($res){
//Define um cookie para verificar se o usuário já votou posteriormente
setcookie("vota", 'Votou');
echo "Sucesso !!!<br><hr>";
}
}
}
?>

<!-- Sua Página -->
<b> Vote na minha enquete </b><br>
<form action="#" method="post">
<!-- Para votar na Enquete-->
<?php
$query3 =("SELECT * FROM enquetes WHERE exibir='S'");
$resultado = mysql_query($query3, $con); //
$num = mysql_num_rows($resultado);
$arr = mysql_fetch_array($resultado);
$eu = $arr['id'];
echo($arr['nome']."<br></font>
<input type='radio' name='enq' value='votos1'> ".$arr['op1']."<br>
<input type='radio' name='enq' value='votos2'> ".$arr['op2']."<br>
<input type='radio' name='enq' value='votos3'> ".$arr['op3']."<br>
<input type='radio' name='enq' value='votos4'> ".$arr['op4']."<br><br>
<input type='hidden' name='id' value=".$arr['id']."> ");
echo("<input type='submit' name='ok' value='Votar'><br>
<a href=\"resul.php?id=$eu\">Resultados</a>");
?></form>


Código "resul.php":


<html>
<head>
<?php
include("config.php");
include("open_db.php");

if($con){
$id = (int)$_GET['id'];
$query =("SELECT * FROM enquetes WHERE id=$id");
$resultado = mysql_query($query,$con);
//retorna uma array com resultados
$arr = mysql_fetch_array($resultado);
//Cálculos para a porcentagem dos votos
$tudo = $arr['votos1'] + $arr['votos2'] + $arr['votos3'] + $arr['votos4'] ;
//Quantos votos no geral
$op1 = number_format(($arr['votos1']/$tudo) * 100 , 2, '.', ' ');
$op2 = number_format(($arr['votos2']/$tudo) * 100, 2, '.', ' ');
$op3 = number_format(($arr['votos3']/$tudo) * 100, 2, '.', ' ');
$op4 = number_format(($arr['votos4']/$tudo) * 100, 2, '.', ' ');
?>
<title>Resultado da enquetes</title>
<style>
<?php
echo("
#resut {width: 100px; border-width: 0 %}
#casa {background: '#ff0000'; width: $op1 %}
#bbb {background: '#00ff00'; width: $op2 %}
#nenhum {background: '#0000ff'; width: $op3 %}
#oque {background: '#aaaaaa'; width: $op4 %}");
?>
#c {background: '#ff0000'; width: 10px }
#b {background: '#00ff00'; width: 10px }
#n {background: '#0000ff'; width: 10px }
#o {background: '#aaaaaa'; width: 10px }
body {background: '#FFFFFF'; font-family: Verdana; font-size: 10pt}
#titulo {background: '#FFFFFF'; color: '#000000'; font-family: Verdana; font-size: 12pt}
td.res {color: '#000000'; font-family: verdana; font-size: 8pt}
</style>
</head>
<body>
<?php
echo("<div id='titulo'><b>".$arr['nome']."</b></div>
<table id='tabela'>
<tr><td class='res'>".$arr['op1']." </td>
<td width=110px><span id='c'></span><span id='resut'><span id='casa'></span></span></td>
<td> $op1% </td></tr>
<tr><td class='res'> ".$arr['op2']." </td>
<td width=110px><span id='b'></span><span id='resut'><span id='bbb'></span></span></td>
<td> $op2% </td></tr>
<tr><td class='res'> ".$arr['op3']." </td>
<td width=110px><span id='n'></span><span id='resut'><span id='nenhum'></span></span> </td>
<td> $op3% </td></tr>
<tr><td class='res'> ".$arr['op4']." </td>
<td width=110px><span id='o'></span><span id='resut'><span id='oque'></span></span></td>
<td> $op4%</td></tr>
</table><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Total de votos: $tudo");
}else{
echo "<h1>Erro !!!</h1>";
}
?>
<br><br>
<a href='javascript:self.close()'> [fechar] </a>
</body>
</html>


Explicando os arquivos:
config.php - configura parâmetros
open_db.php - abre conexão
enquete.php - dados da emquete
resul.php - mostra resultados

Bom é isso, espero que gostem e que seja útil!
Qualquer dúvida ou sugestão é só postar.

Vlw's :cool:

mm4rkk
19/12/2009, 07:51
Olá!

Ótima iniciativa! Estava precisando de algo parecido.. rss

Entretanto, está dando um erro quando uma opção é escolhida e votada. Uso o VertrigoServ, e não creio que o mesmo seja proveniente de alguma configuração do software. Eis a seguinte mensagem:

"Warning: Cannot modify header information - headers already sent by (output started at C:\Arquivos de programas\VertrigoServ\[Only registered and activated users can see links]) in C:\Arquivos de programas\VertrigoServ\[Only registered and activated users can see links] on line 21"

Tentei verificar o que poderia resolver, mas não encontrei uma solução plausível. Vou ficar antenado na correção. ;)



[]s, mm4rkk

pedrojr
19/12/2009, 08:35
Olá amigo, aqui está funcionando normalmente!!! :confused:

Estou usando o "EasyPHP-5.3.0", na pasta "C:\PhpServer\www"
e usando a tag "<?php" para códigos php.

Aqui os arquivos pra ficar mais fácil, junto vai imagens da enquete funcionando:
[Only registered and activated users can see links]

Qualquer coisa posta aki, ou manda pro meu email seus arquivos.

Vlw's :cool:

mm4rkk
20/12/2009, 12:29
Olá!

Testei com seus arquivos, e o erro ainda persiste. As tags estão corretas, e como estou na dúvida, enviei os meus arquivos para você testar aí.

Baixei os que você disponibilizou, e também deu erro.


[]s, mm4rkk

pedrojr
20/12/2009, 12:06
Olá, instalei o VertrigoServ e verifiquei que não se trata de um erro mas sim de uma "warning" = "advertência" e estas são configuradas para serem ou não mostradas, o que é muito bom em modo de desenvolvimento mas em servidores essa opção é desabilitada.

O que acontece é que no "EasyPHP-5.3.0" está configurado para não mostrar e no VertrigoServ o contrário. Mas você pode comentar essa linha no código:


21 //setcookie("vota", 'Votou');

Sendo que esta não é a melhor forma de impedir que o internauta vote mais de uma vez, como a intenção do post foi a enquete não me preocupei com função para pegar ip e tals para bloqueio. ;)

Para driblar utilizei a função ini_set() que muda a configuração do
"php.ini" temporariamente, veja:


if($res){
//Define um cookie para verificar se...
ini_set("display_errors", "Off");
setcookie("vota", 'Votou');
...

Lembrando que esta (ini_set()) função normalmente é desabilitada na maioria dos servers, por questão de segurança! :cool:

Foi o que consegui, caso encontre outra forma posta auê!

Vlw's