PHP - prosta ankieta oparta o pliki tekstowe
| DZIAŁANIE: |
Jak ci się podoba ten kurs? |
Kod:

Ewentualne Objaśnienia:
A oto przykład na stworzenie prostej ankiety - sondy na potrzeby serwisu Internetowego. Ankieta ta opiera się na 3 plikach tekstowych, które przechowują liczbę głosów na daną opcję. Nie ma tutaj specjalnie nic nowego, pierw jak widać sprawdzane jest czy został oddany jakiś głos - jeżeli nie wyświetla się nam formularz - wiadomo 3 przyciski radio ( rzecz jasna przypominam, że muszą mieć one tutaj takie same nazwy, ale inne wartości ). Ale to jest proste:)
Popatrzmy co się dzieje już po oddaniu głosu - jak widzicie poszczególne wartości wybranych pól mają takie nazwy jak pliki tekstowe, które mamy w katalogu "prosta_ankieta". Czyli przykładowo przycisk radio ma wartość super - to plik tekstowy, który przechowuje liczbę głosów ma nazwę super.txt, dla opcji Taki se - wartość przycisku jest takise, a plik tekise.txt. Dlatego mamy do czynienia z zapisem typu :
$wartoscprzed = file_get_contents("prosta_ankieta/$ocena.txt"); - zmienna $ocena jest zarazem nazwą pliku w którym należy inkrementować wartość - jest to wygodne bo tak to musielibyśmy na przykład pisać instrukcję if lub switch, która sprawdzałaby która opcja została wybrana, a następnie zależnie od tego zmieniałaby wartość odpowiedniego pliku. Ale po co to ? zajęłoby to więcej czasu oraz dużo więcej kodu, a tutaj to zaledwie jedna linijka aby odczytać wartość, na którą zagłosowano i którą należy zwiększyć o 1.
Po odczytaniu wartości inkrementujemy ją, a następnie należy otworzyć plik tekstowy, do którego wpisujemy po prostu już zwiększoną o 1 wartość - czyli liczbę głosów. Tutaj użyłem funkcji fopen z parametrem w+ , ale można było równie dobrze użyć samego parametru w. Tutaj nam to pasuje, bo nie trzeba zmieniać wskaźników itd, w tym trybie ( w+ albo w ) zawartość pliku jest od razu kasowana, a potem możemy śmiało wpisać nową ( którą wcześniej już mamy gotową w zmiennej $wartoscpo ).
Ale jak widzicie jest tutaj coś nowego - mianowicie funkcja flock - o
tym jeszcze nie wspominałem. Więc o to tutaj chodzi ? Chodzi o to, że więcej niż
jeden użytkownik w tym samym czasie może otwierać ten plik - dokonywać zmian -
po prostu jednocześnie zagłosować w tej mini ankiecie. Jest to sytuacja
teoretycznie w tym przypadku mało prawdopodobne, ale jednak nie niemożliwa ! Ale
gdyby taka sytuacja zaistniała efekt byłby taki, że oddano by dwa głosy, ale
"zaliczony" zostałby tylko jeden. Dlatego funkcja flock pozwala nam na
zablokowanie pliku na czas trwania operacji.
Czyli ogólnie :
flock (nazwapliku, tryb); - ustawia blokadę pliku podanego w pierwszym argumencie w trybie określonym przez drugi parametr, drugi parametr to tutaj kolejno 2 - oznacza blokowanie na wyłączność, natomiast 3 - odblokowanie.
Dalej przy pomocy poznanej już funkcji file_get_contents (przypominam, że nie wszędzie to działa - wspominałem o tym wcześniej) - odczytujemy zawartość ( czyli liczbę głosów ) poszczególnych plików i zapisuje w odpowiednich zmiennych. Także suma tych zmiennych daje nam liczbę wszystkich głosów, a dalej możemy obliczyć procentowy udział każdej z opcji ankiety w całym głosowaniu. Jak widać tutaj użyłem funkcji floor która powoduje, że jej argument [ floor(liczba czy zmienna) ] staje się liczbą całkowitą.
No i dalej pozostaje nam jedynie zaprezentowanie wyników ankiety. Jak widać
mamy tutaj tabelę w której kolumnach mamy kolejno :
- nazwę opcji ;
- rysunek graficzny - słupek/schemat ;
- ilość głosów ;
- udział procentowy ;
Wszystko to jest jasne, ale warto tutaj zauważyć jak stworzyłem te wykresiki. Jest to po prostu plik graficzny ( *.GIF ) - maleńki kawałek ciemnego paseczka - który zależnie od ilości głosów taką właśnie przyjmuje długość - czyli HTMLowa opcja WIDTH ( długość obrazu ) przyjmuje wartość taką jak ilość głosów na daną opcję.
Czy taka metoda jest dobra ? Myślę, że dla prostych ankiet itp można jej śmiało używać, ale wiadomo że lepszym rozwiązaniem jest korzystanie z baz danych, no ale tutaj chodziło o pewien przykład z wykorzystaniem plików tekstowych i operacji na plikach poprzez PHP.
Poza tym tutaj warto zauważyć, że aby ankieta działała w pełni poprawnie w momencie kiedy głosów jeszcze nie ma - w plikach tekstowych muszą być wpisane wartości 0 - nie mogą one być zupełnie puste.
No i dość istotne jest to, że tutaj każdy może głosować po tyle razy ile tylko chce. Warto by było stworzyć blokadę - sugerując się na przykład adresem IP, albo wykorzystując ciasteczka --> wszystko to już omawiałem także, warto abyście się nad tym zastanowili !