+1

Desenvolvendo um sistema de Enquete Completo (yourspot.com.br) - Parte 1

criado por Carlos Roberto em 03/10/2006 11:37am
Este tutorial tem como foco principal, a explicação do funcionamento e desenvolvimento de um sistema de enquete, no qual você irá aprender sobre aspectos importantes e muito utilizados no php, como manipulação de dados em banco de dados MySQL, estrutura e organização de um sistema, funções da linguagem, segurança, etc.

Iremos criar um sistema com muitos recursos, prático, fácil de usar e funcional, em que poderá criar quantas enquetes desejar e com o número de opções que precisa. Possibilitando a alteração do código com facilidade, já que a parte do layout principal está separada de todos os códigos, além de apresentar comentários importantes no código para o entendimento.

Só para esclarecer, por se tratar de um tutorial completo e grande, estarei dividindo cada parte do tutorial em páginas, mas não vão confundir pensando ser uma outra parte, pois sempre que eu publicar uma nova parte do tutorial, estarei postando como um novo artigo, para facilitar na organização e não deixar ninguém exausto de tanto ler.

- Dados do Sistema
Tutorial do Script: Enquete yS - Full v. 1.0 (yourspot.com.br)
Download: http://phpbrasil.com/scripts/script.php/id/3242
Página oficial: http://yourspot.com.br/systens/enquetev1/
Demonstração do sistema: http://yourspot.com.br/systens/enquetev1/index1.php

Objetivos do sistema:
- Votação com múltiplas opções;
- Gráfico de resultados, porcentagem e número de votos;
- Painel de Administração;
- Arquivo com todas as enquetes já realizadas;
- Fácil assistente para instalação, bastando rodar apenas um arquivo.


Iniciando o Sistema:

Todas as explicações encontram-se em forma de comentários no próprio código do script (cor laranja):
// Comentário
# Comentário
/* Comentário */


No arquivo enquetes.php, iremos criar a estrutura “base” de nossa enquete.

[enquetes.php]
<?php
if ($totalenquetes > 0) {  //defini a condição caso a varíavel "totalenquetes" seja maior que 0

//neste if, iremos definir todas as condições para exibir nossa enquete:
    if (

      //se não existe isset "!isset", insere o valor da opção e resultados
      !isset ($_REQUEST['opcao']) && !isset ($_REQUEST['resultados'])
       //e verifica SE votocookies é diferente de "não" (então se está ativado)
       && $votocookies != 'no'
       //o mesmo ocorre com votoip (diferente de não, então está ativado e grava o ip)
       && $votoip != 'no'
       //bloqueado (diferente de SIM, então a enquete não está bloqueada)
       && $bloqueado != 'yes'
       //se a enquete estiver INICIADA, então igual a sim, isto irá exibir a enquete
       && $iniciado == 'yes'
       //E se a enquete não estiver EXPIRADA, é outra condição necessária para exibir a enquete
       && $expirado == 'no'
       //E a varíavel "enquetes" verifica se votando é igual a sim, para permitir os usuários votarem
       && $enquetes['votando'] == 'yes')


   //finalmente, se todas as condições foram aceitas, iremos imprimir a enquete:
   {

        //a variável enquete é igual ao comando MySLQ (que irá selecionar os dados da enquete no banco de dados)       //WHERE, quer dizer que selecionará os dados do ID referente a enquete (na variável "whatenquete"
        $enquete = mysql_fetch_array (mysql_query ("SELECT enqueteid, titulo, votando, resultados, grafico FROM enquetes WHERE enqueteid='$whatenquete'"));

        //a variável opção é igual ao comando MySLQ (que irá selecionar os dados das opções no banco de dados) e novamente WHERE enqueteid, pra mostrar as opções desta única enquete
        $opcao = mysql_query ("SELECT opcaoid, opcoes, order_id FROM opcoes WHERE enqueteid='$whatenquete' ORDER BY order_id ASC");
    
/*
Abaixo, a exibição do formulário de enquete, então agora bastará exibir as variáveis corretas para impressão dela.
Obviamente, isto pode ser algo complicado para quem está começando, porém vou pular algumas partes, mas não se preocupe,
basta acessar o tópico aberto no fórum do yourSpot.com.br para poder tirar suas dúvidas. Podem perguntar a vontade =)
*/
?>
<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post" name="frmenquete">
<table width="190px" border="0" cellspacing="0" cellpadding="2">
    <tr class="text">
        <td height="50" width="190" colspan="2" align="center" background="admin/lay_enquete/enquete_quest.jpg"><font color="#FFFFFF"><?= $enquete['titulo']; /* exibe a pergunta da enquete */ ?></font></td>
    </tr>
    <?php while ($opcaorows = mysql_fetch_array ($opcao)) { ?>
    <tr class="text">
        <td width="10%" align="center" height="25"><input name="opcao" type="radio" value="<?= $opcaorows['opcaoid']; ?>"<?php if ($opcaorows['order_id'] == 1) { echo " CHECKED"; } /* aqui inserimos um if, para se a order_id de opcaorows for igual a 1, mostrar checado */ ?>></td>
        <td width="90%"><?= $opcaorows['opcoes']; /* este trecho irá inserir as opções da enquete */ ?></td>
    </tr>
    <?php } ?>
    <tr>

        <td colspan="2" align="center" height="25"><input name="stage" type="hidden" value="2"><input name="enquete" type="hidden" value="<?= $enquete['enqueteid']; ?>"><input type=image height=20 width=52 src="admin/lay_enquete/votar_enquete.gif" border=0 name=btnvoto alt="Votar">

        <?php
        //condição: resultados da enquete devem estar ativados para serem exibidos
        if ($enquete['resultados'] == 'yes'

        //condição: gráfico da enquete devem estar ativado para ser exibido
        && $enquete['grafico'] == 'yes')

       //se as condições forem aceitas, mostrar link para os resultados da enquete específica (pegando seu ID)
        {
        ?>
        <br>
        <a href="<?= $_SERVER['PHP_SELF']; ?>?enquete=<?= $whatenquete; /* variável whatenquete verifica qual enquete está sendo exibida para exibir os resultados desta enquete */ ?>&resultados=1" class="text">Ver Resultados</a><?php } ?></td>
    </tr>
</table>
</form>
<?php
    
    }

    $enquete = mysql_fetch_array (mysql_query ("SELECT enqueteid, titulo, votando, resultados, grafico, resultadosvotos FROM enquetes WHERE enqueteid='$whatenquete'"));
        
        if (($bloqueado == 'yes' | $votoip == 'no' | $votocookies == 'no' | isset ($_REQUEST['resultados']) | $enquete['votando'] == 'no' | isset ($_REQUEST['opcao'])) && $enquete['grafico'] == 'yes' && $iniciado == 'yes') {
        
            if (((isset ($_REQUEST['resultados']) && $enquete['resultados'] == 'yes' && ($votoip != 'yes' | $votocookies != 'yes')) | !isset ($_REQUEST['resultados'])) && $iniciado == 'yes') {
            
                $opcao = mysql_query ("SELECT opcoes, votos, imagens, order_id FROM opcoes WHERE enqueteid='$whatenquete' ORDER BY order_id ASC");
                $total = mysql_fetch_assoc (mysql_query ("SELECT SUM(votos) AS total FROM opcoes WHERE enqueteid='$whatenquete'"));

?>
<link href="css/css.css" rel="stylesheet" type="text/css">
<table width="190px" border="0" cellspacing="0" cellpadding="2">
    <tr class="text">
        <td height="50" colspan="2" align="center" width="190" background="admin/lay_enquete/enquete_quest.jpg"><font face="Verdana" size="1" color="#FFFFFF"><?= $enquete['titulo']; ?></font></td>
    </tr>


    <?php 
    
    while ($opcaorows = mysql_fetch_array ($opcao)) {

        //calcula a porcentagem de acordo com o número total de votos de cada opção
        @$percent = round (($opcaorows['votos'] / $total['total']) * 100);

        //se as imagens da opcaorows forem igual a random (rotacionar)
        if ($opcaorows['imagens'] == 'random') {

            //se tem a variável handle ($handle) abrirá o diretório definido na configuração da variável dir2 (para pegar as imagens)
            if ($handle = opendir ($dir2)) {

                //ler os arquivos do diretório aberto acima
                while (false !== ($file = readdir ($handle))) {

                    //se $file não é igual a . e não é igual a ..
                    if ($file != '.' && $file != '..') {

                        //então $files[] será igual a $file ou seja, não irá considerar nenhum diretório acima do sistema
                        $files[] = $file;
                                    
                    }                
                                    
                }

                //misturar os arquivos de imagens para rotacionarem
                shuffle ($files);
                            
            }

            // rotacionar os arquivos
            $rand = rand (0, (count ($files) - 1));

            //cada opção terá uma imagem para o gráfico, aberta no diretório configurado e rotacionando
            $opcaorows['imagens'] = $files[$rand];
                            
        }
    
?>
    <tr class="text">
        <td width="10%" height="15"><?= $opcaorows['opcoes']; /*exibi as opções*/ ?> - <?= $percent; /*a porcentagem de votos que cada opção recebeu*/ ?>%

        <?php

         //se os resultados dos votos estão ativados, mostrar o número de votos de cada opção
         if ($enquete['resultadosvotos'] == "yes") { echo " / ".$opcaorows['votos']." Votos"; }

         ?>

         </td>

    </tr>
    <tr class="text">
        <td width="10%" height="15"><img src="<?= $dir2; /*pega a imagem do diretório configurado nesta variável*/ ?>/<?= $opcaorows['imagens']; ?>" width="<?= ($percent * $width) + 10; /*este código pega o valor de $percent e multiplica pela variável widht (largura - definida na configuração) e soma 10px e exibi esta largura da imagem gerando o gráfico*/ ?>" height="<?= $height; /*aqui exibi a altura da img.*/?>" alt="<?= $opcaorows['opcoes']; ?>"></td>
    </tr>
    <?php } ?>
    <tr class="text">
        <td height="25" align="center"><?php if ($enquete['resultadosvotos'] == "yes") { ?>Total Votos: <?= $total['total']; /*finalmente, imprime o número total de votos se os resultados estiverem ativados*/ ?><?php } if (isset ($_REQUEST['resultados'])) {?><br><a href="<?= $_SERVER['PHP_SELF']; ?>?enquete=<?= $whatenquete; ?>" class="text">Vote na Enquete</a><?php } ?></td>
    </tr>
</table>
<?php

        }

    }

} else {

?>
<?
//abaixo são exibidas as mensagens do sistema
?>
<div align="center" class="text">Erro: Não existe nenhuma enquete. Por favor <a href="admin/index.php" class="text">crie</a> uma.</div>
<?php } if ($totalenquetes > 0 && $enquete['votando'] == 'no' && $enquete['grafico'] == 'no') { ?>
<div align="center" class="text">Desculpe, você não pode votar ou ver resultados nesta enquete.</div>
<?php } if ($totalenquetes > 0 && $enquete['votando'] == 'yes' && $enquete['grafico'] == 'no' && isset ($_REQUEST['opcao'])) { ?>
<div align="center" class="text">Obrigado por votar na enquete.</div>
<?php } if ($totalenquetes > 0 && $enquete['votando'] == 'yes' && $enquete['grafico'] == 'no' && ($votoip == 'no' | $votocookies == 'no') && !isset ($_REQUEST['opcao'])) { ?>
<div align="center" class="text">Desculpe, você não pode ver os resultados da enquete <?= $enquetes['titulo']; ?></div>
<?php } if ($totalenquetes > 0 && $enquete['resultados'] == 'no' && isset ($_REQUEST['resultados'])) { ?>
<div align="center" class="text">Desculpe, você não pode ver os resultados da enquete <?= $enquetes['titulo']; ?></div>
<?php } ?>

Comentários:

Mostrando 1 - 3 de 3 comentários
nasser disse:
Parece bem completo,vc estarodando esta enquete em algum site que possa ver ela
24/07/2010 9:44am (~13 anos atrás)

nasser disse:
O que é este link: http://yourspot.com.br/systens/enquetev1/index1.php.
Ele não funciona
24/07/2010 9:36am (~13 anos atrás)

AnaLilo disse:
Nossa muito bom este sistema... vlw pelo código! =D
03/12/2009 3:42pm (~14 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)