веб-мастеру блог веб-мастера Статьи Веб-Мастера SEO Tools книги веб-мастеру

IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Пишем опрос (голосование) на Php..., PHP
sashkovishe
сообщение 28.6.2007, 23:50
Сообщение #1


Администратор форума
****

Группа: Администраторы
Сообщений: 397
Регистрация: 3.12.2006
Из: России
Пользователь №: 4



Пишем опрос (голосование) на PHP.


Опрос работает на файлах, Mysql не требуется.
Помимо самого опроса, у нас так же будет возможность создавать новые опросы (заменяя старые), без особого труда.
P.S. готовые файлы этого опроса, можно скачать в конце статьи...

И так начнем...
Первым делом напишем скрипт, который будет создавать сам опрос...
ps. В коде есть комментарии...
файл admin.php
Код

<html>
<head>
    <title>Создание опроса (by sashkovishe)</title>
</head>

<body>
<?
// на первой странице показываем форму для ввода кол-во вариантов ответа
$body="Создание опроса (1 шаг)<br><Br>
    <form action='admin.php?action=2' method=POST>
    Кол-во вариантов ответа: <input type=text name='count_otv' size=3 maxlength=2><Br>
    <input type=submit value=\”Далее >>\” name=go1>
    </form>";
?>

если нажата далее, то переходим на следующую страницу создания опроса.
Переход по страницам осуществляется посредствам switch().
Код

<?
switch(@$_GET['action']) {
    case("2"):
    // форма для ввода вопроса и ответов
    $body="Создание опроса (2 шаг)<br><Br>
    <form action='admin.php?action=3' method=POST>
    <input type=\"hidden\" name=\"count_otv\" value=\"".$_POST['count_otv']."\">
Вопрос: <input type=text name='question'><br><br>
    Варианты ответа:<br>";

Строка <input type=\"hidden\" name=\"count_otv\" value=\"".$_POST['count_otv']."\"> нужна для передачи кол-ва ответов введенных в начале странице (потом вы узнаете зачем это нужно)
Продолжаем…
Код

    $n=1;
    $count_otv=$_POST['count_otv']+1; // +1 потому что отсчет начинается с нуля
    while ($n<$count_otv) {
        $body.="<input type=\"text\" name=\"otv$n\"><br>";
        $n++;
    }
    $body.="<input type=submit value='Далее >>' name='go1'>
        </form>";
    break;

Этот код генерирует поля типа text. т.е. если в поле "Кол-во вариантов ответа:" было введено 3, то генерируются 3 поля для ответов
Код

    // на следующей странице происходит сохранение всех данных
    case("3"):
    $body="Создание опроса. (3 шаг)<br><b>Сохранение опроса:</b> ";
    $result_file="result.txt"; // файл где будет храниться готовая форма для отображения результатов
    $voting_file="voting.txt"; // файл где будет храниться результаты голосования
    $form_file="form.txt"; // файл где будет храниться готовая форма для голосования
    $question=$_POST['question']; // содержит вопрос опроса=)
    $count_otv=$_POST['count_otv']; // кол-во ответов всего
    if ($file=fopen($form_file, "w+")) { // открываем файл для чтения и записи

$str_save - эта переменная которая будет содержать готовый сохраняемый текст (в данном случае будем сохранять будущую форму опроса)
Код
        $str_save="<form action=\"index.php\" method=post>\r\n
            <table cellspacing=0 cellpadding=0 border=0 align=center>
            <tr><td colspan=3 align=center>\r\n
            <font size=\"2\" face=\"Verdana\">
            <i>Опрос</i><br>".$question."<p>\r\n
            </td></tr>";
        for ($i=1;$i<=$count_otv;$i++) {
            $otvn=$_POST['otv'.$i]; // содержит названия ответов
            $str_save.="<tr><td><input type=\"radio\" name=\"otv\" value=\"".$i."\" id=\"".$i."\">
                <label for=\"".$i."\">".$otvn."</label></td></tr>";
        }

Здесь этот код отвечает за кол-во ответов в форме и выводом значение самих ответов, т.е. какие и сколько ответов было введено, то и будет отображаться. Тут как раз и пригодилась строка написанная выше: <input type=\"hidden\" name=\"count_otv\" value=\"".$_POST['count_otv']."\">, которая была нужна для того, чтобы подсчитывать кол-во ответов.

Далее мы просто добавляем к переменной $str_save окончание сохраняемой формы
Код

        $str_save.="<tr><td colspan=2 align=center><br>
            <input type=submit name=golos value=\"Готово\"><br>\r\n
            <a href='index.php'>Результаты</a></td></tr>\r\n
            </table></form>";
            fwrite($file, $str_save); // записываем все в файл.
    }

Форма для опроса готова, осталось только переписать (можно даже сказать сбросить) значения результатов опроса и переписать (создать) форму для отображения результатов…

Далее, код который сбрасывает значения результатов опроса по умолчанию (т.е. делает счетчик = 0).
Этот код и последующий, похож на код который был выше (когда сохраняли названия ответов), так что нового здесь ничего нет.
Код

    $str_save2="Результаты опроса:\r\n";
    for ($i=1;$i<=$count_otv;$i++) {
        $str_save2.="0\r\n";
        if ($file2=fopen($voting_file, "w+")) { // открываем файл для чтения и записи
            fwrite($file2, $str_save2);
        }
    }

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

    if ($file3=fopen($result_file, "w+")) { // открываем файл для чтения и записи
        $str_save3="<div style=\"font-size: 15px;\">
            <center><font size='4'>Результаты опроса<p>\r\n
            <font size='3'>".$question."</font><hr width=30%></cetner>\r\n
            <table border=0 align=center>\r\n";
        for ($i=1;$i<=$count_otv;$i++) {
            $otvn=$_POST['otv'.$i]; // Названия ответов
            $str_save3.="<tr><td><b>".$otvn."</b> <td>(<?=\$file[".$i."];?>)</td><td>
                <img src=\"linegolos.gif\" height=10 alt=\"<?=\$pr[".$i."];?>%\" width=\"<?=(1+\$pr[".$i."]*3);?>\">
                <?=\$pr[".$i."];?>%</td></tr>\r\n";
        }
        $str_save3.="</td></tr></table><center><hr width=30%></cetner>
            <table border=0 align=center>\r\n
            <tr><td align=center>Ответили: <B><?=\$n;?></B> чел.<br>\r\n
            <a href=\"vote.php\">Назад</a></td></tr>\r\n</table>";
            fwrite($file3, $str_save3);
            $body.="<b>OK</b><br><a href='vote.php'>Просмотреть опрос</a>";
    }
    break;
}
?>

<img src=\"linegolos.gif\" … - это название изображения которое будет менять ширину, в зависимости от кол-ва голосов.
<?=\$pr[".$i."];?> - это служит для вывода процентов. “\” – а это нужно чтобы $pr не считалось как переменной к этом коде.
width=\"<?=(1+\$pr[".$i."]*3);?> - эта конструкция отвечает за ширину изображения. Умножаем на 3, потому, чтобы ширина изображения была побольше, можно это значения изменить (например на 5).
И далее просто заканчиваем код…
Код

<?=$body;?>

</body>
</html>

Все. Закончили создания опроса.

Теперь переходим к написанию скрипта, который подсчитывает и отображает результатов.
index.php
Код

<?
if(@$_POST['golos'] && !@$_POST['otv']) { // Если пользователь не выбрали ответ,
    echo "Вы не выбрали ответ!!!<br>
    <a href='vote.php'>Назад</a>"; exit; // то пишем об этом и дальше код не выполняется
}
$file_name="voting.txt"; // имя файла - куда записываются результаты опроса
$file=file($file_name);
$file_len=count($file); // посчитываем кол-во строк

Далее, подсчитываем кол-во голосов всего, сохраняя это число в $n. trim() – удаляем из начала и конца строки пробелы.
Код

for($i=1,$n=0;$i<$file_len;$i++) {
  $file[$i]=trim($file[$i]);
  $n=$n+$file[$i];
};
/* если нажата кнопка "Готово" и выбран вариант ответа, то выполняем сохранения результатов... */
if(@$_POST['golos'] && @$_POST['otv']) {
/* при каждом новом ответе, добавляем +1, чтобы каждый голос (ответ) считался как новый */
  @$file[$_POST['otv']]++;
  $n++;
  $str="Результаты опроса:\n";

$str – будет содержать строку для сохранения результатов… далее создаем цикл. Где добавляем к переменной $str результаты голосов.
Код

  for($i=1;$i<$file_len;$i++) $str.=$file[$i]."\n";
  $str=trim($str); // удаляем из начала и конца строки пробелы
  $file_open=@fopen($file_name,"w"); // открываем файл для записи
  if($file_open) { // если все ok...
    $counter=fwrite($file_open,$str); // ...то записываем в файл результаты
    fclose($file_open); // Закрываем файл
  }
  else echo "Произошла ошибка записи";
}

Далее, код служит для анализа кол-во голосов и выводит проценты для каждого ответа, относительно всех голосов. Вывод процентов происходит по формуле ($file[$i]/$n)*100 т.е. каждый вариант (кол-во) ответа делится на сумму всех голосов и умножается на 100… round() – округляем проценты.
Код

for($i=1;$i<$file_len;$i++) $pr[$i]=@round(($file[$i]/$n)*100);
?>

Ну вот и все, готово…
Теперь просто подключаем файл с готовой формой для отображения результатов (которая создается автоматически в admin.php)
Код

<?
include("result.txt"); ?>


Теперь осталось только подключить саму форму опроса. Ее можно подключать куда угодно…
Подключаем ее так: <? include("form.txt"); ?>

Ну например так:
vote.php
Код

<center><a href="admin.php">Создать новый опрос</a></center></p>
<?
/* подключаем файл с готовой формой для голосования (которая создается в admin.php) */
include("form.txt");
?>

Все, опрос готов… единственное здесь нет защиты от накрутки. Но этого я думаю достаточно чтобы сделать эту защиту самому smile.gif

Для тех кто не хочет или не получилось собрать все в одно целое, вот архив с готовый опросом:
Прикрепленный файл  voting.zip ( 4.96 килобайт ) Кол-во скачиваний: 124


Автор: sashkovishe


--------------------
Изображение
Think differently...
ICQ: 6-135-294
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Быстрый ответОтветить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 14.5.2008, 5:15
^ ВВЕРХ ^

Посетите наши проекты:
новости танцевального спорта   carbon360.net - игра nfs pro street