Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Strict Standards: Only variables should be assigned by reference in
/blog/wp-includes/post.php on line
114
Deprecated: Function eregi() is deprecated in
/blog/wp-content/plugins/tpbc.php on line
96
Ten artykuł przedstawi sposób na wykonanie prostego systemu do obsługi głosowania. Aby skrypt był jeszcze bardziej nieskomplikowany, informacje będą przechowywane w plikach tekstowych.
Uwagi:
- Wszystkie części wyjaśnianego w poradzie kodu powinny znajdować się w jednym pliku z rozszerzeniem .php.
- Prócz pliku .php należy stworzyć plik z rozszerzeniem .txt i nadać mu prawa dostępu 777, plik ten powinien znajdować się w tej samej lokalizacji co plik .php.
- Kod z formularzem i skryptem można w całości skopiować na końcu tej porady.
Nasz program będzie się składał z kilku części:
- Formularz HTML z możliwością głosowania.
- Wyzerowanie i ustawienie zmiennych.
- Sprawdzenie czy wcześniej głosowano z tego samego IP.
- Zapis danych z aktualnego głosowania
- Wyświetlenie średniej z głosowania i liczby głosowań.
Formularz głosowania:
W tej części stworzymy prosty formularz HTML. Będzie zawierał listę z wariantami oceny od 1 do 5. Atrybut name w polu select zawiera nazwę "glosowanie", która podczas wysyłania formularza będzie przyjmować jedną z pięciu wartości z pól options (value=’tuaj ocena’).
Kod: php
<form method="post" action="<?php echo $_SERVER[’PHP_SELF’]; ?>">
<select name="glosowanie">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<input type="submit" value="glosuj" name="submit" />
</form>
Ustawienie, wyzerowanie zmiennych:
W tej części ustawone zostaną wartości początkowe naszych zmiennych. Zmienna $glosowanie otrzyma wartość równą wartości wybranej w formularzu oceny, ale tylko w przypadku, gdy taka wartość została wybrana - czyli został wysłany formularz. Jeżeli formularz nie zostanie wysłany (np. podczas odczytywania pliku .php w przeglądarce) zmienna $glosowanie będzie miała wartość 0. Dodatkowo zmienna $ip pobierze adres IP, z którego wywołany został formularz - czyli IP głosującego. Wartość ta będzie potrzebna aby uniknąć sytuacji wielokrotnego głosowania z tego samego komputera. To oczywiście dosyć proste zabezpieczenie, ale dla podstawowych zastosowań bardzo użyteczne.
Kod: php
<?php
$glosowanie = isset($_POST[‘glosowanie’]) ? $_POST[‘glosowanie’] : 0;
$nazwa_pliku = "plik_glosowanie";
$czy_glosowano = false;
$suma_punktow = 0;
$suma_glosowan = 0;
$ip = getenv(‘REMOTE_ADDR’);
?>
Sprawdzenie czy głosowano wcześniej z tego samego IP:
W tej części skrypt odczyta dotychczasowe dane z pliku tekstowego i sprawdzi czy nie istnieje czasem już IP, z którego dokonano wcześniej głosowania. Jeżeli tak się stanie zmienna $czy_glosowano otrzyma wartość true, przez co nie będzie możliwe zapisanie aktualnego głosowania.
Kod: php
<?php
// Odczyt pliku tekstowego
$stare_glosowania = file($nazwa_pliku.‘.txt’);
// Suma glosow i glosowan
foreach ($stare_glosowania as $value) {
$jedno_glosowanie = explode(‘:’,$value);
// Sprawdzenie czy numer IP jest taki sam jak IP aktualnego glosowania
if ($ip == $jedno_glosowanie[0]) $czy_glosowano = true;
$suma_glosowan++;
$suma_punktow += $jedno_glosowanie[1];
}
?>
W powyższym kodzie pętla foreach sprawdza plik tekstowy linia po linii. Do zmiennej $jedno_glosowanie przypisywana jest każdorazowo tablica z dwoma wartościami (ip:oceana) z kolejnych linii. Jeżeli skrypt sprawdzi, że zmienna $ip (ip aktualnie głosującego) jest taka sama jak któraś z wartości w pliku tekstowym, zmienna $czy_glosowano przyjmie wartość true, co uniemożliwi zapis aktualnych wyników głosowania do pliku. Innymi słowy głosowanie się nie uda.
Zapis danych z aktualnego głosowania:
Jeżeli w wyniku działania poprzedniej części kodu zmienna $czy_glosowano nie zmieni wartości na true, a zmienna $glosowanie będzie większa od 0 (co jest możliwe tylko w przypadku wysłania formularza), wartości z auktualnego głosowania zostaną zapisane do pliku tekstowego. Funkcja fopen() zajmie się otwarciem naszego pliku tekstowego i zapisze na jego końcu dodatkową linię (numer ip głosującego:ocena z aktualnego głosowania). O tym, że wartość będzie dopisywana do pliku na końcu decyduje atrybut a+. Następnie plik tekstowy zostanie zamknięty, zmienna $suma_glosowan zwiększy wartość o 1, a zmienna $suma_punktow zwiększy wartość o aktualnie wybraną ocenę.
Kod: php
<?php
// Jezeli glosowanie jest udane zapisz dane do pliku txt
if ((!$czy_glosowano) && ($glosowanie > 0)){
$f = fopen($nazwa_pliku.".txt","a+");
fwrite($f,$ip.‘:’.$glosowanie."\n");
fclose($f);
$suma_glosowan++;
$suma_punktow+=$glosowanie;
}
?>
Wyświetlenie średniej oceny i liczby głosowań:
W ostanim kroku wyświetlimy aktualne wyniki głosowań oraz średnią ocenę jaka się z tych głosowań wyłoni. Można to zrobić wyświetlając same wartości liczbowe lub za pomocą jakiejś grafiki np. gwiazdek. W poniższym przykładzie warto zwrócić uwagę na finkcję substr(), która spowoduje odczytanie trzech pierwszych znaków z ułamka dziesiętnego powstałego w wyniku dzielenia sumy punktów przez sumę głosowań.
Kod: php
<?php
echo "Aktualna srednia po $suma_glosowan glosowaniu to: "
.substr(($suma_punktow/$suma_glosowan),0,3)."
";
?>
A tutaj cały kod:
Kod: php
<form method="post" action="<?php echo $_SERVER[’PHP_SELF’]; ?>">
<select name="glosowanie">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<input type="submit" value="glosuj" name="submit" />
</form>
<?php
$glosowanie = isset($_POST[‘glosowanie’]) ? $_POST[‘glosowanie’] : 0;
$nazwa_pliku = "plik_glosowanie";
$czy_glosowano = false;
$suma_punktow = 0;
$suma_glosowan = 0;
$ip = getenv(‘REMOTE_ADDR’);
// Odczyt pliku tekstowego
$stare_glosowania = file($nazwa_pliku.‘.txt’);
// Suma glosow i glosowan
foreach ($stare_glosowania as $value) {
$jedno_glosowanie = explode(‘:’,$value);
// Sprawdzenie czy numer IP jest taki sam jak IP aktualnego glosowania
if ($ip == $jedno_glosowanie[0]) $czy_glosowano = true;
$suma_glosowan++;
$suma_punktow += $jedno_glosowanie[1];
}
// Jezeli glosowanie jest udane zapisz dane do pliku txt
if ((!$czy_glosowano) && ($glosowanie > 0)){
$f = fopen($nazwa_pliku.".txt","a+");
fwrite($f,$ip.‘:’.$glosowanie."\n");
fclose($f);
$suma_glosowan++;
$suma_punktow+=$glosowanie;
}
echo "Aktualna srednia po $suma_glosowan glosowaniu to: "
.substr(($suma_punktow/$suma_glosowan),0,3)."
";
?>
Autor: Adam Suchowski
nowe Porady PHP »
zobacz wszystkie