!! Голосование !!

Статус
Закрыто для дальнейших ответов.

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Зделал голосование, а вто как зделать, чтобы пользователь мог голосовать не больше одного раза, у меня не получается, делаю через куки. Посоветуйте?
 

DnAp

self::setDebugMode(true);
Регистрация
30.04.2005
Сообщения
490
Перед тем как выводить каку-ю то информацию в броузер пишем
Код:
setcookie ("test", "ON",time()+3600*24*30);  /* период действия - 30 дней */
А ближе у голосовалки:

Код:
if($_COOKIE["TestCookie"]=="ON")
{
// Выводим результаты
}else
{
// юзер еще не голосовал
}
 

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Спосибо...
Буду пробывать! :rolleyes:
 

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Что-то не получилось, можете помоч!


<?php
setcookie ("test", "ON",time()+3600*24*30); /* период действия - 30 дней */

?>
<link rel="stylesheet" href="vince.css">
<body bgcolor="#660066">
<table width="150" border="0" cellspacing="0" cellpadding="1" bgcolor="#FF9933" align=center>
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#660066">
<tr>
<td><br><br>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<? Error_Reporting(E_ALL & ~E_NOTICE);
if($_COOKIE["TestCookie"]=="ON")
{
if($vote == 1){
$fich="oui.txt";
$fp=fopen("$fich","r+");
$oui=fgets($fp,10);
$oui++;
fseek($fp,0);
fputs($fp,$oui);
fclose($fp);
}
if ($vote == 2){
$fich="non.txt";
$fp=fopen("$fich","r+");
$non=fgets($fp,10);
$non++;
fseek($fp,0);
fputs($fp,$non);
fclose($fp);
}
$fich="oui.txt";
$fp=fopen("$fich","r+");
$oui=fgets($fp,10);
fclose($fp);

$fich="non.txt";
$fp=fopen("$fich","r+");
$non=fgets($fp,10);
fclose($fp);

$result = (($oui*100)/($oui+$non));
$oui= $result;
$non= 100 - $oui ;
}
else
{
$fich="oui.txt";
$fp=fopen("$fich","r+");
$oui=fgets($fp,10);
$pour = $oui ;
fclose($fp);
}
$fich="non.txt";
$fp=fopen("$fich","r+");
$non=fgets($fp,10);
$contre = $non ;
fclose($fp);

$result = (($oui*100)/($oui+$non));
$oui= $result;
$non= 100 - $oui ;

?>
<table border="0" cellspacing=0 cellpadding=0 align="center">
<tr><td>
<img src="images/graph_gh.gif" width="30" height="98"><img src="images/space.gif" width="15" height="10"><img src="images/oui.gif" width="10" height="<? echo $oui; ?>"><img src="images/space.gif" width="15" height="10"><img src="images/non.gif" width="10" height="<? echo $non; ?>"></td></tr><tr><td><img src="images/graph_bs.gif" width="125" height="12" border=0></td></tr></table>
<br>
<form method="post" action="avotravis.php">
<div align="center">
<font color="#FF9933"><b>
<input type="radio" name="vote" value="1" >&nbsp;oui
<input type="radio" name="vote" value="2">&nbsp;non
</b></font>
<br><br>&nbsp;
<input type=image src="images/voter.gif" name="submit" value="Envoyer">
</div>
</form>
</td></tr></table>
<center>
<font color="#FF9933"><b>
OUI [<span class=copyrightvp><? print(intval($oui));?>%</span>]
NON [<span class=copyrightvp><? print(100-(intval($oui)));?>%</span>]<br>
VOTANTS[<span class=copyrightvp><? print($pour + $contre);?></span>]<br><br>
</b>
</font>
</center>
</td></tr></table>
</td></tr></table>
<body>





Где правильно куки ставить? :wacko:
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Конечно, можем и рады помочь!;)
Советую тебе полностью переделать концепцию голосования.
Если захочешь кину тебе свой рабочий вариант с кукисами на файлах.
Тебе надо серьезно поработать над тем, как хранить результаты голосования.
НЕ стоит для каждого результата выделять по файлу... Возможно, это просто пример, но все же.

Файл моего голосования храниться в виде (я не про настоящее на сайте говорю):

вопрос1:|:результаты1
вопрос2:|:результаты2
вопрос2:|:результаты3

После этот файл просто разбирается на вопросы и результаты и в случае необходимости он изменяется;)

Но вернемся "к нашим баранам". Я тебе написал верную логику. Тебе надо над ней поработать;)

Код:
<? 
if($_COOKIE["TestCookie"]=="ON") // Т.е. когда чел уже голосовал
{
// Проводишь действия по получении информации из файлов и ничего никуда не пишешь! 
}
elseif(IsSet($vote)) // Голосует
{
// Если у тебя пытаются голосовать, то ты увеличиваешь счетчик и устанавливаешь Куки
####################
// !(не забудь, что куки устанавливаются перед любым вывод...если ты хочешь все таки поместить куда хочешь установку кукисов, используй буферизацию)!

setcookie ("test", "ON",time()+3600*24*30); /* период действия - 30 дней */
####################
}
else // ТОлько собирается голосовть:)
{
// Ты подготавливаешь голосование к работе, т.е. тут выбирают ответы для голосования
}
?>
Ну а дальше разберешься;) Удачи!
 

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Спосибо!
Я был бы тебе очень признателен если бы ты скинул пример, своего голосования. :biggrin:
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Ну коли обещал, вот тебе мое голосование, которое я писал 1 года назад. Так что... не судить строго!:

Код:
<?
### переменные которые в конфиге настраиваются ###
$cookies_vote='123';
$file_name_vote='txt/vote.txt';

ob_start('ob_gzhandler');

############# Голосование

if(@$_COOKIE['vote']==$cookies_vote):
     $file_name=$file_name_vote;
     $file=fopen($file_name,'r');
     flock($file,LOCK_SH);
     $data=file($file_name);
     flock($file,LOCK_UN);
     fclose($file);
     echo'
          <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                 <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
        for($y=1;$y<count($data);$y++):
                    list($count,$text)=explode(':|||:',$data[$y]);
                    @$count_all+=$count;
        endfor;
          for($i=1;$i<count($data);$i++):
               list($count,$text)=explode(':|||:',$data[$i]);
               @$count_percent=($count/$count_all)*100;
               echo'
                    <TR><TD class="vote">',$text,'</TD><TD class="vote_counter">',$count,'/',round($count_percent, 1),'%</TD></TR>';
          endfor;
     echo'
          <TR><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_down">Всего голосов:</TD><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_counter_all">',$count_all,'</TD></TR>
          </TABLE>
          <table border="0"><tr><td height="1px"></td></tr></table>';
else:
     if(IsSet($_POST['vote'])&&!Empty($_POST['vote'])):

     setcookie('vote',$cookies_vote,time()+mktime(0,0,0,13,06,1986)); // Используется буферизация!

     $file_name=$file_name_vote;
     $data=file($file_name);
     $file=fopen($file_name,'a+');
     flock($file,LOCK_EX);
     ftruncate($file,0);
     fputs($file,trim($data[0])."\n");
                  for($i=1;$i<count($data);$i++):
                       list($count,$text)=explode(':|||:',$data[$i]);
                       if($_POST['vote']==$i) $count++;
                       $vote_text=trim("$count:|||:$text");
                       fputs($file,"$vote_text\n");
                  endfor;
     fflush($file);
     flock($file,LOCK_UN);
     fclose($file);
/////////////////////////////Чтение из файла уже изменившегося

     $file_name=$file_name_vote;
     $file=fopen($file_name,'r');
     flock($file,LOCK_SH);
     $data=file($file_name);
     flock($file,LOCK_UN);
     fclose($file);

/////////////////////////////////////// Показ результатов

     echo'
          <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                 <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
         for($y=1;$y<count($data);$y++):
                    list($count,$text)=explode(':|||:',$data[$y]);
                    @$count_all+=$count;
        endfor;
          for($i=1;$i<count($data);$i++):
               list($count,$text)=explode(':|||:',$data[$i]);
               @$count_percent=($count/$count_all)*100;
               echo'
                    <TR><TD class="vote">',$text,'</TD><TD class="vote_counter">',$count,'/',round($count_percent, 1),'%</TD></TR>';
          endfor;
     echo'
          <TR><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_down">Всего голосов:</TD><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_counter_all">',$count_all,'</TD></TR>
          </TABLE>
          <table border="0"><tr><td height="1px"></td></tr></table>';
     else:
          $file_name=$file_name_vote;
          $file=fopen($file_name,'r');
          flock($file,LOCK_SH);
          $data=file($file_name);
          flock($file,LOCK_UN);
          fclose($file);
          echo'
               <FORM action="" method="POST">
               <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                 <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
                      for($i=1;$i<count($data);$i++):
                           list($count,$text)=explode(':|||:',$data[$i]);
                           echo'
                                <TR>
                                    <TD class="vote">
                                        <input style="margin: -1px 0px -1px 0px;" type="radio" value="',$i,'" name="vote">',$text,'
                                    </TD>
                                    <TD class="vote_counter">
                                        ???
                                    </TD>
                                </TR>';
                      endfor;
          echo'
               <TR>
                   <TD style="BORDER-TOP: #D03634 1px solid;" align="center" colspan="2">
                       <input class="button_email" style="margin: 2px 0px 2px 0px;" type="submit" value="Голосовать">
                   </TD>
               </TR>
               </TABLE>
               </FORM>
               <table border="0"><tr><td height="1px"></td></tr></table>';
     endif;
endif;
ob_end_flush();
?>
к нему нужен файл vote.txt(неограниченное кол-во ответов):

Код:
Тема
0:|||:Ответ1
0:|||:Ответ2
0:|||:Ответ3
0:|||:Ответ4
0:|||:Ответ5
Юзай на здоровье:)
 

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Ого!! Огромное тебе спосибо буду розбирать.
 

Jayser

Member
Регистрация
07.10.2005
Сообщения
12
Ну это,что-то мне твой скрипт туго дается, да и он, что-то некоректно работает. Не добовляет голоса. Есть что-то поменьше?
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
2Jayser: Не может быть!!! Я его специально урезал и протестил! Ты откл. куки и у тебя все будет добавляться! Тут же только 1 раз можешь проголосовать.
 

Heel

Well-Known Member
Регистрация
13.11.2005
Сообщения
55
Можно еще добавить защиту от повторного голосования по айпишнику...
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
2!KoT!: давай подробнее, ты создал файл vote.php и vote.txt?
1-й файл ты инклюдишь в нужное место страницы, 2-й должен быть доступен для 1-ого...
Вообще я пока не понимаю в чем у тебя проблема, код 100% рабочий, если все сделано правильно.
Кинь сюда результат, т.е. то что ты видишь, а я подумаю, что это:)
 

!KoT!

Member
Регистрация
24.11.2005
Сообщения
16
Спасибо тебе Creator

Знаешь я вообще тупень во всех этих PHP. В общем мне тут сказали мол это надо инклюдить в PHP файл а не в HTML (до которого я пока дорос). Вот. Скрипт я уверен рабочий, просто я не соображу что с ним делать. DnAp на меня чуть не ругаеться. Мол я ни чего не шарю. А я действительно НЕ ШАРЮ!!!

Очень хочу разобраться во всём, и понять что к чему.

DnAp подсказал что файл .htaccess нужно создать с содержанием:
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
php_value error_reporting 7

И действительно форма посылки мыла заработала, а вот опрос нет. Я пока на денвере и мне пишет:
Parse error: parse error, unexpected T_STRING in z:\home\mysite.ru\www\vote.php on line 8

Вот.
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Ну насчет .htaccess, это он тебе посоветовал, дабы php код обрабатывался еще и в файлах с расширением *.html (htm)
Вероятно, ты оперируешь именно с подобными файлами, потому все правильно, хотя я бы так не стал делать.

А теперь конкретно по вопросу:

Приведи код файла vote.php, т.к. если бы использовался приведенный мною код без изменений, то ошибок бы не было. Скорее всего, при редактировании html-кода опроса была допущена ошибка.

Так что код в студию:)
 

!KoT!

Member
Регистрация
24.11.2005
Сообщения
16
Код:
<?
### переменные которые в конфиге настраиваются ###
$cookies_vote='123';
$file_name_vote='txt/vote.txt';
ob_start('ob_gzhandler');
############# Голосование
if(@$_COOKIE['vote']==$cookies_vote):
    $file_name=$file_name_vote;
    $file=fopen($file_name,'r');
    flock($file,LOCK_SH);
    $data=file($file_name);
    flock($file,LOCK_UN);
    fclose($file);
    echo'
         <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
       for($y=1;$y<count($data);$y++):
                   list($count,$text)=explode(':|||:',$data[$y]);
                   @$count_all+=$count;
       endfor;
         for($i=1;$i<count($data);$i++):
              list($count,$text)=explode(':|||:',$data[$i]);
              @$count_percent=($count/$count_all)*100;
              echo'
                   <TR><TD class="vote">',$text,'</TD><TD class="vote_counter">',$count,'/',round($count_percent, 1),'%</TD></TR>';
         endfor;
    echo'
         <TR><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_down">Всего голосов:</TD><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_counter_all">',$count_all,'</TD></TR>
         </TABLE>
         <table border="0"><tr><td height="1px"></td></tr></table>';
else:
    if(IsSet($_POST['vote'])&&!Empty($_POST['vote'])):
    setcookie('vote',$cookies_vote,time()+mktime(0,0,0,13,06,1986)); // Используется буферизация!
    $file_name=$file_name_vote;
    $data=file($file_name);
    $file=fopen($file_name,'a+');
    flock($file,LOCK_EX);
    ftruncate($file,0);
    fputs($file,trim($data[0])."\n");
                 for($i=1;$i<count($data);$i++):
                      list($count,$text)=explode(':|||:',$data[$i]);
                      if($_POST['vote']==$i) $count++;
                      $vote_text=trim("$count:|||:$text");
                      fputs($file,"$vote_text\n");
                 endfor;
    fflush($file);
    flock($file,LOCK_UN);
    fclose($file);
/////////////////////////////Чтение из файла уже изменившегося
    $file_name=$file_name_vote;
    $file=fopen($file_name,'r');
    flock($file,LOCK_SH);
    $data=file($file_name);
    flock($file,LOCK_UN);
    fclose($file);
/////////////////////////////////////// Показ результатов
    echo'
         <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
        for($y=1;$y<count($data);$y++):
                   list($count,$text)=explode(':|||:',$data[$y]);
                   @$count_all+=$count;
       endfor;
         for($i=1;$i<count($data);$i++):
              list($count,$text)=explode(':|||:',$data[$i]);
              @$count_percent=($count/$count_all)*100;
              echo'
                   <TR><TD class="vote">',$text,'</TD><TD class="vote_counter">',$count,'/',round($count_percent, 1),'%</TD></TR>';
         endfor;
    echo'
         <TR><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_down">Всего голосов:</TD><TD style="BORDER-TOP: #D03634 1px solid;" class="vote_counter_all">',$count_all,'</TD></TR>
         </TABLE>
         <table border="0"><tr><td height="1px"></td></tr></table>';
    else:
         $file_name=$file_name_vote;
         $file=fopen($file_name,'r');
         flock($file,LOCK_SH);
         $data=file($file_name);
         flock($file,LOCK_UN);
         fclose($file);
         echo'
              <FORM action="" method="POST">
              <TABLE cellpadding="0" cellspacing="0" class="menu" width="252px" border="0">
                <TR><TD style="BORDER-BOTTOM:  #D03634 1px solid;" colspan="2" class="vote_top">',$data[0],'</TD></TR>';
                     for($i=1;$i<count($data);$i++):
                          list($count,$text)=explode(':|||:',$data[$i]);
                          echo'
                               <TR>
                                   <TD class="vote">
                                       <input style="margin: -1px 0px -1px 0px;" type="radio" value="',$i,'" name="vote">',$text,'
                                   </TD>
                                   <TD class="vote_counter">
                                       ???
                                   </TD>
                               </TR>';
                     endfor;
         echo'
              <TR>
                  <TD style="BORDER-TOP: #D03634 1px solid;" align="center" colspan="2">
                      <input class="button_email" style="margin: 2px 0px 2px 0px;" type="submit" value="Голосовать">
                  </TD>
              </TR>
              </TABLE>
              </FORM>
              <table border="0"><tr><td height="1px"></td></tr></table>';
    endif;
endif;
ob_end_flush();
?>
По моему один в один.
А почему бы ты так не делал и как лучше сделать?
 

!KoT!

Member
Регистрация
24.11.2005
Сообщения
16
Код:
</td>
</tr></table>
<? include "http://www.mysite.ru/vote.php" ?>
</td>
</tr></table>
</td>
Ну а это код в страничке HTML.
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Защита от накрутки:

1. По COOKIE
2. По логину
3. IP

Так, чтобы проголосовать юзерй придется:

1. Почистить COOKIE
2. Изменить IP (Proxy)
3. Зарегистрироваться по новой (А заничит, скорее всего, прийдется регить новое мыло)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ