Система голосования на сайте
Бывает необходимым организовать на сайте систему голосования пользователей. Например, это может быть система голосования за товары на сайте-каталоге и организация рейтинга товаров в соответствии с числом поданных голосов. Рассмотрим пошагово, как написать скрипт голосования.
1. Скрипт голосования на сайте удобно разместить в отдельном файле, например, votes.php. Наш скрипт должен создавать таблицу базы данных о голосах за каждый конкретный товар, таблица создаётся автоматически при первом голосовании за данный товар. Ведь не заставлять же администраторов сайта-каталога создавать таблицу вручную при внесении в каталог каждого нового товара! Таблица содержит поля, ответственные за идентификационный номер голоса, идентификационный номер товара, собственно переменной, обозначающей, что голос подан (можно придать ей значение "1", строки с этими полями затем подсчитываются при формировании рейтинга), IP пользователя (но можно и без него), ник пользователя и категорию товара.
Код PHP/MySQL
mysql_query("CREATE TABLE IF NOT EXISTS votes_$cid (
vid int(10) NOT NULL auto_increment,
id int(10) NOT NULL,
pluss int(10) NOT NULL,
ip_addr char(50) NOT NULL,
nick varchar(255) NOT NULL,
dat_lim date NOT NULL,
cid int(10) NOT NULL,
PRIMARY KEY(vid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8") Or die(mysql_error());
Показанная в коде выше конструкция автоматического создания таблицы является предметом вопроса в Тесте по теме Программирование PHP/MySQL.
Пусть на сайте голосовать имеют возможность лишь зарегистрированные пользователи, можно установить ограничение голосования по дате, установить суточный лимит голосования за тот или иной товар (это всё на случаи, если есть подозрения в "накрутке голосов"), а также открывать голосование лишь спустя некоторое время после появления товара в каталоге, а также устанавливать дату окончания голосования, если этого требует конкретная бизнес-логика.
2. В нашем скрипте должна происходить проверка, отправлены ли данные из формы, то есть, нажал ли посетитель каталога кнопку "голосовать" (за это отвечает переменная $_POST["sended"] со значением "yes"). Далее - проверка, является ли проголосовавший зарегистрированным пользователем ($rights>0). Если есть необходимость завершить голосование за тот или иной товар к определённой дате - проверка, не завершено ли голосование ($end_dat<$dat).
Код PHP
if($_POST["sended"]=="yes")
{
if($rights>0)
{
if ($row01==0)
{
$dat=date("Y-m-d H:i:s");
if ($end_dat<$dat)
{
echo "Голосование уже завершено!";
}
elseif ($dat<$end_dat)
3. Если в соответствии с датой голосовать можно, выполняется блок голосования. Однако в его начале происходит проверка, не исчерпан ли суточный лимит голосования за данный товар, а также проверка на случай, если голосование ещё не открыто. Если всё в порядке и голосовать можно, данные заносятся в базу, в ту её таблицу, которая содержит данные о голосовании за данный товар (таблица votes_$cid). Далее путём нового запроса к этой же таблице подсчитывается число голосов (строк) за товар с данным id. Затем в таблицу с данными обо всех товарах (goods) соответственно id товара записывается обновлённое число строк, каждая из которых означает один голос за данный товар.
Код PHP
if ($end_dat<$dat)
{
echo "Голосование уже завершено!";
}
elseif ($dat<$end_dat)
{
if ($row11<=49)
{
if ($v_cl==1)
{
echo "Голосование ещё не открыто";
}
elseif ($v_cl==0)
{
$result1=mysql_query("INSERT INTO votes_$cid
(id,ip_addr,nick,pluss,dat_lim,cid)
VALUES ('$id','$ip_addr','$nick','$pluss','$dat_new','$cid')");
$result2=mysql_query("SELECT * FROM votes_$cid WHERE id='$id'") or die (mysql_error());
$row2=mysql_num_rows($result2);
$result3=mysql_query("UPDATE goods SET votes='$row2' WHERE id='$id'");
}
4. А ниже показано, что предусматривает программа в случае отрицательных ответов на обозначенные выше вопросы.
Код PHP
else
{
echo "Cуточный лимит голосования за этот товар исчерпан";
}
}
}
else
{
echo "Вы уже проголосовали за этот товар";
}
}
else
{
echo "Для участия в голосовании нужно войти в систему";
}
}
else
{
echo "It`snt OK";
}
5. И, наконец полный код блока, реализующего голосование. Нужно только перед показанным кодом сделать проверку (if (isset ...)), существуют ли значения переменных, переданных из формы для голосования в наш скрипт. А в самом верху разместить запрос к базе на создание новой таблицы (самый первый фрагмент кода)
Код PHP
$result01=mysql_query("SELECT * FROM votes_$cid WHERE nick='$nick' AND id='$id'") or die (mysql_error());
$row01 = mysql_num_rows($result01);
$resultT=mysql_query("select voting_closed,end_ FROM categories WHERE cid='$cid'") or die (mysql_error());
$myrowT=mysql_fetch_array($resultT);
$end_dat = $myrowT[end_];
$v_cl = $myrowT[voting_closed];
$dat_new=date("Y-m-d");
$resultL1=mysql_query("select * FROM votes_$cid WHERE dat_lim='$dat_new' AND id='$id'") or die (mysql_error());
$row11 = mysql_num_rows($resultL1);
if($_POST["sended"]=="yes")
{
if($rights>0)
{
if ($row01==0)
{
$dat=date("Y-m-d H:i:s");
if ($end_dat<$dat)
{
echo "Голосование уже завершено!";
}
elseif ($dat<$end_dat)
{
if ($row11<=49)
{
if ($v_cl==1)
{
echo "Голосование ещё не открыто";
}
elseif ($v_cl==0)
{
$result1=mysql_query("INSERT INTO votes_$cid
(id,ip_addr,nick,pluss,dat_lim,cid)
VALUES ('$id','$ip_addr','$nick','$pluss','$dat_new','$cid')");
$result2=mysql_query("SELECT * FROM votes_$cid WHERE id='$id'") or die (mysql_error());
$row2=mysql_num_rows($result2);
$result3=mysql_query("UPDATE goods SET votes='$row2' WHERE id='$id'");
}
}
else
{
echo "Cуточный лимит голосования за этот товар исчерпан";
}
}
}
else
{
echo "Вы уже проголосовали за этот товар";
}
}
else
{
echo "Для участия в голосовании нужно войти в систему";
}
}
else
{
echo "It`snt OK";
}
Осталось лишь вывести на видимых для пользователей страницах (на главной или на всех) рейтинг товаров в соответствии с количеством голосов, поданных за тот или иной товар. Для этого в запросе на отбор товаров из соответствующей таблицы базы данных указывается ранжирование по голосам. Но это уже другая история...
Поделиться с друзьями