Czego się nauczysz?
- Obsługi formularzy z radio buttonami
- Zliczania i obliczania procentów
- Zabezpieczania przed wielokrotnym głosowaniem (sesje)
- Tworzenia prostych wizualizacji danych
Stworzysz System głosowania - aplikację webową do przeprowadzania prostych ankiet jednokrotnego wyboru. Użytkownik widzi pytanie z opcjami odpowiedzi, oddaje głos, a system zapisuje wyniki i wyświetla podsumowanie z procentowym rozkładem głosów.
Czego się nauczysz?
W prawdziwej pracy...
Systemy ankiet i głosowań to popularna funkcjonalność wielu serwisów - od prostych sond na stronach informacyjnych po zaawansowane systemy badań opinii. Umiejętność zbierania i prezentowania danych statystycznych jest ceniona w każdej firmie.
Wyświetlenie ankiety Użytkownik widzi pytanie i listę opcji odpowiedzi. Może wybrać jedną z nich i zatwierdzić swój głos.
Zapis i zliczanie głosów Każdy głos jest zapisywany do pliku JSON. System zlicza głosy dla każdej opcji.
Wyświetlenie wyników Po zagłosowaniu użytkownik widzi wyniki - liczba głosów i procent dla każdej opcji.
Przykładowa struktura pliku JSON:
{ "poll": { "question": "Jaki język programowania jest Twoim ulubionym?", "options": [ {"id": 1, "text": "PHP", "votes": 15}, {"id": 2, "text": "JavaScript", "votes": 23}, {"id": 3, "text": "Python", "votes": 18}, {"id": 4, "text": "Java", "votes": 8} ], "created_at": "2026-02-13 10:00:00" }, "voters": [ {"ip": "192.168.1.1", "voted_at": "2026-02-13 10:30:00"}, {"session_id": "abc123", "voted_at": "2026-02-13 10:35:00"} ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik widzi pytanie “Jaki język programowania jest Twoim ulubionym?” z 4 opcjami. Wybiera “PHP” i klika “Zagłosuj”. Widzi wyniki: “PHP: 15 głosów, JavaScript: 23 głosy, Python: 18 głosów, Java: 8 głosów”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Po zagłosowaniu użytkownik widzi kolorowe paski: “PHP: 15 głosów (23%) [===]”, “JavaScript: 23 głosy (36%) [=====]”. Na dole: “Łącznie: 64 głosy. Ostatni głos: 5 minut temu”.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik próbuje zagłosować drugi raz - widzi komunikat “Już głosowałeś w tej ankiecie”. Administrator może wejść do panelu, zobaczyć wykres kołowy wyników i wyeksportować dane do Excela.
Formularz głosowania:
<form method="POST" action="vote.php"> <h2><?= htmlspecialchars($poll['question']) ?></h2>
<?php foreach ($poll['options'] as $option): ?> <label> <input type="radio" name="option" value="<?= $option['id'] ?>" required> <?= htmlspecialchars($option['text']) ?> </label><br> <?php endforeach; ?>
<button type="submit">Zagłosuj</button></form>Zliczanie głosu:
<?php$optionId = (int)$_POST['option'];$file = 'poll.json';$data = json_decode(file_get_contents($file), true);
// Znajdź opcję i zwiększ licznikforeach ($data['poll']['options'] as &$option) { if ($option['id'] === $optionId) { $option['votes']++; break; }}
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT));?>Obliczanie procentów:
<?php$totalVotes = array_sum(array_column($poll['options'], 'votes'));
foreach ($poll['options'] as $option) { $percent = $totalVotes > 0 ? round(($option['votes'] / $totalVotes) * 100, 1) : 0; echo htmlspecialchars($option['text']) . ": "; echo $option['votes'] . " głosów ($percent%)<br>";}?>Pasek postępu CSS:
<?php foreach ($poll['options'] as $option): $percent = $totalVotes > 0 ? ($option['votes'] / $totalVotes) * 100 : 0;?><div class="option"> <span><?= htmlspecialchars($option['text']) ?>: <?= $option['votes'] ?> (<?= round($percent, 1) ?>%)</span> <div class="progress-bar"> <div class="progress" style="width: <?= $percent ?>%"></div> </div></div><?php endforeach; ?>
<style>.progress-bar { background: #e9ecef; border-radius: 4px; height: 20px; margin: 5px 0;}.progress { background: #007bff; height: 100%; border-radius: 4px; transition: width 0.3s;}</style>Zabezpieczenie przed wielokrotnym głosowaniem:
<?phpsession_start();
// Sprawdź czy już głosowałif (isset($_SESSION['voted']) && $_SESSION['voted'] === true) { $error = 'Już oddałeś głos w tej ankiecie!';} else { // Zapisz głos // ... kod zapisywania ...
// Oznacz jako zagłosowany $_SESSION['voted'] = true; $success = 'Dziękujemy za głos!';}?>Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!