Советы по PHP : Создание голосования на PHP

смотрим также

Материал из Справочник Web-языков

Перейти к: навигация, поиск


Ниже приводится неправильный способ создание голосования на файлах. Основная ошибка в том, что при изменении результатов голосования файл не блокируется. Также код выкопан археологами, разбирающими код php3 - основная ошибка этих скриптов - register_globals

Создание голосования на PHP

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

Для нашего голосования нам потребуются четыре файла:

  • В первом будет находиться форма с голосованием (form.html).
  • Второй файл будет отвечать за обработку результатов (golos.php).
  • В третьем будут храниться данные голосования (data.txt).
  • Четвертый будет отвечать за выдачу графической информации (img.php).

Например мы хотим задать посетителям следующие вопросы:

Ваше мнение о сайте
  • просто супер
  • нормальный
  • так себе
  • мне все равно
  • плохой
  • хуже не видел

В файл form.html запишем:

<form action=golos.php method=post>
<table cellspacing cellpadding=0 border=0>
<tr><td align=center colspan=2><B>Голосование:</B></td></tr>
<tr><td align=center colspan=2><B>Ваше мнение о сайте:</B></td></tr>
<tr><td><input type=radio name=otv value=1 checked></td>
<td>Просто супер!</td></tr>
<tr><td><input type=radio name=otv value=2></td>
<td>Нормальный.</td></tr>
<tr><td><input type=radio name=otv value=3></td><
td>Так себе.</td></tr>
<tr><td><input type=radio name=otv value=4></td><
td>Мне все равно.</td></tr>
<tr><td><input type=radio name=otv value=5></td><
td>Плохой.</td></tr>
<tr><td><input type=radio name=otv value=6></td><
td>Хуже не видел!</td></tr>
<tr><td colspan=2 align=center>
<input type=submit name=golos value="Голосовать"></td></tr>
</table</form>

После нажатия кнопки Голосовать переменная $otv перейдет на обработку сценарием в файле golos.php

В файл data.txt надо записать начальные данные, которые затем будут оттуда считаны и обработаны.

Создайте файл data.txt и в текстовом редакторе запишите в него следующие строки:

Результаты голосования:
0
0
0
0
0
0

Первая строка у нас учитываться не будет.

В остальные шесть строк надо ввести нули, нажимая после каждой цифры клавишу Enter.

В файле golos.php, который у нас отвечает за обработку результатов, напишем следующее:



Обработка голосования


<?php
if(@$golos) {
// Здесь мы запускаем обработку данных только если 
// была нажата клавиша Голосовать
  $file_name="data.txt";
  // Переменная $file_name задает имя файла с результатами
  $file=file($file_name);
  // Записываем файл с данными в массив $file
  $file_len=count($file);
  // $file_len - количество строк в файле data.txt
  for($i=1,$n=0;$i<$file_len;$i++) {
    $file[$i]=trim($file[$i]);
    $n=$n+$file[$i];
  };
  // В этом цикле мы убираем символы перевода строки и записываем в 
  // переменную $n сколько человек уже проголосовало
  echo "

Спасибо, Ваше мнение учтено!

";
 $file[$otv]++;
 $n++;
 // Здесь мы учитываем номер ответа, который пришел к нам из формы,
 // увеличив соответствующее значение в массиве и число проголосовавших на 1
 $rez="Результаты голосования:n";
 // Переменная $rez будет содержать данные о голосовании,
 // которые затем запишем обратно в файл
 for($i=1;$i<$file_len;$i++) $rez.=$file[$i]."n";
 $rez=trim($rez);
 $file_rec=@fopen($file_name,"w");
 // Здесь мы создаем новый файл, в который затем запишем обновленные данные
 if($file_rec) {
   $counter=fputs($file_rec,$rez);
   // Запись обновленных данных в файл data.txt
   fclose($file_rec);
 }
 else echo "Произошла ошибка записи результатов!";
 for($i=1;$i<$file_len;$i++) $pr[$i]=round(($file[$i]/$n)*100);

// Записали в массив $pr, сколько процентов от общего числа голосовавших // занимает каждый ответ // Далее идет кусок HTML-кода, который // отвечает за вывод наших данных на экран ?>

Ваше мнение о сайте:


Просто супер! (<?php echo $file[1];?>):

Нормальный. (<?php echo $file[2];?>):

Так себе. (<?php echo $file[3];?>):

Мне все равно. (<?php echo $file[4];?>):

Плохой. (<?php echo $file[5];?>):

Хуже не видел! (<?php echo $file[6];?>):

Всего проголосовало:

Записав в атрибут SRC тега <IMG> значение "img.php?pr=количество процентов" мы тем самым передаем файлу img.php (который отвечает за вывод графической информации) значение, на основании которого будет на лету сгенерировано изображение голосования.

Далее приведу листинг файла img.php:

<?php
  $otstup=35;
  // $otstup - задает отступ, в прелелах которого
  // в картинку впишем процентное значение
  $string=$pr."%";
  // $string - содержит значение процентов плюс знак процента
  $im=imageCreate($pr*2+$otstup,15);
  // Здесь создаем идентификатор, при помощи 
  // которого мы будем работать с картинкой
  $fon=imageColorAllocate($im,220,20,60);
  $fon1=imageColorAllocate($im,255,20,147);
  // Задаем цвет фона
  $col_b=imageColorAllocate($im,0,0,0);
  // Задаем цвет обводки
  $shrift=imageColorAllocate($im,255,255,255);
  // Цвет вывода процентного значения
  imageFill($im,2,2,$fon);
  // Заполнили наш прямоугольник основным фоном
  $x1=0;$x2=$pr*2+$otstup-1;
  $y1=0;$y2=14;
  // Формирование улов для обводки контуром
  imageLine($im,$x1,$y1,$x2,$y1,$col_b);
  imageLine($im,$x2,$y1,$x2,$y2,$col_b);
  imageLine($im,$x2,$y2,$x1,$y2,$col_b);
  imageLine($im,$x1,$y1,$x1,$y2,$col_b);
  imageLine($im,$x1+$otstup,$y1,$x1+$otstup,$y2,$col_b);
  // Создание контура и разделяющей полосы
  if($pr!=0) imageFill($im,$otstup+1,2,$fon1);
  // Если значение процента не равно 0, то заполняем 
  // правую часть цветом $fon1
  imageString($im,3,5,1,$string,$shrift);
  // Пишем в правую часть картинки процентное значение
  header("Content-type: image/png");
  imagePng($im);
  imageDestroy($im);
  // Здесь производим вывод полученной картинки в 
  // стандартный поток вывода и уничтожаем идентификатор
?>
Добавить страницу в закладки:
РАЗРЕШАЕТСЯ перепечатывать и копировать информацию ТОЛЬКО ПРИ РАЗМЕЩЕНИИ ссылки на оригинал!
(<A href="http://www.spravkaweb.ru/">Справочник Web-языков</A>)
другие проекты
Rambler\'s Top100 Индекс цитирования