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


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


Ошибка: Failed to parse the Currency Converter XML document.
$10 944.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.«
На первую страницу

»;
?>

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

 

Интересное

Windows 2000 Pro: лучшая...
Когда я поинтересовался, может ли операционная система десятилетней давности типа Windows 98 по-прежнему быть жизнеспособным вариантом для использования на корпоративных настольных компьютерах,...
Подробнее...
Антивирус - религия?
Всё больше людей приобретают компьютеры, теперь даже стыдно, если его у тебя нет. Почти все купившие сразу приобретают модемы и начинают осваивать интернет. Люди в шоке :«Там есть...
Подробнее...
100 компьютерных фактов
Когда я был мелким карапузом, я любил читать все подряд. Особенный интерес у меня вызывали книжки из серии «Хочу все знать», так как я мечтал стать межгалактическим диктатором, а для этого...
Подробнее...
Шесть правил ухода за...
Мало кому приходит в голову протирать экран телевизора спиртом — так почему же у многих чешутся руки произвести подобное издевательство над монитором?!Причем можно было бы понять, если бы это...
Подробнее...
Куда идет Windows?
ВведениеНравится это или нет, но Microsoft Windows применяется практически повсеместно. Свыше 90 процентов настольных и портативных компьютеров работают под управлением Windows. В течение двух...
Подробнее...
Java обгоняет по...
Одним из главных недостатков языка Java традиционно считается невысокая скорость работы программ по сравнению с приложениями на языке С++. И для приложений, где переносимость между платформами или...
Подробнее...
Как раскрутить сайт
Любой самый хороший сайт, сделанный с душой, специалистом в той области, которой посвящен этот сайт, с богатым контентом, раскрывающим все особенности и нюансы освещаемого предмета, или как...
Подробнее...
Поиск уязвимостей в PHP...
Итак, сейчас я Вам объясню, как я ищу баги в скриптах на PHP, так делаю я сам и не кому не навязываю свой вариант...Статья это маленькая, но я считаю полезная =)1. Если вы читали мою вторую статью...
Подробнее...
Обучение компьютерным...
Сегодня новые компьютерные технологии появляются так стремительно, что надо быть хорошим специалистом, чтобы уследить за рождением всех новшеств. Каждый человек хочет считать себя образованным,...
Подробнее...
Будущее - за Ethernet DSLAM
Популярность существующих методов широкополосного интернет-доступа (DSL) во многом обеспечивает стабильное состояние рынка решений DSLAM (Digital Subscriber Line Access Multiplexer). Современные...
Подробнее...