Сервер в кармане, или просто о сложном!

главная - Статьи - WWW (HTML, PHP и др.)

Как создать голосование на PHP

Ниже приведена простая для понимания и реализации функция создания интернет-голосования на сайте.

Вызывается функция следующим образом:

<?php

// Создаем новую функцию С 3-мя параметрами:
// $name - название опроса;
// $variants - массив вариантов ответа;
// $dir - имя директории для файлов опроса (папка создается скриптом).

function voting($name, $variants, $dir){

GLOBAL $REQUEST_URI;

    // Если пользователь уже проголосовал
    if(isset($_POST['vote'])){

    // Массив ошибок
    $errors = array();

    // Массив содержимого директории

    $indir = array();
    $dh = opendir('./');
    while($file = readdir($dh)){
    if($file == '.' || $file == '..') continue;
    $indir[] = $file;
    }
    closedir($dh);

    // --------------------------------------------------------
    // Если у вас PHP5, вместо получения содержимого дериктории
    // вручную, вы можете воспльзоваться функцией scandir():
    // $indir = scandir('./');
    // --------------------------------------------------------


    // Если директория для файлов опроса отсутсвует,
    // Значит еще никто не голосовал, следовательно,
    // Нужно создать эту директорию и необходимые файлы,
    // Чтобы избежать ошибки


    if(in_array($dir, $indir) == FALSE){

    mkdir($dir, 0770);
    $cr1 = fopen($dir.'/base.txt', 'w');
    for($i=0; $i<sizeof($variants); $i++){
    fputs($cr1, '0');
    }
    fclose($cr1);
    $cr2 = fopen($dir.'/ip_list.txt', 'w');
    fclose($cr2);
    }

        // Понеслась... Проверяем, голосовал ли пользователь
        // Массив уже проголосовавших IP-адресов

        $ip_list = file($dir.'/ip_list.txt');


            // Если IP юзера совпал с одним из базы, значит юзер
            // Уже голосовал

            if(in_array($_SERVER['REMOTE_ADDR']." ", $ip_list) == TRUE){
            $errors[] = "Вы уже голосовали!";

        }else{

            $answers = file($dir."/base.txt");

            $fh = fopen($dir."/base.txt", "w");
            flock($fh, LOCK_EX);

            for($i=0; $i<sizeof($answers); $i++){
                // Удаляем переводы строк
                $answers[$i] = trim($answers[$i]);

                // Пишем
                if($i == $_POST['vote']){
                    fputs($fh, ($answers[$i]+1)." ");
                }else{
                    fputs($fh, $answers[$i]." ");
                }
            }

            flock($fh, LOCK_UN);
            fclose($fh);

        // Записываем IP юзера в базу проголосовавших

            $fb = fopen($dir."/ip_list.txt", "a+");
            fputs($fb, $_SERVER['REMOTE_ADDR']." ");
            fclose($fb);
            }

    if(isset($errors[0])){
        echo "Ваш голос не был учтен, т.к. были обнаружены следующие ошибки: <br>";
        for($i=0; $i<sizeof($errors); $i++) echo $errors[$i]."<br>";
    }else{

        echo "Ваш голос учтен! Результаты:<br>";

        // Обновляем базу
        $answers = file($dir."/base.txt");

        // Выводим результаты, и заодно считаем общее количество
        // Для этого складываем существующие голоса

        $summ = 0;
        for($i=0; $i<sizeof($answers); $i++){
        echo $variants[$i].": ".$answers[$i]."<br>";

        // Пересчет голосов
        $summ += $answers[$i];
        }

        // Вывод общего количества голосов
        echo "Всего: ".$summ;

    }

    }else{

        echo "<b>".$name."</b><br>";

        echo "<form action=./ method=POST>";

        for($i=0; $i<sizeof($variants); $i++){
            echo "<input type=radio name=vote value=".$i;
            if($i==0) echo " checked";
            echo ">".$variants[$i]."<br>";
        }
        echo "<input type=submit value=Голосовать>";
        echo "</form>";

    }
}
?>

Вызывается функция следующим образом:

<?php
voting("Выбираем самый популярный антивирус", Array("Kaspersky", "Eset NOD32", "Symantec", "DrWeb", "McAfee"), "vote2");
?>

Ну вот и все.

Автор: Mostom, http://cngroup.ru/

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?