A PHP + MySQL web application for managing music festivals: spectators buy tickets and monitor live sound-level sensors on site, organisers create and manage festivals, and a super-admin panel handles account verification and content moderation.
Originally built by the APP-G10E student team as a group project; deployed in production via Docker to Herogu.
- Overview
- Features
- Tech stack
- Getting started
- Demo accounts & seed data
- Project structure
- Reports
- Known limitations
- Contributors
There are three kinds of users:
| Role | Entry point | Can do |
|---|---|---|
| Spectator | WEB/login.php / WEB/sign_up.php |
Browse festivals, buy tickets, view live sound-sensor readings, vote on sound levels, edit profile |
| Organiser | WEB/login.php (organiser tab) / WEB/demand_acc_organiser.php |
Create and edit festivals, manage sensors, view the customer list |
| Admin | AdminPages/admin_login.php |
Verify or reject pending organiser accounts, edit static pop-up text, search users |
Organiser and admin accounts must be verified before they can log in; verification is handled
manually by an admin through AdminPages/verify_organisers.php.
- Spectator/organiser sign-up and login, backed by
password_hash/password_verify. - Festival creation, editing, and ticket sale flow (
WEB/createFestival.php,WEB/paiement.php). - Live sound-level sensors per festival, polled via
Controller/fetch_sensors.php, with an up/down "too loud?" vote (Controller/vote_handler.php). - Admin moderation: organiser account verification, contact-form inbox, editable static pop-up text (CGU, FAQ, mentions légales, cookies, etc.) per language.
- i18n: French, English, and Korean (
Language/translations.json), with a header language switcher. - Email verification codes sent via PHP's
mail()(Mail/).
- Backend: PHP 8,
mysqli(prepared statements in places, raw queries in others — see Known limitations), native PHP sessions. - Database: MySQL / MariaDB.
- Frontend: vanilla JS/CSS, no build step, no bundler.
- Production deploy: nginx + php-fpm in a single container (
docker/Dockerfile,docker/nginx.conf), built on top ofghcr.io/garage-isep/herogu-back/herogu-php-baseand shipped to Herogu.
There is no composer.json — the app only relies on core/bundled PHP extensions (mysqli).
The app is plain PHP with no build step, meant to run on a classic Apache/nginx + MySQL stack (e.g. XAMPP locally):
- Copy the repo into your web server's document root (e.g.
htdocs/for XAMPP). - Start Apache and MySQL.
- Import
SQLimport/app_g10e.sql(schema) and, optionally,SQLimport/dummy_data.sql(demo data) into anapp_g10edatabase — via phpMyAdmin, or by runningSQLimport/import.php. - The default credentials in
Controller/db_controller.php(root/ empty password /localhost) match XAMPP's defaults, so no further configuration is needed.
Key pages:
| Page | URL |
|---|---|
| Homepage | /WEB/homepage.php |
| Login | /WEB/login.php |
| Sign up | /WEB/sign_up.php |
| Spectator dashboard | /WEB/dashboard_client.php?customerId=cust-001 |
| Organiser dashboard | /WEB/dashboard_organiser.php |
| Admin login | /AdminPages/admin_login.php |
SQLimport/dummy_data.sql seeds:
| Role | Login | Password |
|---|---|---|
| Spectator (verified) | alice@example.com |
Password1! |
| Spectator (verified) | bob@example.com |
Password1! |
| Spectator (unverified) | chloe@example.com |
Password1! |
| Organiser (verified) | organiser@example.com |
OrganiserPass1! |
| Organiser (pending) | pending.organiser@example.com |
OrganiserPass1! |
| Admin | admin2 |
AdminPass1! |
Plus four sample festivals (with banner images and ticket prices), sound sensors for each festival, a couple of ticket purchases linking Alice/Bob to festivals, and sample contact-form messages — enough to exercise every screen without manually creating data first.
WEB/ Page controllers/views (login, sign up, dashboards, payment, festival creation...)
Controller/ PHP endpoints (AJAX handlers, form processing) + shared JS
AdminPages/ Super-admin login and moderation tools
Styles/ Shared PHP header/footer/head includes
CSS/ Stylesheets
Assets/ Images, flags, favicons
Language/ Translation JSON + tooling
Mail/ Verification email sending
SQLimport/ SQL schema dump, import script, and demo/dummy data
docker/ Production Dockerfile/nginx config used for the Herogu deployment
livrable_original/ Network study report (French, LaTeX sources + compiled PDF)
livrable_english/ English translation of the report (LaTeX sources + compiled PDF)
The network study deliverable that accompanies the project lives in two folders:
livrable_original/— the original French report (2024__G10E___Livrable_final.pdf) with its LaTeX sources and figures.livrable_english/— a full English translation (livrable_english.pdf); both the text and the figures containing French text were translated, keeping the exact same layout.
Each folder is self-contained: compiling main.tex inside it reproduces the corresponding PDF.
This started as a student project and has some rough edges worth knowing about before extending it or exposing it beyond a local/demo environment:
- SQL injection: several endpoints (e.g.
WEB/login.php,WEB/sign_up.php) interpolate$_POSTvalues directly into SQL strings instead of using prepared statements. Others (WEB/dashboard_client.php,AdminPages/verify_organisers.php) do usemysqli::preparecorrectly — the codebase is inconsistent rather than uniformly unsafe. - Credentials are hardcoded (
root/ empty password /localhost/app_g10e) in every file that opens a DB connection, rather than centralized in one config. Controller/vote_handler.phpinserts intovotingpartiesusing column names (sensorId,vote) that don't match that table's actual schema (votingPartyId,vote_up,FestivalId) — the sound-level voting endpoint will fail as-is.- Outgoing email isn't configured for local development (
Mail/uses PHP's baremail()), so verification emails won't actually be delivered locally — use the pre-verified demo accounts above, or verify rows directly in the database. - No automated tests, no CI, no license file.
APP-G10E team project.