Главная » Полезные статьи » Язык PHP » Голосование на базе
Распечатать статью

Голосование на базе

«А зачем на базе?» — спросите Вы и будете абсолютно правы. В принципе незачем. Просто делая как-то систему управления, я столкнулся с необходимостью дать абсолютно некомпетентному в кодинге человеку рули от здорового сайта. Я человек ленвиый, и представив, сколько места на винте будет занимать архив голосований, и как мне надо форматировать текстовые файлы, чтобы собирать ту статистику, которую хотел заказчик, решил пойти изващенным, но более универсальным путем.

Сперва поставим задачку:
Нужно иметь сколько угодно голосований.
Количество вопросов варьируется от 3 до 6. (вполне условные цифры — это понятно)
Каждое голосование должно иметь 3 состояния: Активно, В архиве, Пассивно. Принимать участие пользователь может только в первых двух. Третья категория только для просмотра результатов.
Голосование должно быть редактируемо (Вопрос, варианты ответов).
Защиту прикрутим минимальную — по IP. (это вообще отдельная тема)
А теперь будем последовательно реализовывать задуманное.
Для начала создадим таблицу голосований в нашей базе (Коннект я пропущу. Итак все понятно.:).
<?

baseconnect(); // функция коннекта к базе.

$query = «CREATE TABLE poll(
id int(6) not null auto_increment, //Уникальный номер
name text, // Название голосования
quest text, // Вопрос
answ text, //Варианты Ответов
graph_type INT (2) DEFAULT ‘0’ not null, // Тип вывода статистики (текст или графика)
active int(2), // Флаг активности
first_page INT (1) DEFAULT ‘0’ not null, //На первой странице голосование или нет
anumber text, // Количество голосов по каждому ответу
total int(6) DEFAULT ‘0’ not null, // Всего проголосовавших
PRIMARY KEY (id)
)»;
if (mysql_query($query)):
echo»Таблица создана»;
else:
die(mysql_error());
endif;
?>
Запускать данный скрипт надо только один раз.
Теперь напишем скрипт, который будет выводить данные по активному голосованию. Назовем его show.php:
<?

baseconnect(); // Коннектимся к базе.

$sql = «SELECT * FROM poll WHERE first_page=1″;
$res = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($res)>0)
{
$poll = mysql_fetch_assoc($res);
$graph_flag = mysql_result($res,0,’graph_type’);
echo’
‘.$poll[«name»].’
Вопрос
‘.$poll[«quest»].’
Варианты ответов
.’$ans[$step].’    ‘.$by_answers[$step].’
Количество проголосовавших    colspan=»2″>’.$poll[‘total’].’

‘;
echo’
‘;
echo’
‘;
$sql = «SELECT * FROM poll WHERE active=’0′ AND first_page=’0′»; // Выбираем остальные голосования
$res = mysql_query($sql) or die(mysql_error());
$nums = mysql_numrows($res);
for ($step=0;$step<$nums;$step++)
{
$name = mysql_result($res,$step,’name’);
$uin = mysql_result($res,$step,’id’);
echo’
‘;
// Список остальных голосований
}
echo’Остальные активные голосования
‘.$name.’
Архив голосований

‘;
// Ссылка на архив.
}
?>

С выводом определились. Теперь разберемся со списком остальных голосований. Итак у нас есть два скрипта shall.php и arch.php. Один дает возможность принять участие в других голосованиях, а другой дает доступ к статистике уже прошедших.
Рассмотрим первый скрипт. В качестве параметра ему передается номер голосования. Это самый простой и очевидный способ. Функцию коннекта я опущу.
<?

$sql = «SELECT * FROM poll WHERE id=’$id'»; // Выбираем всю инфу по запрошенному голосованию
$res = mysql_query($sql) or die(mysql_error());
$uin = mysql_result($res,0,’id’);
$name = mysql_result($res,0,’name’);
$quest = mysql_result($res,0,’quest’);
$answ = mysql_result($res,0,’answ’);
$ans_kol = mysql_result($res,0,’qkol’);
$graph_flag = mysql_result($res,0,’graph_type’);
$stat = mysql_result($res,0,’anumber’);
$tot = mysql_result($res,0,’total’);
echo’
‘.$name.’
Вопрос
‘.$quest.’
Варианты ответов
‘.$ans[$step].’    ‘.$by_answers[$step].’
Количество проголосовавших    ‘.$tot.’
«;?>
Принять участие

‘;
$sql = «SELECT * FROM poll WHERE active=’0′»;
$res = mysql_query($sql) or die(mysql_error());
$nums = mysql_numrows($res);
for ($step=0;$step<$nums;$step++)
{
$name = mysql_result($res,$step,’name’);
$uin = mysql_result($res,$step,’id’);
if ($uin <> $id){

echo’
‘;
// Перейти к голосованию
echo’
‘;
//Принять учатие в данном голосовании
}
}
echo’
Остальные голосования
‘.$name.’    Принять участие
На первую страницу
Архив голосований

‘;
?>

Схема такая:
show.php — Первая страница раздела голосований. Показывает статистику по активному голосованию и открывает дотуп к остальным голосованиям.
2fp.php — Вывод формы для принятия учатия в голосовании.
arch.php — Вывод архива голосований(показ статистики).
adv.php — Скрипт, добавляющий голос и делающий элементарную проверку.
shall.php — Вывод всех активных голосований.

Первый и последний стрипт мы рассмотрели. Рассмотрим остальные три. Начнем с того, что попроще — 2fp.php:
<?

switch($ad)
{
default:
$sql = «SELECT * FROM poll WHERE first_page=1″;
// Делаем выборку, если нужно голосование с первой страницы
$res = mysql_query($sql) or die(mysql_error());
break;
case ‘1’:
$sql = «SELECT * FROM poll WHERE id=’$id'»;
// Делаем выборку из других активных голосований
$res = mysql_query($sql) or die(mysql_error());
break;
}
$name = mysql_result($res,0,’name’);
// Выбираем информацию. Этот блок общий для обеих вриантов
$quest = mysql_result($res,0,’quest’);
$answ = mysql_result($res,0,’answ’);
$ans_kol = mysql_result($res,0,’qkol’);
echo’
‘;
// Скрипт голосования
echo’
‘;
echo’
‘;
$answer = explode(«}{«,»$answ»); // Выводим форму. С кнопкой :)
for ($step =0;$step <$ans_kol;$step++)
{

echo’
‘;

}
echo».$name.’
‘.$quest.’
‘.$answer[$step].’

‘;
?>
Надеюсь, что здесь вопросов не возникнет. Как не возникнет их и в скрипте adv.php:
<?

if (ipcheck()) // Проверка IP адреса. Рассмотрим в другой статье
{
echo»NOt Allowed!»;
}
else
{
echo»Added
«;
$sql = «SELECT * FROM poll WHERE name=$uin»; // Выбираем инфу
$res = mysql_query($sql) or die(mysql_error());
$rt = mysql_result($res,0,’anumber’);
$kol = mysql_result($res,0,’qkol’);
$tot = mysql_result($res,0,’total’);
if ($ret=»)
{
for ($step=0;$step<$kol;$step++)
{
if ($step == $ans){$an[$step]=1;}else{$an[$step]=0;} // Заносим голос
echo»$an[$step]
«;
$retr .= $an[$step].’}{‘;
}
}else
{
$addt = explode(«}{«,»$rt»);
for ($step=0;$step<$kol;$step++)
{
if($step==$ans){
$adt[$step] = (int) $addt[$step] +1; // Увеличиваем суммарное число проголосовавших
}else
{$adt[$step]=(int) $addt[$step];}
}
for ($step=0;$step<$kol;$step++)
{
$retr .= $adt[$step].’}{‘; // Переписываем поле ответов
}
}
$tot++;
$sql = «UPDATE poll SET anumber=’$retr’,total=’$tot’ WHERE name=$uin»;
// Пишем результат в базу.
$res = mysql_query($sql) or die(mysql_error());
echo»Complete»;
}
?>

И, наконец, скрипт дла просмотра результатов уже прошедших голосований.
<?

echo’
‘;
if (!isset($id)){
$sql = «SELECT * FROM poll WHERE active=’1′»; // Выбираем голосования из архива.
}
else{
$sql = «SELECT * FROM poll WHERE active=’1′ AND id=’$id'»;
// Выбираем конкретное голосование
}
$res = mysql_query($sql) or die(mysql_error());
$name = mysql_result($res,0,’name’);
$id = mysql_result($res,0,’id’);
$quest = mysql_result($res,0,’quest’);
$answ = mysql_result($res,0,’answ’);
$ans_kol = mysql_result($res,0,’qkol’);
$graph_flag = mysql_result($res,0,’graph_type’);
$stat = mysql_result($res,0,’anumber’);
$tot = mysql_result($res,0,’total’);

echo’
‘;
echo’
‘;
echo’
‘;
echo’
‘;

$ans = explode(«}{«,»$answ»);
$by_answers = explode(«}{«,»$stat»);
for ($step=0;$step<$ans_kol;$step++) // Отображоаем варианты ответов.
{
echo’
‘.$ans[$step].’
‘;
}

echo’
Количество проголосовавших’.$tot.’
‘;
echo».$name.’
Вопрос
‘.$quest.’
Варианты ответов
‘.$by_answers[$step].’

‘;

$nums = mysql_numrows($res); // Выводим ссылки на остальные голосования
for ($step=0;$step<$nums;$step++)
{
$name = mysql_result($res,$step,’name’);
$uin = mysql_result($res,$step,’id’);
if ($uin <> $id)
{
echo’
‘;
}
}
echo’Остальные голосования
‘.$name.’
На первую страницу

‘;
?>

В следующий раз я расскажу, как все это управляется, а так же о некоторых методах защиты от накрутки.

Источник:  i-faq.ru
Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи