Ошибка: Failed to parse the Currency Converter XML document.
$1 264.32


Ошибка: Failed to parse the Currency Converter XML document.
$56 320.41


Ошибка: Failed to parse the Currency Converter XML document.
$19 724.27


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

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

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


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

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

»;
?>

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

 

Интересное

Быстродействие FAT и NTFS
В этой статье я попытаюсь дать оценку быстродействию файловых систем, используемых в операционных системах Windows95/98/ME, а также Windows NT/2000. Статья не содержит графиков и результатов...
Подробнее...
Несколько советов по...
Для ускорения навигации по папкамДля ускорения навигации по папкам, содержащим графические файлы можно отметить пункт — «Не кэшировать эскизы» (Панель управления -> Свойства папки -> Вид), а...
Подробнее...
Дюжина вопросов по...
Существуют несколько вопросов, которые изо дня в день повторяются на доске сообщений сервера ISAServer.org и в списках подписчиков. Эти же самые вопросы задают также в общих новостных лентах...
Подробнее...
Средства Delphi 7 для...
Рассмотрим наборы компонентов, которые присутствуют в библиотеке компонентов delphi 7, предназначенных для работы с базами данных. Вы узнаете, что такое набор данных, источник данных и...
Подробнее...
Windows 2003 на домашнем...
Последний представленный компанией Microsoft продукт — семейство Windows 2003 - является прямым продолжением Windows 2000. Эта система предназначена, в основном, для серверного, а не для домашнего...
Подробнее...
Настройка роутера с...
В данной статье мы расскажем о настройке роутера на базе FreeBSDвыполняющего роль шлюза в инернет с установкой firewall-a, иподдерживающем статическую arp таблицу mac адресов в локальной сети.Речь...
Подробнее...
Структура сайтостроения
Вы определились, что вам необходим сайт, и даже решили к какому типу он будет относиться. Создание сайта подобно строительству дома: из маленьких кирпичиков создается здание. Это долгий и...
Подробнее...
Почему не нужно чистить реестр
Давным-давно, в незапамятные времена (еще до изобретения операционной системы Microsoft Windows 95), компьютеры Windows и программы, разработанные для них, включали в свой состав файлы...
Подробнее...
"Грабим" странички
С аудиограбберами знакомы все. Нам предстоит сделать свой собственный граббер информации из Интернета. Нам понадобится подопытный кролик, на роль которого я предлагаю выбрать сайт...
Подробнее...
Аварийное восстановление...
Случалось ли вам переустанавливать Windows? Те кто сталкивался с этим, знают сколько времени уходит на то чтобы установить все необходимые драйвера, программное обеспечение и настроить систему. Но...
Подробнее...