Webmaster общности: Predpriemach.com | SearchEngines.bg

    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