Przejdź do głównej zawartości

26. Aplikacja feedbacku i ocen kursów

Aplikacja feedbacku i ocen kursów

Aplikacja do zbierania opinii i ocen gwiazdkowych kursów lub zajęć. Użytkownicy wystawiają ocenę (1–5 gwiazdek) i opcjonalny komentarz. System oblicza średnią i pokazuje rozkład ocen.

  • Obliczania średniej i rozkładu statystycznego ocen
  • Renderowania gwiazdek oceny w HTML/CSS
  • Anonimowego zbierania opinii (brak logowania)
  • Ochrony przed wielokrotnym głosowaniem (cookie/sesja)
  • Wyświetlania paginowanej listy komentarzy
  1. Lista kursów/zajęć — z aktualną średnią oceną
  2. Formularz oceny — 1–5 gwiazdek + opcjonalny komentarz tekstowy
  3. Strona kursu — średnia, rozkład gwiazdek, lista komentarzy
  4. Ochrona przed duplikatami — blokada drugiej oceny przez cookie
  5. Moderacja (opcjonalnie) — ukrywanie wulgarnych komentarzy
{
"courses": [
{
"id": 1,
"name": "Programowanie w PHP",
"description": "Kurs podstawowy PHP dla klas 3TI",
"teacher": "mgr Kowalski"
}
],
"ratings": [
{
"id": 1,
"course_id": 1,
"stars": 5,
"comment": "Świetne zajęcia, dużo praktyki!",
"hidden": false,
"created_at": "2026-02-10 14:30:00"
}
]
}

Wymagane funkcje:

  • Formularz oceny: 1–5 gwiazdek + komentarz
  • Lista ocen z datą
  • Obliczanie średniej arytmetycznej
  • Walidacja: gwiazdki wymagane, komentarz max 500 znaków
  • Zapis do JSON
Ocena: 3.0
  • Folderfeedback/
    • index.php
    • kurs.php
    • ocen.php
    • admin.php
    • Folderincludes/
      • functions.php
      • auth.php
    • Folderdata/
      • courses.json
      • ratings.json
    • Foldercss/
      • style.css

Obliczanie średniej i rozkładu:

function getCourseStats(array $ratings, int $courseId): array {
$courseRatings = array_filter($ratings, fn($r) => $r['course_id'] === $courseId && !$r['hidden']);
$values = array_column(array_values($courseRatings), 'stars');
if (empty($values)) {
return ['avg' => 0, 'count' => 0, 'distribution' => array_fill(1, 5, 0)];
}
$dist = array_fill(1, 5, 0);
foreach ($values as $v) $dist[$v]++;
return [
'avg' => round(array_sum($values) / count($values), 1),
'count' => count($values),
'distribution' => $dist,
];
}

Ochrona przed duplikatem przez cookie:

function hasAlreadyRated(int $courseId): bool {
return isset($_COOKIE["rated_$courseId"]);
}
function markAsRated(int $courseId): void {
setcookie("rated_$courseId", '1', time() + 86400 * 365, '/');
}