PHP : Създаване на анкета ( с прости файлове)
Ще се опитам да покажа нагледно с прост и лесен код как да си направите анкета.
За база данни ще ползвам прости файлове, а не MySQL база данни.
Ето и по важните неща:
Ще направиме анкета с въпрос и 3 възможни отговора:

Въпрос: Коя антивирусна е по добра?
0тговор 1:Kaspersky
0тговор 2:Norton
0тговор 3:Panda

След като посетителя гласува примерно за Panda, към броя на гласувалите за Panda
трябва да прибавиме неговия глас.
Пример:
Брой гласували:
0тговор 1:Kaspersky - 10 гласа
0тговор 2:Norton - 5 гласа
0тговор 3:Panda - 6 гласа

След като посетителя гласува резултатите ще се променят на:
Брой гласували:
0тговор 1:Kaspersky - 10 гласа
0тговор 2:Norton - 5 гласа
0тговор 3:Panda - 7 гласа
И новите резултати да се запишат отново в файла,който ползваме за база данни.
Има още един проблем:
Посетителя не би трябвало да може да гласува повече от веднъж.
Трябва да запишеме някъде, че е гласувал и да не му позволимe да
гласува пак.
Но за това ще стане въпрос към края.
Сега ще направиме анкетата без да ограничаваме посетителя колко пъти да гласува.
Това е с цел по лесно да се разбере работата на този елементарен скрипт.

Ще създадеме два файла:
1. form.html - това е формуляра на анкетата
2. vote.php - това е скрипта, който ще обработва данните изпратени от form.html
3. db.inc - ще бъде създаде от скрипта vote.php и в него ще
се записват резултатите

Ето кода на form.html:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
</head>
<body>
<br>
Коя антивирусна е по-добра?<br>
<FORM ACTION="vote.php" METHOD=POST >
<INPUT TYPE="radio" NAME="vote" VALUE="a">
Kaspersky
<br>
<INPUT TYPE="radio" NAME="vote" VALUE="b">
Norton
<br>
<INPUT TYPE="radio" NAME="vote" VALUE="c">
Panda
<br>
<INPUT TYPE="submit" VALUE="Гласувай"> </form>
</body>
</html>


Горния код трябва да ви е ясен ако знаете малко HTML, но да поясня все пак:
Формуляра е с radio бутони, така че в зависимост от това как гласува посетителя изпраща
различни данни към скрипта vote.php (ако гласува за Kaspersky изпраща "a" - за Norton-"b"-
за Panda - "c")
Той(скрипта vote.php) от своя страна в зависимост от полученото променя базата данни.

Ето го и скрипта vote.php:
<html>
<head>
<title>vote</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<?php
$vote= $HTTP_POST_VARS["vote"];

if (file_exists("db.inc"))
{
$db= file("db.inc");
$a=$db[0];
$a=str_replace("\n","",$a);
$b=$db[1];
$b=str_replace("\n","",$b);
$c=$db[2];
$c=str_replace("\n","",$c);
}
else
{
$a=0;
$b=0;
$c=0;
}
if ($vote==a)
{$a=$a+1;}
elseif ($vote==b)
{$b=$b+1;}
elseif ($vote==c)
{$c=$c+1;}

$zapisdb=$a."\n".$b."\n".$c;

$fp = fopen ( "db.inc" ,"w");
fwrite($fp, $zapisdb );
fclose($fp);

echo 'Резултати : <br>';
echo 'Kaspersky - '.$a.' гласа<br>';
echo "Norton - ".$b." гласа<br>";
echo "Panda - ".$c." гласа<br>";
?>


Не е дълъг нали?
Сега ще го разгледаме ред по ред:
$vote= $HTTP_POST_VARS["vote"]; -
Променливата $vote може да приема три стойности - а,b или c ,в зависимост
от това за кой е гласувано в анкетата.
if (file_exists("db.inc")) - което буквално означава "Ако файла db.inc съществува"
Тази проверка е задължителна, защото файла може и да не съществува.
Той се създава когато някой за първи път гласува, но преди това още го няма.
Ако съществува се изпълнява този код:
$db= file("db.inc"); - отваря файла и го разделя на редове
като всеки ред ще бъде елемент от масива $db
$a=$db[0];-$а е равно на стойноста от първия ред на файла db.inc
$a=str_replace("\n","",$a);-от всеки елемент се маха знака за нов ред "\n"
$b=$db[1]; -$b е равно на стойноста от втория ред на файла db.inc
$b=str_replace("\n","",$b);
$c=$db[2]; -$c е равно на стойноста от третия ред на файла db.inc
$c=str_replace("\n","",$c);

ако не съществува, то това значи, че никой още не е гласувал и стойностите за
$a=0;
$b=0;
$c=0;


Следва проверка за кого е гласувано:
if ($vote==a)- ако е гласувано за Kaspersky
{$a=$a+1;} - $а се увеличава с 1
elseif ($vote==b) - ако е гласувано за Norton
{$b=$b+1;} - $b се увеличава с 1
elseif ($vote==c) - ако е гласувано за Panda
{$c=$c+1;} - $c се увеличава с 1


Следва запис на данните:
$zapisdb=$a."\n".$b."\n".$c; - $zapisdb e съставена от данните разделени с знак за нов ред
$fp = fopen ( "db.inc" ,"w"); - отваря файла за запис и изтрива цялото му съдържание.
Ако не съществува такъв файл го създава .
fwrite($fp, $zapisdb ); - записва променливата $zapis във файла db.inc
fclose($fp); - затваря файла db.inc

Следва показване на резултатите:
echo 'Резултати : <br>';
echo 'Kaspersky - '.$a.' гласа<br>';
echo "Norton - ".$b." гласа<br>";
echo "Panda - ".$c." гласа<br>";



А файла db.inc ще преставлява нещо такова:

17
26
12


където
17 е броя на гласувалите за Kaspersky
26 е броя на гласувалите за Norton
12 е броя на гласувалите за Panda

Когато някой потребтел гласува, скрипта vote.php променя стойноста на един
от редовете в зависимост от вота .

За да видите Демото натиснете тук

Сега ще промениме малко скрипта vote.php, като му добавиме няколко реда.
За да е видно кои редове добавяме ще ги оцветя в червено.

<html>
<head>
<title>vote</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<?php
$ipaddress = getenv("REMOTE_ADDR");
$vote= $HTTP_POST_VARS["vote"];

if (file_exists("db.inc"))
{
$db= file("db.inc");
$a=$db[0];
$a=str_replace("\n","",$a);
$b=$db[1];
$b=str_replace("\n","",$b);
$c=$db[2];
$c=str_replace("\n","",$c);
}
else
{
$a=0;
$b=0;
$c=0;
}
if (file_exists("ip.inc"))
{
$ip= file("ip.inc");
$n=count($ip);
for ($i=0; $i<$n;$i++)
{
if (eregi($ipaddress,$ip[$i]))
{
echo "Вие вече гласувахте.<br>";
echo 'Резултати : <br>';
echo 'Kaspersky - '.$a.' гласа<br>';
echo "Norton - ".$b." гласа<br>";
echo "Panda - ".$c." гласа<br>";
exit;
}
}
}

if ($vote==a)
{$a=$a+1;}
if ($vote==b)
{$b=$b+1;}
if ($vote==c)
{$c=$c+1;}

$zapisdb=$a."\n".$b."\n".$c;
$zapisip=$ipaddress."\n";

$fp = fopen ( "db.inc" ,"w");
fwrite($fp, $zapisdb );
fclose($fp);

$fp = fopen ( "ip.inc" ,"a");
fwrite($fp, $zapisip );
fclose($fp);

echo 'Резултати : <br>';
echo 'Kaspersky - '.$a.' гласа<br>';
echo "Norton - ".$b." гласа<br>";
echo "Panda - ".$c." гласа<br>";
?>


Да разгледаме всеки добавен ред:

$ipaddress = getenv("REMOTE_ADDR"); - взима ip адреса на посетителя
и го присвоява на променливата $ipaddress

if (file_exists("ip.inc")) -проверява дали файла
ip.inc съществува(може да не съществува само в случай, че никой досега не е гласувал)
{
$ip= file("ip.inc");
-ако съществува го отваря, като всеки ред от файла става
елемент от масива $ip
$n=count($ip);-$n става равна на броя на елементите в масива $ip
for ($i=0; $i<$n;$i++)-този цикъл ще обходи всичките елементи
{
if (eregi($ipaddress,$ip[$i]))
-ако намери съответствие между ip-адреса на посетителя
и някой от ip-адресите записани в файла ip.inc ще изпълни ето това :

echo "Вие вече гласувахте.<br>";
echo 'Резултати : <br>';
echo 'Kaspersky - '.$a.' гласа<br>';
echo "Norton - ".$b." гласа<br>";
echo "Panda - ".$c." гласа<br>";
exit;

По този начин казва на на потребителя, че вече е гласувал, показва му резултатите досега и
спира изпълнението на скрипта.

Ако пък ip-адреса на потребителя го няма в базата данни скрипта ще извърши следното

$zapisip=$ipaddress."\n";- $zapisip е равна на ip-aдреса и към
него прибавен знака за нов ред(така че когато го записваме в файла ip.inc да е на отделен ред)
$fp = fopen ( "ip.inc" ,"a"); - този ред отваря файла за запис,
но не изтрива съдържанието му а, само добавяне. Ако фйла не съществува, го създава.
fwrite($fp, $zapisip ); - добавя ip адреса след края на съдържанието на файла.
fclose($fp); -затваря файла

Урока е подготвен специално за http://web-tourist.net






/ Трябва да сте регистриран за да напишете коментар /
От: paco1
19:50 15-01-2010
Като публикуваш нещо, първо го тествай, това просто не работи!Файл db.inc просто не се създава сам, както казваш.А след като гласуваш, няма цифри а излизат някакви знаци!Ферщенд?!
От: viksasoft94
3:56 21-05-2010
super e
От: BlackLock
18:02 02-06-2010
Анкетата не работи, ако потребител е гласувал, при следващото му влизане не му се изкарват резултатите...
1