программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 16. Скрипт голосования. Создаем опрос посетителей на сайте.

    Октябрь 9th, 2008 Александр 29 Комментариев

    Зачастую, чтобы понять что нравиться посетителям Вашего сайта,  гостевых книг и комментариев бывает недостаточно. Для того чтобы администратору сайта получить наиболее полный ответ на задаваемый вопрос приходиться прибегать к система опросов. Сама система опросов содержит точный вопрос и несколько предполагаемых ответов. Пригодиться это может где угодно, допустим вы сменили дизайн на сайте и желаете знать мнение посетителей. Чтобы не вынуждать оставлять комментарии или записи в гостевой можно прибегнуть к гораздо простому способу – организовать опрос на сайте.

    Детали

    В этом уроке мы рассмотрим 2 скрипта голосования. Первый скрипт голосования будет  достаточно простым и для хранения данных будет использовать файлы. Второй скрипт будет использовать БД MySQL и систему с несколькими опросами.

    Теперь функции которые мы затронем в этом уроке:

    1. Создание формы для опроса. Графический интерфейс самого опроса и результатов опроса.
    2. Чтения и запись данный в файл. Массивы и циклы.
    3. Создание базы данных MySQL. Проектирование таблиц, чтение и запись данных.
    4. Построения графика результата опросов.

    Скрипт голосования на файлах

    Начнем с наиболее простого варианта. Как оговаривалось выше, для хранения данных будет использован файл – data.txt.

    Состав:

    1. index.php – рабочий скрипт, выполняющий основные действия над файлами и управляющий действиями пользователя.
    2. config.inc.php – файл настроек.
    3. data.txt – файл для хранения данных опроса.

    Начнем мы нестандартно. Для того чтобы далее все было понятно придется первым делом разобраться с файлом config.inc.php .

    config.inc.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php

    $url = "data.txt";

    $question = "Интересные ли Вам мои уроки?";

    $answer = array("Отличные уроки","Хорошие, но хотелось бы больше","Я не понимаю уроков","Ерунда!");

    ?>

    Первая переменная $url задает адрес до файла. Если файл лежит в той же папке что и скрипты – указываем его имя, в нашем примере это data.txt.

    Второй переменной является – $question. Она содержит в себе ключевой вопрос =). Как менять ее мы разберем позже, сейчас просто укажите для своего примера необходимый вопрос.

    Третья переменная является массивом с вариантами ответов и имеет имя $answer. Т.е. в моем примере если вывести $answer[0] мы получим “Отличные уроки”. В любой момент этот массив можно отредактировать, удалить или добавить варианты ответов.

    Теперь зная что несет в себе каждая из рассмотренных выше переменных, мы можем приступать к написанию основного скрипта - index.php.

    index.php

    Данный скрипт будет содержать несколько функциональных блоков, каждый из которых мы рассмотрим по отдельности.

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

    В начале подключаем файл конфигурации config.inc.php, который мы рассмотрели выше. Далее следует фрагмент, который проверяет наличие файла данных:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    include("config.inc.php");
    //Если не существует файла, то создаем его и вносим нулевые значения
    if(!file_exists($url)) {
        $fd = fopen($url,"a");
        $data ='';
        for($i=0;$i<=count($answer)-1;$i++) { $data .="0::"; }
        $data .="0";
        @fwrite($fd,$data);
        fclose ($fd);
                          }

    Для проверки наличия файла используем стандартную функцию file_exists. Если условие возвращает FALSE, то создаем файл и вносим в него строчку с нулевыми значениями. Чтобы создать файл используем функцию fopen() указав режим “a”.
    Для хранения данных будем использовать следующую структуру:

    {число голосов на 1-ый ответ}+[сепаратор]+{число голосов на 2-ой ответ}+[сепаратор]+{число голосов на n-ый ответ}+[сепаратор]+{общее число голосов}

    Если проще, то строка для хранения данных для четырех ответов будет выглядеть вот так:

    0::0::0::0::0

    Здесь последнее число – это количество голосов. Когда посетители будут голосовать эта строка будет иметь следующий вид:

    4::1::6::8::19

    Чтобы сформировать строчку такого типа мы используем цикл и операцию “накопления”. Цикл запускается столько раз, сколько ответов содержится в массиве $answer. В итоге мы формируем переменную $data из  “0::”. После цикла добавляем ещё один ноль, который используется для хранения общего числа голосов. Далее функцией fwrite() записываем строчку в файл и закрываем его. На данном этапе у нас все готово к последующей работе.

    После того как произвели проверку файла на существование, выводим стандартную форму с вопросом и вариантами ответа:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //По умолчанию отображаем форму с опросом
    if($_POST['do'] =='') {

    echo $question.'<br/><br/>';
    echo ' <form name="" action="" method="post"> ';

    echo '<input name="answer" type="radio" value="0">'.$answer[0].'<br/>';
    for($i=1;$i<=count($answer)-1;$i++) {

            echo '<input name="answer" type="radio" value="'.$i.'">'.$answer[$i].'<br/>';

            }
    echo '<input name="do" type="submit" value="голосовать">' ;
    echo '</form>  ';
    }

    Как видите, если $_POST['do'] не задана, то отображается форма с вопросом $question и цикл, перебирающий массив $answer и выводящий варианты ответа начиная со второго. Первый вариант ответа расположен выше цикла и отличается он тем, что внутри тега input стоит атрибут checked, который по умолчанию задает выбор (это избавит от лишней проверки $_POST['answer'] в последующем). Ниже, после цикла расположена кнопка “Голосовать”. Эта кнопка имеет имя do. В браузере вы увидите следующую картинку:

    После выбора и нажатия кнопки срабатывает следующий блок:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    if($_POST['do'] != '') {
    //Вносим изменеия в файл
    $vfile = file($url);
    $vdata = split("::",$vfile[0]);

    $sum = count($vdata)-1;
    $vdata[$sum]++;
    $vdata[$_POST['answer']]++;

    $rf = fopen($url,"w");
    $rdata = implode("::",$vdata);
    fwrite($rf,$rdata);
    fclose($rf);

    //Выводим результаты

    $res = file($url);
    $votes = split("::",$res[0]);

    //Выводим варианты ответа и количество голосов
    for($i=0;$i<=count($answer)-1;$i++) {
        echo '<b>'.$answer[$i].'</b><br/>';
        echo '<div  style="height:20px; width:'.round(($votes[$i]*100/$votes[count($answer)])*3).'px; background-image:url(end.jpg);background-color:#2478a8; background-repeat:no-repeat; background-position:right "></div>';
        echo '['.$votes[$i].']<br/>';
        }
        echo 'Всего проголосовало: '.$votes[count($answer)].'<br/><br/>';
    echo 'Спасибо. Ваш голос учтен. <br/>';

    }

    Этот блок состоит из двух частей.Первая читает файл в массив ($vfile = file($url)). Далее функцией split() разбираем строку содержащуюся в массиве под ключем 0. В итоге получаем массив $vdata, в котором содержаться результаты голосования. Далее необходимо вычислить последний элемент массива, который содержит количество голосов. Делаем это при помощи функции count(). Теперь переменная $sum содержит в себе значение совпадающее с соответствующим ключем массива, указывающий на суммарное количество голосов, остается только это значение увеличить на единицу – $vdata[$sum]++; (В нашем примере $sum будет равна 3) .Тоже самое делаем и с вариантом ответа. В переменной $_POST['answer'] передается номер ответа (от 0 до n), поэтому увеличиваем соответствующий индекс на единицу – $vdata[$_POST['answer']]++;

    Когда все математические действия завершены, необходимо записать данные в файл. Для этого используем функцию fopen() в режиме w. Создаем строку ($rdata) при помощи функции implode(”::”,$vdata); , записываем данные в файл и закрываем его.

    Второй блок выводит результаты голосования. Здесь тоже используется похожий алгоритм.
    Сначала файл открывается и данные считываются в единый массив $votes. Далее запускаем цикл, который выводит ответ($answer[$i] ). Ниже строим полоску, ширина которой вычисляется по формуле :

    {количество голосов}*100/{общее количество проголосовавших}

    В итоге получаем данные в процентах. Чтобы графики были шире я умножил результат формулы на 3. После этого скармливаем общий результат функции round(), которая округляет результат в бОльшую сторону до целого числа. После того как задали ширину слоя ниже выводим количество голосов.

    Ниже после цикла выводим общее число проголосовавших. Если все сделано правильно, то результат будет примерно такой:

    Настройка скрипта

    Данный вариант будет лишен панели управления, поэтому настройки необходимо вносить вручную. Чтобы поменять вопрос и варианты ответов, а также их количество  – редактируем файл настроек – config.inc.php. Что обозначает каждая переменная – было описано выше.
    Для того чтобы сбросить данные достаточно просто удалить файл data.txt. При первом обращении к скрипту он создаётся автоматически.
    Не забудьте поместить в директорию со скриптом заглушку для графика – end.jpg.

    Скрипт голосования с использованием БД MySQL

    Перед тем как преступить к программированию необходимо спроектировать таблицу для хранения данных. Так как система содержит несколько опросов необходимо использовать 2 таблицы, первая для хранения вопросов, вторая для хранения вариантов ответов и количество голосов.

    Состав:

    1. index.php – рабочий скрипт, выполняющий основные действия с базой данных и управляющий действиями пользователя.
    2. admin.php – скрипт  панели управления.
    3. config.inc.php – файл настроек

    Первая таблица будет содержать 2 поля и носить название tquestions:
    id ( INT )- идентификатор вопроса;
    question (VARCHAR)- вопрос.
    SQL-запрос для создания таблицы:

    CREATE TABLE `tquestions` (
    `id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
    `question` VARCHAR( 255 ) NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM

    Вторая таблица будет содержать 4 поля  и носить название tanswers:
    id ( INT )- идентификатор ответа;
    qid ( INT ) – идентификатор, по котором отслеживается принадлежность к определенному вопросу ( id из таблицы tquestions ).
    answer(VARCHAR) – Ответ
    votes  ( INT ) – количество голосов
    SQL-запрос для создания таблицы:

    CREATE TABLE `tanswers` (
    `id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
    `qid` INT( 20 ) NOT NULL ,
    `answer` VARCHAR( 255 ) NOT NULL ,
    `votes` INT( 20 ) NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM


    После успешного создания таблиц переходим к программированию.

    Файл конфигурации

    В файле конфигурации содержаться основные настройки для подключения к БД.

    config.inc.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php

    //Данные для работы с MySQL
    //Сервер, в большинстве случаев менять не требуется
    $DBSERVER = "localhost";
    //Пользователь и пароль
    $DBUSER = "root";
    $DBPASS = "пароль_к_БД";
    //База данных
    $DB = "test";

    ?>

    Панель управления

    Так уж получилось что скрипт не является самостоятельным и первоначально что необходимо сделать это создать панель управления .
    Файл admin.php содержит несколько блоков – отображение существующих опросов, создание новых, удаление существующих, сброс результатов.

    admin.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php

    include("config.inc.php");


    //Необходимо подключиться к БД
    $link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
    or die("Не могу подключиться" );
    // сделать $DB текущей базой данных
    mysql_select_db($DB, $link) or die ('Не могу выбрать БД');

    Первоначально подключаем файл конфигурации содержащий настройки для подключения к базе данных.
    Далее подключаемся к серверу и выбираем базу данных. При тестировании я использовал БД test.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    if($_GET['action'] =='') {
    //Получаем список опросов
    $q1 = mysql_query("SELECT * FROM tquestions ORDER BY id");
     echo 'Меню управления опросами | <a href="?action=new">Добавить опрос</a><br/>===========================<br/>';
    //Выводим список с служебными ссылками
    if(@mysql_num_rows($q1) !='0') {
    while($r = @mysql_fetch_array($q1)) {
       echo '<b>'.$r['question'].'</b>&nbsp;<a href="?action=del&id='.$r['id'].'">[D]</a>&nbsp;<a href="?action=reset&id='.$r['id'].'">[R]</a><br/>';
        $q1_1 = mysql_query("SELECT * FROM tanswers WHERE qid='".$r['id']."'");
             while($r2=mysql_fetch_array($q1_1)) {
                 echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$r2['answer'].'['.$r2['votes'].']<br/>';
             }
                                        }

                                    }
    else {echo 'Опросов не существует. Пожалуйста создайте <a href="?action=new">опрос</a>.';}
                            }

    Данный блок срабатывает при отсутсвии GET переменной action. Внутри создаем запрос $q1:

    $q1 = mysql_query(”SELECT * FROM tquestions ORDER BY id”);

    Транскрипция запроса:

    $q1 = mysql_query(”ВЫБРАТЬ *(ВСЁ) ИЗ tquestions СОРТИРОВАТЬ ПО id”);

    Этот запрос получает все данные из таблицы с вопросами.
    Далее следует условие, которое проверяет результат запроса. Если запрос возвращает положительное значение создаем цикл , внутри которого выводим имя опроса и служебные ссылки(удалить и обнулить). Данные получаем при помощи функции mysql_fetch_array().
    Чтобы получить ещё и варианты ответов к какому либо опросу, (создать подобие структуры) необходимо составить ещё один запрос $q1_1:

    $q1_1 = mysql_query(”SELECT * FROM tanswers WHERE qid=’”.$r['id'].”‘”);

    Транскрипция запроса:

    $q1_1 = mysql_query(”ВЫБРАТЬ * ИЗ tanswers ГДЕ qid=’”.$r['id'].”‘”);

    Он выбирает все варианты ответов, где идентификатор равен $r['id']. Далее создаем ещё один подобный цикл, который выводит варианты ответов и количество голосов.

    В итоге мы получаем вложенный цикл.

    Если же результат запроса $q1 возвращает пустое значение- выводим сообщение, которое говорит что необходимо создать опрос.

    Рассмотрим фрагмент предназначенный для удаления опроса.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //удаление
    if($_GET['action'] =='del') {

        //Удаляем вопрос
    $q2 = mysql_query("DELETE  FROM tquestions WHERE id='".$_GET['id']."'");
    //Удаляем ответы на этот вопрос
    $q3 = mysql_query("DELETE  FROM tanswers WHERE qid='".$_GET['id']."'");

    if(isset($q2) AND isset($q3)) {
        echo 'Опрос с соотвествующими ответами удален из базы<br/>
        <a href="admin.php">Вернуться к списку</a>'
    ;
    }
    }

    Данный блок сработает если GET переменная action имеет значение del.
    Внутри создаем 2 запроса:

    $q2 = mysql_query(”DELETE  FROM tquestions WHERE id=’”.$_GET['id'].”‘”);

    Транскрипция запроса:

    $q2 = mysql_query(”УДАЛИТЬ  ИЗ tquestions ГДЕ id=’”.$_GET['id'].”‘”);

    Как видите первый запрос удаялет все данные из таблицы tquestions, где id равный переданному значению через $_GET['id'].

    Второй запрос:

    $q3 = mysql_query(”DELETE  FROM tanswers WHERE qid=’”.$_GET['id'].”‘”);

    Транскрипция запроса:

    $q3 = mysql_query(”УДАЛИТЬ  ИЗ tanswers ГДЕ qid=’”.$_GET['id'].”‘”);

    Второй запрос удаляет все данные из таблицы tanswers, где qid соответсвует переданному значению через $_GET['id'].

    Далее следует условие, которой проверяет результаты запросов и если они возвращают какой либо результат, то выводим сообщение об удачно совершенной операции.

    Рассмотрим фрагмент предназанченный для сброса результатов опроса.

    1
    2
    3
    4
    5
    6
    7
    8
    //Сброс результатов
    if($_GET['action']=='reset') {
        $q4 = mysql_query("UPDATE tanswers SET votes='0' WHERE qid='".$_GET['id']."'");
        if(isset($q4)) {
        echo 'Опрос обнулен<br/>
        <a href="admin.php">Вернуться к списку</a>'
    ;
    }
        }

    Данный блок сработает если GET переменная action имеет значение reset.
    Внутри создаем запрос:

    $q4 = mysql_query(”UPDATE tanswers SET votes=’0′ WHERE qid=’”.$_GET['id'].”‘”);

    Транскрипция запроса:

    $q4 = mysql_query(”ИЗМЕНИТЬ tanswers УСТАНОВИТЬ votes=’0′ ГДЕ qid=’”.$_GET['id'].”‘”);

    Данный запрос меняет значения у ячеек votes и устанавливает значения равные нулю.

    Блок создания опроса.
    Чтобы был понятен принцип добавления опроса, пропишу его функционал.
    Создание опроса проходит в 3 шага. На первом этапе мы отображаем поле для ввода вопроса и количество подразумеваемых ответов. На втором этапе мы прописываем ответы. Третий шаг заключительный, мы вносим введенные данные в таблицу. Как это реализовано смотрим далее.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    //Создание нового
    if($_GET['action']=='new'){

      if($_GET['step'] =='') {
          echo '<b>Шаг 1.</b><br/><br/>';
          echo 'Введите вопрос: <br/>';
          echo '<form name="" action="?action=new&step=1" method="post">
             <input name="nquestion" type="text" value=""><br/>
             Введите число ответов:<br/>
             <input name="nums" type="text" value="3"><br/>
             <input type="submit" value="Перейти к шагу 2">
    </form>'
    ;
                              }
     //Шаг первый: создаем
    if($_GET['step']=='1') {
           //Вставляем в базу tquestion вопрос
          $q5 = @mysql_query("INSERT INTO tquestions VALUES (NULL,'".addslashes($_POST['nquestion'])."')");
           //Вытаскиваем id этого вопроса
          $q6 = @mysql_query("SELECT MAX(id) FROM tquestions");

          echo '<b>Шаг 2.</b><br/><br/>';
          echo 'На вопрос:'.$_POST['nquestion'].'<br/>';
          echo 'Заполните варианты ответов:<br/>';
          echo '<form name="" action="?action=new&step=2" method="post">';

          for($i=0;$i<=$_POST['nums']-1;$i++) {
          echo '<input name="ans['.$i.']" type="text" value=""><br/>';
                                             }
          echo '<input name="qid" type="hidden" value="'.mysql_result($q6,0,0).'">';
          echo '<input type="submit" value="Добавить">';
          echo '</form>';


    }

    if($_GET['step']=='2') {

         //Необходимо выполнить n-ое кол-во запросов
         $limit=count($_POST['ans']);
         for($i=0;$i<=$limit-1;$i++) {
         @mysql_query("INSERT INTO tanswers VALUES(NULL,'".$_POST['qid']."','".$_POST['ans'][$i]."','0')");
                                    }
         echo 'Ответы заданы.<br/><a href="admin.php">Вернуться к списку</a>';

    }

    }

    Данный блок сработает если GET переменная action имеет значение new. Внутри следуют условия, проверяющие другую GET переменную – step. Чтобы задать переменную $step необходимо у тега form в атрибуте action указать ?action=new&step=шаг.Если она ни чему не равна то отображаем форму для ввода вопроса и количества вариантов ответа. Сама форма выглядит следующим образом:

    После заполнения полей и нажатия на кнопку переходим к шагу 2.
    Здесь необходимо составить 2 запроса:

    $q5 = @mysql_query(”INSERT INTO tquestions VALUES (NULL,’”.addslashes($_POST['nquestion']).”‘)”);

    Транскрипция запроса:

    $q5 = @mysql_query(”ВСТАВИТЬ В tquestions ЗНАЧЕНИЯ (NULL,’”.addslashes($_POST['nquestion']).”‘)”);

    Данный запрос заносит вопрос в таблицу tquestions.

    Второй запрос:

    $q6 = @mysql_query(”SELECT MAX(id) FROM tquestions”);

    Транскрипция запроса:

    $q6 = @mysql_query(”ВЫБРАТЬ МАКСИМАЛЬНОЕ(id) ИЗ tquestions”);

    Этот запрос необходим для получения id под которым был внесён наш вопрос, чтобы в последующем внести это значение в поле qid таблицы tanswers. Далее необходимо заполнить варианты ответов. Используем цикл, для того чтобы вывести то количество полей, которые мы указали на предыдущем шаге.
    На этом этапе у формы в атрибуте action указываем ?action=new&step=2. После заполнения полей и нажатия на кнопку мы отправляем массив $_POST['ans'], содержащий варианты ответов.

    Завершающий этап заключается в том чтобы создать необходимое количество запросов, которые будут заносить данные в таблицу.

    mysql_query(”INSERT INTO tanswers VALUES(NULL,’”.$_POST['qid'].”‘,’”.$_POST['ans'][$i].”‘,’0′)”);

    Транскрипция запроса:

    mysql_query(”ВСТАВИТЬ В tanswers ЗНАЧЕНИЯ(NULL,’”.$_POST['qid'].”‘,’”.$_POST['ans'][$i].”‘,’0′)”);

    Ставим этот запрос в цикл, который выполняется ровно столько раз сколько у нас было ответов. Значения заносятся в таблицу и каждому ответу соответсвует уникальный qid, при помощи которого таблица tanswers связана с таблицей tquestions.
    Панель управления готова, можете самостоятельно протестировать скрипт.

    index.php

    Индексный файл выполняет операции по извлечению данных из таблицы и выводит их в браузер.
    В этом скрипте участвует несколько запросов, некоторые из которых содержат интересные аргументы, которые обязательно пригодятся в Вашей практике.

    Итак начнем с того что необходимо получить количество опросов и вывести какой либо в случайном порядке. Для того чтобы это сделать мы подключаемся к БД MySQL и составляем запрос.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php



    include("config.inc.php");


    //Необходимо подключиться к БД
    $link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
    or die("Не могу подключиться" );
    // сделать $DB текущей базой данных
    mysql_select_db($DB, $link) or die ('Не могу выбрать БД');



    //По умолчанию отображаем форму с опросом
    if($_POST['do'] =='') {
    $q1 = mysql_query("SELECT * FROM tquestions ORDER BY RAND() LIMIT 1");
    if(mysql_num_rows($q1) == '1') {
    $r = mysql_fetch_array($q1);

    echo $r['question'].'<br/><br/>';

    $q2 = mysql_query("SELECT * FROM tanswers WHERE qid='".$r['id']."'");
    echo '<form action="" method="post">';
    while($r2 = mysql_fetch_array($q2)) {

            echo '<input name="answer" type="radio" value="'.$r2['id'].'">'.$r2['answer'].'<br/>';

                                       }
    echo '<input name="rid" type="hidden" value="'.$r['id'].'">';
    echo '<input name="do" type="submit" value="голосовать">' ;
    echo '</form>  ';
    }
    else {echo 'На данный момент опросов не существует, попробуйте зайти позднее';};

    }

    Как видите исползуется стандартное условие, внутри которого выводим опрос. Разберем запрос $q1:

    $q1 = mysql_query(”SELECT * FROM tquestions ORDER BY RAND() LIMIT 1″);

    Транскрипция запроса:

    $q1 = mysql_query(”ВЫБРАТЬ * ИЗ tquestions СОРТИРОВАТЬ RAND() ПРЕДЕЛ 1″);

    Запрос $q1 выбирает из базы ОДНО случайное значение, выполняется это при помощи аргумента RAND() и установления предела 1. В результате $q1 содержит id вопроса и его название $question.

    Далее функцией mysql_num_rows() проверяем результат. Если результат положительный , извлекаем значения при помощи функции mysql_fetch_array() и выводим вопрос.

    Чтобы вывести варианты ответов к этому вопросу создаем ещё один запрос к базе, и производим выборку по id вопроса:

    $q2 = mysql_query(”SELECT * FROM tanswers WHERE qid=’”.$r['id'].”‘”);

    Транскрипция запроса:

    $q2 = mysql_query(”ВЫБРАТЬ * ИЗ tanswers ГДЕ qid=’”.$r['id'].”‘”);

    После запроса создаем стандартный цикл и выводим варианты ответов. Внутри цикла используем HTML-код подобный тому, что рассматривали в первом случае.
    По завершению цикла следует поле input с атрибутом hidden (скрытое), в котором содержится идентификатор вопроса.

    Нажав на кнопку, мы посылаем все данные следующему блоку.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //Если кнопка была нажата
    if($_POST['do'] != '') {
    //Увеличиваем значение
    $q3 = mysql_query("UPDATE tanswers SET votes=votes+1 WHERE id='".$_POST['answer']."'");

    if($q3 != FALSE) {
     //Получаем список ответов
     $q4 = @mysql_query("SELECT * FROM tanswers WHERE qid='".$_POST['rid']."'");
     //Получаем общее количество голосов на этот вопрос
     $q5 = @mysql_query("SELECT SUM(votes) FROM tanswers WHERE qid='".$_POST['rid']."'");
     echo 'Результаты опроса:<br/><br/>';
       while($r = @mysql_fetch_array($q4)) {
            echo '<b>'.$r['answer'].'</b><br/>';
         echo '<div style="height:20px; width:'.round(($r['votes']*100/@mysql_result($q5,0,0))*3).'px; background-image:url(end.jpg);background-color:#2478a8; background-repeat:no-repeat; background-position:right "></div>';
        echo '['.$r['votes'].']<br/>';
           }

    }


    }

    В этом блоке исползуется 3 запроса к базе.

    Запрос $q3 используется для увеличения значения на единицу у выбранного варианта ответа, идентификатор которого передается в $_POST['answer']:

    $q3 = mysql_query(”UPDATE tanswers SET votes=votes+1 WHERE id=’”.$_POST['answer'].”‘”);

    Транскрипция запроса:

    $q3 = mysql_query(”ИЗМЕНИТЬ tanswers УСТАНОВИТЬ votes=votes+1 ГДЕ id=’”.$_POST['answer'].”‘”);

    В этом запросе присутствует новое действие. Значение поля votes изменяется путем прибавления к существующему значению единицы ( votes=votes+1 ) , идентификатор которого равен выбранному ответу ($_POST['answer']).

    Если $q3 не равен FALSE, т.е. несет в себе результат выполняем дальнейшие действия.
    Первое – это составление запроса для получения всех вариантов ответа:

    $q4 = @mysql_query(”SELECT * FROM tanswers WHERE qid=’”.$_POST['rid'].”‘”);

    Транскрипция запроса:

    $q4 = @mysql_query(”ВЫБРАТЬ * ИЗ tanswers ГДЕ qid=’”.$_POST['rid'].”‘”);

    Здесь производим выборку всех данных из таблицы tanswers, где qid равен $_POST['id'].

    Теперь составляем вспомогательный запрос, который необходим для подсчета количества голосов для определенного вопроса:

    $q5 = @mysql_query(”SELECT SUM(votes) FROM tanswers WHERE qid=’”.$_POST['rid'].”‘”);

    Транскрипция запроса:

    $q5 = @mysql_query(”ВЫБРАТЬ СУММУ(votes) ИЗ tanswers ГДЕ qid=’”.$_POST['rid'].”‘”);

    Как видно из транскрипции запроса, мы используем дополнительный аргумент SUM, который суммирует значения полей votes, где qid равен $_POST['rid'].

    Далее, используя результаты запросов, строим график. Для этого создаем цикл while, внутри которого выводим ответ и количество голосов. Для получения данных в процентах используем формулу из первого варианта.

    Скрипт голосования

    Пример работы скрипта на файлах можно посмотреть здесь
    Скачать скрипт голосования на файлах.

    Пример работы скрипта с использованием БД MySQL можно посмотреть здесь.
    Скачать скрипт голосования с использованием  БД MySQL.

    Советы по доработке

    Излагая материал в виде уроков нельзя обойтись без домашнего задания. Чтобы в дальнейшем использовать эти скрипты в своей практике советую их доработать. Во-первых необходимо проверять все входящие данные ( массивы $_POST и $_GET) .Во-вторых, защитить панель управления паролем, т.е. сделать авторизацию, благо это уже рассматривалось в прошлых уроках. В-третьих, защитить скрипт от накрутки применяя сессии. Механизм работы с сессиями рассматривался в прошлых уроках.

    Заключение

    Материал этого урока расчитан как на начинающего программиста, так и на более продвинутого. Для себя вы можете выбрать любой из вариантов, разобрать его и применять алгоритмы в свои будущих разработках.

    Google Bookmarks БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong
    rss-лентаПодпишись на RSS, впереди много интересного.

    29 Responses to “Урок 16. Скрипт голосования. Создаем опрос посетителей на сайте.”

    Страницы: [3] 2 1 » Show All

    1. 29
      BlueWolfNo Gravatar Says:

      Скрипт хороший, но много ошибок. Приведу пример: ($votes[$i]*100/$votes[count($answer)]
      Сдесь возникнет ошибка деление на ноль не возможно! Придётся предварительно проголосовать за все варианты, а можно изначально записывать данные не 0 а 1

      Вот здесь тоже ошибка:
      for($i=0;$i<=count($answer)-1;$i++) { $data .="0::"; }
      $data .="0";

      Зачем -1 я так и не понял убрать его надо

      for($i=0;$i<=count($answer)-1;$i++) { $data .="0::"; }
      $data .="0";

    2. 28
      ДенисNo Gravatar Says:

      Интересная статья. Попробую сделать голосование на своём сайте, благо и повод представился хороший – релиз видео курса. Заранее спасибо!

    3. 27
      AcrorternNo Gravatar Says:

      Благовония. В Интернет магазине Xsmoke Вам предоставляеться возможность приобрести миксы курителньые VIP качества а именно : Чмллин (Chillin), Спайс Голд (Spiec Gold), Джа Раш (Jah Rush), Спайс Моджо (Spice Mojo), Юаатан Фаер (Yucatan Fire), Спайс Аркрие (Spice Arctijc), Экс-Сес (Ex-Ses), Сапйс Даймонд (Spice Diamond), Гдиро Фаер (Hydro Frie), Спайс Тропик (Spice Tropical), Сканк (Scunk), Смок (Smoke) и большой выбор друигх миксов 65557

    4. 26
      NoNameNo Gravatar Says:

      Вот с ІР косяк… есть у меня ADSL и я могу просто перезагрузить модем и ещё проголосовать, так само я могу зайти через какойто анонимайзер и ещё раз сделать голос…
      Лучше Подкрепиться Куками, но я могу легко удалить все сессии и опять проголосовать… ;)

    5. 25
      DeveloperNo Gravatar Says:

      Скрипт не особо сложный.
      Чтобы нельзя было голосовать по одному IP, надо записывать IP или в базу данных или в файл. А после удаления голосования очищать базу ip.

    6. 24
      DimonNo Gravatar Says:

      Кстати с раздиганием всё решается очень просто вместо px посавьте %

    7. 23
      АлександрNo Gravatar Says:

      Если честно – довольно геморное занятие, но если вы хотите сделать такую фичу, то добавляйте таблицу с ip-шниками. При голосовании записываете айпи юзера, далее просто сверяете. Также можно посмотреть в сторону кукисов.

    8. 22
      LionNo Gravatar Says:

      и почему при обновлении страницы через F5 голосования продолжается?

    9. 21
      LionNo Gravatar Says:

      Александр,как можнj зделать, что бы человек мог голосовать только один раз с своего IP на сайте?

    Страницы: [3] 2 1 » Show All

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.
SEO Powered by Platinum SEO from Techblissonline