Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » 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'<tr><td colspan="3">'.$poll["name"].'<Br></td></tr>';
echo'<tr><td colspan="3">Вопрос</td></tr>';
echo'<tr><td colspan="3">'.$poll["quest"].'<Br></td></tr>';
echo'<tr><td colspan="3">Варианты ответов</td></tr>';

$ans = explode("}{","$poll['answ']");
// В качестве разделителя ответов используется последовательность
}{
$by_answers = explode("}{","$poll['anumber']");
for ($step=0;$step<$ans_kol;$step++)
{
echo'<tr><td>.'$ans[$step].'</td><td>'.$by_answers[$step].'</td><td> </td></tr>'; // Выводим варианты ответов
}
echo'<tr><td>Количество проголосовавших</td><td
colspan="2">'.$poll['total'].'<Br></td></tr>';
$graph =array('Просто цифры','Горизонтальные полосы','Вертикальные полосы');
$state = array( 'Активно','В архиве');
echo"$graph[$graph_flag]<Br>";
echo'</table>';
echo'<table>';
echo'<tr><td>Остальные активные голосования</td></tr>';
$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'<tr><td><a href="shall.php?id='.$uin.'>'.$name.'</a></td></tr>';
// Список остальных голосований
}
echo'<tr><td><a href="arch.php">Архив голосований</a></td></tr></table>';
// Ссылка на архив.
}
?>

С выводом определились. Теперь разберемся со списком остальных голосований. Итак у нас есть два скрипта 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'<tr><td class="head_b" colspan="3">'.$name.'<Br></td></tr>';
echo'<tr><td class="head_s" colspan="3">Вопрос</td></tr>';
echo'<tr><td class="text" colspan="3">'.$quest.'<Br></td></tr>';
echo'<tr><td class="head_s" colspan="3">Варианты ответов</td></tr>';
$ans = explode("}{","$answ");
$by_answers = explode("}{","$stat");
for ($step=0;$step<$ans_kol;$step++)
{
echo'<tr><td class="text">'.$ans[$step].'</td>';
echo'<td>'.$by_answers[$step].'</td><td> </td></tr>';
}
echo'<tr><td class="head_s">Количество проголосовавших</td>
<td class="text" colspan="2">'.$tot.'<Br>";?></td></tr>';
chdir('poll');
include('sets.php');
echo'<tr><td><a href="2fp.php?ad=1&id='.$uin.' class="link">Принять участие</a></td></tr>';
// Принять участие
echo'</table><table><tr><td>Остальные голосования</td></tr>';
$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'<tr><td><a href="shall.php?id='.$uin.' class="link">'.$name.'</a></td>';
// Перейти к голосованию
echo'<td><a href="2fp.php?ad=1&id='.$uin.' class="link">Принять участие</a></td></tr>';
//Принять учатие в данном голосовании
}
}
echo'<tr><td><a href="show.php" class="link">На первую страницу</a></td></tr>
<tr><td><a href="arch.php" class="link">Архив голосований</a></td></tr></table>';
?>


Схема такая:
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'<form action="adv.php" method="POST"><table width="100%" border="1"><input type="hidden" name="uin" value=".'$name.'">';
// Скрипт голосования
echo'<tr><td><h4>'.$name.'</h4></td></tr>';
echo'<tr><td><b>'.$quest.'</b></td></tr>';
$answer = explode("}{","$answ"); // Выводим форму. С кнопкой :)
for ($step =0;$step <$ans_kol;$step++)
{

echo'<tr><td><input type="radio" name="ans" value ="'.$step.'">'.$answer[$step].'</td></tr>';

}
echo'<tr><td><input type="submit" value="go"</td></tr><tr><td></td></tr></table></form>';
?>
Надеюсь, что здесь вопросов не возникнет. Как не возникнет их и в скрипте adv.php:
<?
...
if (ipcheck()) // Проверка IP адреса. Рассмотрим в другой статье
{
echo"NOt Allowed!";
}
else
{
echo"Added<br>";
$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]<br>";
$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'<table border="1">';
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'<tr><td class="head_b" colspan="3">'.$name.'<Br></td></tr>';
echo'<tr><td class="head_s" colspan="3">Вопрос</td></tr>';
echo'<tr><td class="text" colspan="3">'.$quest.'<Br></td></tr>';
echo'<tr><td class="head_s" colspan="3">Варианты ответов</td></tr>';

$ans = explode("}{","$answ");
$by_answers = explode("}{","$stat");
for ($step=0;$step<$ans_kol;$step++) // Отображоаем варианты ответов.
{
echo'<tr><td class="text">'.$ans[$step].'</td><td>'.$by_answers[$step].'</td><td> </td></tr>';
}

echo'<tr><td class="head_s">Количество проголосовавших</td><td class="text" colspan="2">'.$tot.'<Br></td></tr>';
echo'</table><table><tr><td colspan="2">Остальные голосования</td></tr>';

$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'<tr><td><a href="arch.php?id='.$uin.'" class="link">'.$name.'</a></td></tr>';
}
}
echo'<tr><td><a href="show.php" class="link">На первую страницу</a></td></tr></table>';
?>

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

Автор статьи - ThE0ReTiC (c) 2001
Автор: ThE0ReTiC · Добавлена: 2002-07-04
Просмотров: 3541 · Рейтинг: 0.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 141128
Наша кнопка
WoWeb.ru - портал для веб-мастера