WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Голосование на базе. Часть первая.


Прислал: ThE0ReTiC [ 10.12.2001 @ 13:37 ]
Раздел:: [ Статьи по 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>';
?>

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


 :::::  csmanuel пишет 14.12.2001 @ 02:46 
Нет бы описать лишний раз MySQL-ные команды на создание/редактирование бд/таблиц/пользователей... так он опять про голосование, да к тому же в нескольких статьях. Это не негативный отзыв, а разочарование от отсутствия чего-нибудь интересного на webscript в 3 часа ночи!..

P.S. Жду продолжения "... о некоторых методах защиты от накрутки." :)
 :::::  ThE0ReTiC пишет 14.12.2001 @ 10:29 
2 csmanuel:
Ну, если надо, могу написать и про комманды.
Просто я считал, что данный раздел (функции работы с базами) можно освоить и самостоятельно, особенно имея мануал (который достать не проблема).
Напишу.
Если у кого-то еще есть какие-нибудь пожелания - пишите, постараюсь удовлетворить :)))
 :::::  csmanuel пишет 15.12.2001 @ 02:24 
Спасибо...
 :::::  ShadowMaster пишет 17.12.2001 @ 01:22 
А про методы защиты от накрутки (работающие и при использовании многими пользователями одного прокси) было бы очень интересно.
 :::::  ThE0ReTiC пишет 30.12.2001 @ 17:35 
А подписываться под словами слабо?
 :::::  Oleg пишет 12.02.2002 @ 02:00 
Kogda budet prodolzhenie?
 :::::  ThE0ReTiC пишет 12.02.2002 @ 12:39 
Недели через полторы.
 :::::  Oleg пишет 18.02.2002 @ 00:04 
Thanks.
 :::::  Acid пишет 15.02.2003 @ 14:41 
И где обещанное продолжение ???????
 :::::  veter_letnii пишет 31.05.2006 @ 13:48 
Автор статьи, ты еще жив? )) Вопрос один есть по коду.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0234981