[ 0.000 ] Initializing portfolio...
[ 0.212 ] Loading modules... OK
[ 0.445 ] Mounting filesystem... OK
[ 0.673 ] Starting services... OK
[ 0.891 ] Welcome, user.
Projet de 1ère année BUT MMI (SAE 105). Un site qui présente le top 50 des clubs en Ligue des Champions et l'histoire du meilleur joueur du monde. Gestion d'image, tableau dynamique et formulaire de contact sécurisé.
C'était la SAE 105, obligatoire en 1ère année. L'objectif était de tout combiner en même temps : intégrer des pages à partir de données structurées, mettre en place un environnement de dev propre, et déployer en ligne. Le thème du football, c'est moi qui l'ai choisi parce que ça m'intéresse vraiment. Autant traiter un sujet qui me parle plutôt qu'un sujet bateau.
C'est aussi le premier projet où j'ai touché à du PHP côté serveur pour de vrai. L'upload d'image, la génération de pages depuis des données, la gestion des formulaires. Ça m'a forcé à comprendre comment le front et le back s'articulent, pas juste à les utiliser séparément.
$ Fonctionnalités
$ Contexte
// Gestion upload image — validation extension + déplacement
if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
$ext = strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION));
if (in_array($ext, $allowed)) {
$nom = uniqid('img_', true) . '.' . $ext;
$dest = __DIR__ . '/uploads/' . $nom;
move_uploaded_file($_FILES['image']['tmp_name'], $dest);
echo json_encode(['ok' => true, 'file' => $nom]);
} else {
echo json_encode(['ok' => false, 'error' => 'Extension non autorisée']);
}
}