Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > setcookie


Автор: PARROT 29.3.2006, 18:16
Продолжаю писать форум.
Наткнулась на проблему в голосовании: если человек проголосовал в одной теме для голосования, ставим ему куки.
Теперь почему-то во всех остальных темах с другим голосованием, голосовать уже не может.
Понимаю, что нужно ставить в куки идентификатор голосования, но не доходит как его поставить.
Код

        if(empty($_POST['golos'])=="голосовать" && empty($_POST['prosmotr'])=="просмотреть результаты" && !$_COOKIE['opros'] && !$_COOKIE['ros']){
                  $viv=mysql_query("SELECT id_opr,id_otv,otvet FROM opros WHERE id_opr=$idp");
                  while($ot=mysql_fetch_row($viv)){
?>
                  <form method=post>
                  <table width=300 cellpadding=0 cellspacing=0>
                  <tr>
<?
                  echo "<td width=20><input type=radio name=rad[$ot[0]] value=".$ot[1]."></td><td>".$ot[2]."</td>";
                  }//вывели голосование
?>
</tr>
</table>
</td>
</tr>
<tr>
<td align=center bgcolor=#F2F2F2 colspan=3>
<table>
<tr>
<td><input type=submit name=golos value="голосовать"></td>
<td><input type=submit name=prosmotr value="просмотреть результаты"></td>
</tr>
</table>
</form>
<?
}else{                          //считаем голоса
// если нажата кнопка то увеличиваем счетчик голосования и ставим куку на час
                           if(isset($_POST['golos'])=="голосовать" && !$_COOKIE['opros']) {
                           setcookie ("opros","rad",time()+3600, "/");
                           while (list($idx,$val)=each($_POST['rad'])) {
                           mysql_query("UPDATE opros SET numb=numb+1   WHERE  id_otv='".$val."'") or die(mysql_error());
                           }
                           }//конец обновления голосования
                            setcookie ("ros","win",time()+3600, "/");
                            //запрос общего количества голосов
                            $query="select * from opros WHERE id_opr='$idp'";
                            $result=mysql_query($query);
                            $num_vot=mysql_num_rows($result);
                            //подсчет общего количества голосов
                            $total_votes=0;
                            while($row=mysql_fetch_object($result)) {
                            $total_votes+=$row->numb;
                                  }
                            $prosmotr=mysql_query("SELECT id_opr,otvet,numb FROM opros WHERE id_opr=$idp");
                            while($vivod=mysql_fetch_row($prosmotr)){
?>
<table width=100% cellspacing=0 align=center>
<tr>
<td width=45% align=right><?=$vivod[1];?></td><td width=10% align=center>[ <b><?=$vivod[2];?></b> ]</td>
<td width=45%>
<img src=image.php?vivod[2]=<? echo $vivod[2]; ?>&total_votes=<? echo $total_votes; ?> width=200 height=15>
</td>
</tr>
<?
                               }//конец вывода просмотра
?>
<tr>
<td colspan=3 align=center>всего голосов: <?=$total_votes;?></td>
</tr>
</table>
<?
}
?>
</td>
</tr>

Посоветуйте как правильно поступить.

Автор: Ciber SLasH 29.3.2006, 18:25
А зачем такое сравнение: empty($_POST['golos'])=="голосовать"
ведь функция empty() возвращает либо true либо false и сравнивать надо на булево значение, т.е. достаточно if (empty($_POST['golos']) ...)

На счёт кук: я бы поставил id-голосования и в качестве голоса, просто либо 0 либо 1. Можно для запоминания ещё и записать куда-нить в БД или файл.

Автор: CyClon 29.3.2006, 20:33
Блокировать юзеров надо по HTTP_X_FORWARDED_FOR, и если он не известен (Юзается прокси), то ен допускать к голосованию. Защита более чем на 90% от накрутки.

Автор: wil 29.3.2006, 20:35
записывай в базу id топика, в котором юзверь проголосовал. если анонимное голосование - в куку пихай эту id.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)