$462.27


$271.51


$52.13


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

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

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


Сперва поставим задачку:
Нужно иметь сколько угодно голосований.

Количество вопросов варьируется от 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.«
На первую страницу

»;
?>

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

 

Интересное

CSS дизайн: с учетом контекста
Веб-стандарты обещают нам улучшенную поддержку мультимедиа: возможность оптимизировать контент под возможности компьютерных экранов, портативных устройств, принтеров, проекторов, и подобных...
Подробнее...
Java-приложение: заглянем...
Чтобы отладить приложение, можно поступить по-разному. Во-первых, можно воспользоваться штатным отладчиком из какого-либо программного пакета. Во-вторых, можно самостоятельно вычислить ошибку...
Подробнее...
Утилиты Windows XP
Локальные параметры безопасностиПолитика паролей, учетных записей пользователей, назначение прав пользователей, параметры безопасности и другое.Оснастка консоли secpol.mscГрупповая политика...
Подробнее...
Проблема медленного...
Кто бы чего не говорил, но операционная система Windows XP, зарекомендовала себя как достаточно надежная (при надлежащем отношении). Моя копия Windows XP SP1, в последующем обновленная до SP2,...
Подробнее...
Delphi и Flash. Совмещение...
Разве возможно совместить Флэш-ролики и Дельфи-приложения. Раньше я думал что НЕТ. Но теперь я знаю не только, что это возможно, но и знаю как это делается!!! И сейчас я вам расскажу об этом....
Подробнее...
Перевод программ под Windows
Для перевода программ под windows используются редакторы ресурсов, которых развелось достаточно много. Самые лучшие, на мой взгляд, resurs hacker и restorator. У каждой из них есть свои плюсы и...
Подробнее...
Установка Windows
Как поставить XP? Есть несколько способов. Во-первых, если ваш CD с дистрибутивом похож на тот, что выпускается Microsoft, то он должен быть бутовым (загрузочным). Чтобы загрузиться с него надо в...
Подробнее...
Не выбрасывайте вещи в...
Случалось ли у вас такое, что открывая платяной шкаф, вы с ужасом понимали, что новые вещи положить уже некуда? Знакомая ситуация, не правда ли?Находясь в подобной ситуации, я как-то раз решила...
Подробнее...
Миф о QoS
Нет ни одного человека, который бы хоть раз не прочитал какой-нибудь FAQ по Windows XP. А раз так, то каждый знает, что есть такая вредная служба Quality of Service — сокращенно QoS. При...
Подробнее...
Советы по графике в Delphi
Вы наверное часто видели довольно хитроумные картины, на которых непонятно что изображено, но все равно необычность их форм завораживает и приковывает внимание. Как правило, это хитроумные формы...
Подробнее...