"А зачем на базе?" - спросите Вы и будете абсолютно правы. В принципе незачем. Просто делая как-то систему управления, я столкнулся с необходимостью дать абсолютно некомпетентному в кодинге человеку рули от здорового сайта. Я человек ленвиый, и представив, сколько места на винте будет занимать архив голосований, и как мне надо форматировать текстовые файлы, чтобы собирать ту статистику, которую хотел заказчик, решил пойти изващенным, но более универсальным путем.
Сперва поставим задачку:
- Нужно иметь сколько угодно голосований.
- Количество вопросов варьируется от 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 |