Session BRE05 Help

Cours : coder avec l'IA

Le principe de ce cours est d'essayer de vous donner de meilleurs réflexes lorsque vous utilisez les outils d'IA pour travailler.

L'état d'esprit à adopter

L'IA ne connaît pas vos objectifs ni votre contexte. C'est votre cerveau qui doit faire le pont. Vous devez donc analyser vous-même ce que vous souhaitez faire et les contexte de code dans lequel vous souhaitez le faire.

Faire une demande qualifiée

Avant de demander à l'IA de générer un bloc, vous devez écrire les 3 premières lignes du code pour initialiser le contexte.

Exemples :

❌ NE PAS DEMANDER ❌

Écris-moi une fonction pour récupérer les utilisateurs.

✅ DEMANDER ✅

Voici le code de base de la méthode findAll de mon UserManager. La connexion à la base de données est faite dans le constructeur et stockées dans l'attribut $this->db. Je veux utiliser PDO::FETCH_ASSOC et récupérer un tableau d'instances de la classe User. Je te donne le squelette de ma méthode findAll, le code de ma classe User, et une capture d'écran de la structure de ma table en base de données. J'ai besoin que tu complètes ma méthode findAll.
public function findAll() : array { }
class User { // le code de votre classse en entier }
-> uploadez une capture d'écran de la structure de votre table dans PHPMyAdmin

Cette mécanique de demande qualifiée doit être présente à chaque fois que vous faites une demande à une IA, de façon à ce qu'elle ne code pas quelque chose que vous n'êtes pas en capacité de comprendre / analyser / expliquer.

Utiliser l'IA pour analyser les consignes

Lorsque vous recevez les consignes d'une étape, d'un exercice ou d'un mini-projet et que vous voulez que l'IA vous aide, commencez par voir avec elle si elle comprend les mêmes choses que vous. L'idée dans cette situation c'est d'utiliser l'IA pour affiner / amender votre compréhension de la consigne, pas de lui faire coder un bloc que vous n'avez pas imaginé vous-mêmes.

Résumer la consigne avec vos mots

Imaginons, dans un exercice sur le MVC vous avez la consigne suivante :

"Une fois le routeur mis en place, faites en sorte de créer les controlleurs avec les méthodes appropriées (laissez les méthodes vides pour l'instant elles seront complétées plus tard)"

Comment est-ce que vous résumeriez-ça avec vos-mots ?

Plutôt : "Je dois créer des contolleurs et des méthodes pour mon routeur", ou bien "Je dois créer les contolleurs et les méthodes mentionnées dans mon routeur ?"

Confronter votre analyse à celle de l'IA

PROMPT 1

Dans le cadre d'une mini-projet de PHP sur la création d'un CRUD en MVC je reçois la consigne suivante : "Une fois le routeur mis en place, faites en sorte de créer les controlleurs avec les méthodes appropriées (laissez les méthodes vides pour l'instant elles seront complétées plus tard)" Voilà ce que je comprends de la consigne : "Je dois créer des contolleurs et des méthodes pour mon routeur" Comprends-tu la même chose que moi ? Demande-moi si tu as besoin d'éléments supplémentaires pour répondre.

RÉPONSE DE L'IA (Qwen 3.5)

qwen consignes

Cette réponse de l'IA est pour le coup utile, elle vous permet de corriger une erreur de compréhension de la consigne.

Vous pourriez par exemple enchainer avec :

PROMPT 2

Voici le code de mon routeur :
class Router { private BlogController $bc; private AuthController $ac; public function __construct() { $this->bc = new BlogController(); $this->ac = new AuthController(); } public function handleRequest() { if(!empty($_GET["route"])) { if($_GET["route"] === "category") { $this->bc->category(); } else if($_GET["route"] === "post") { $this->bc->post(); } else if($_GET["route"] === "register") { $this->ac->register(); } else if($_GET["route"] === "login") { $this->ac->login(); } else { $this->bc->notFound(); } } else { $this->bc->home(); } } }
Du coup je penses que je dois créer deux controllers : BlogController qui a les méthodes : - home - category - post et AuthController qui a les méthodes : - register - login es-tu d'accord avec mon analyse ?

RÉPONSE DE L'IA (Qwen 3.5)

qwen consignes 2

Exercice d'analyse de consigne

Le lien de l'exercice

Utiliser l'IA pour accompagner la conception

Sur la phase de conception, vous pouvez utiliser l'IA pour faire confirmer ce que vous envisagez de faire. Elle peut aussi vous aider à vous assurer que vous n'oubliez pas un aspect de ce que vous voulez faire. L'IA ne pourra pas vous concevoir un site complet, par contre elle peut vous aider étape par étape.

Exemple

Vous voulez réaliser un portfolio, vous avez déjà codé une partie du projet et vous pouvez d'ores et déjà afficher la liste de vos projets. Vous aimeriez rajouter un formulaire de contact.

PROMPT

Je réalise mon portfolio en PHP en utilisant le design pattern MVC. J'ai déjà mis en place Tout le CRUD de gestion de mes projets : - services/Routeur - controllers/ProjectController - managers/ProjectManager - models/Project J'ai des pages pour afficher : - la liste des projets - le détail d'un projet J'aimerai ajouter une fonctionnalité à mon site : je voudrais créer un formulaire de contact qui lorsque l'utilisateur le soumet, sauvegarde son message en base de données et m'envoie un mail avec une copie de son message. Voilà ce que je pense que je dois ajouter à mon projet pour y arriver : - une route de gestion sur formulaire de contact - une méthode de controller qui affiche le template du formulaire - une méthode de controller qui traite le formulaire - un model qui représente le message - un manager pour pouvoir faire les requêtes vers la base de données Peux-tu me dire si ma stratégie te parait la bonne ? Est-ce que j'oublie quelque chose ?

RÉPONSE DE L'IA (Qwen 3.5)

Ta stratégie est globalement excellente. Tu respectes parfaitement le principe de séparation des responsabilités du modèle MVC, et ta structure actuelle (Service -> Controller -> Manager -> Model) est cohérente. Tu as bien identifié où placer chaque couche logique. Cependant, pour rendre cette fonctionnalité robuste, sécurisée et utilisable en production (même sur un portfolio), il y a quelques éléments importants que tu devrais ajouter ou affiner : 1. Validation des données (Controller) Tu es obligé de valider les données dans le Controller avant d'appeler le Manager. Le Manager doit faire confiance uniquement au Controller. À faire : Vérifie que tous les champs sont remplis, l'email a un format valide, etc. À éviter : Ne fais pas cela dans le Model ou le Manager (qui devraient juste manipuler la structure de données et exécuter les requêtes). 2. Gestion des retours d'état (Flash Messages) Lorsque l'utilisateur soumis le formulaire, il attend un feedback : "Message envoyé" ou "Erreur". Où : Généralement après validation dans le Controller (session_start), tu peux stocker un message temporaire (ex: 'success' => 'Votre message a bien été envoyé.'). Comment : Tu devras inclure une méthode dans ton template pour afficher ces messages avant de charger la vue. 3. Sécurité : CSRF et XSS C'est souvent l'oubli classique dans les projets PHP "standards" mais critique. CSRF : Tu dois protéger le formulaire (ex: un token unique généré en session, @csrf_field ou similaire). Sans cela, n'importe qui peut soumettre une requête pour ton compte depuis un autre site. XSS : N'utilise jamais les variables directement dans le HTML (echo $message). Fais-le via le Model (si tu fais de la sauvegarde) ou assure-toi que le Controller ne fait pas d'échappement. Note : Le Manager utilisant PDO avec prepare() évite l'injection SQL, donc c'est bon là-dessus. 4. Gestion du Mails (SMTP vs mail()) Envoyer des mails en PHP natif (mail()) fonctionne mais n'est pas sécurisé et peu fiable pour la délivrabilité. Recommandation : Pour un portfolio, une librairie légère comme PHPMailer ou l'utilisation d'un service gratuit (ex: API SendGrid/Mailgun) via SMTP est mieux. Cela te permet de gérer facilement les en-têtes (Reply-To, From, etc.). Consoens : Vérifie que tu n'envoies pas trop de spams qui pourraient faire bloquer ton serveur. 5. Cohérence des Noms et Structure Pour garder l'homogénéité avec tes projets : Si tu as un ProjectModel, pour le contact, tu pourrais appeler cela MessageModel ou ContactRequestModel. Pour le Manager, garde Manager (ex: MessageManager).

Ici l'IA valide votre conception, vous indique certains aspects auxquels vous n'aviez peut-être pas pensé (les vérifications de sécurité, rajouter des messages de retour pour l'UX, ...). Elle vous indique aussi certaines bonnes pratiques (utiliser PHPMailer).

Par contre l'IA a ses limites : comme nous n'avons que très peu mentionné la base de données dans le prompt, l'IA ne la mentionne pas et pourtant pour installer cette nouvelle fonctionnalité vous devrez également ajouter une table dans la base de données.

Exercice de conception d'une fonctionalité

Le lien de l'exercice

Utiliser l'IA pour coder une fonctionnalité

Une fois votre conception en place et validée vient le moment de la coder. L'IA va pouvoir vous assister de plusieurs façons différentes.

Compléter le code répétitif

Un exemple assez typique et celui e la rédaction d'une classe Model : une fois que vous savez quels attributs doit avoir votre classe, rédiger les getters et setters est assez répétitif, c'est typiquement une tâche que vous pouvez déléguer à l'IA :

PROMPT

Je veux coder une classe Model pour mon site MVC, et voici le squelette de ma classe Post et de ma classe Category.
class Post { public function __construct(private string $title, private string $content, private DateTime $createdAt, private Category $category, private ? int $id = null) { } }
class Category { public function __construct(private string $name, private string $description, private ? int $id = null) { } }
Peux tu générer les getters et les setters des attributs des classes pour moi ?

RÉPONSE DE L'IA (Qwen 3.5)

Voici le code complété avec les **Getters** (pour lire les données) et les **Setters** (pour modifier les données), tout en respectant la syntaxe PHP 8+ que vous avez utilisée dans votre squelette (promotion de propriétés dans le constructeur). J'ai ajouté des commentaires pour expliquer l'utilité de chaque méthode.
class Post { public function __construct( private string $title, private string $content, private DateTime $createdAt, private Category $category, private ?int $id = null ) {} // === GETTERS === public function getId() : ?int { return $this->id; } public function getTitle() : string { return $this->title; } public function getContent() : string { return $this->content; } public function getCreatedAt() : DateTime { return $this->createdAt; } public function getCategory() : Category { return $this->category; } // === SETTERS === public function setId(?int $id) : void { $this->id = $id; } public function setTitle(string $title) : void { // Optionnel: Ajout de validation si nécessaire (ex: min 1 char) $this->title = trim($title); } public function setContent(string $content) : void { $this->content = $content; } public function setCreatedAt(DateTime $createdAt) : void { $this->createdAt = $createdAt; } public function setCategory(Category $category) : void { $this->category = $category; } }
class Category { public function __construct( private string $name, private string $description, private ?int $id = null ) {} // === GETTERS === public function getId() : ?int { return $this->id; } public function getName() : string { return $this->name; } public function getDescription() : string { return $this->description; } // === SETTERS === public function setId(?int $id) : void { $this->id = $id; } public function setName(string $name) : void { $this->name = trim($name); } public function setDescription(string $description) : void { $this->description = $description; } }

Coder à partir d'un plan de bataille

Une autre technique c'est de prédécouper les étapes que vous voulez qu'une fonction réalise puis de demander à l'IA de remplir ces étapes :

PROMPT

Je code un projet PHP sans framework, qui doit respecter le MVC. Pour gérer ma fonctionnalité du formulaire de contact, j'ai les routes appropriées dans mon Router, une méthode du ContactController pour afficher le template qui contient le formulaire de contact, un ContactManager qui contient les méthodes du CRUD de mon model Contact en base de données. Je créé une méthode du ContactController qui valide un formulaire de contact, peux tu me valider que les différentes étapes du code que j'ai mis en commentaire sont les bonnes ? Je veux simplement que tu valides la logique, ne me propose pas de code ou d'implémentation. Voici mes étapes : 1. vérifier si on a bien reçu le formulaire a. si ça n'est pas le cas renvoyer vers l'affichage du formulaire b. si c'est le cas : passer au 2 2. Vérifier si le formulaire contient les champs nécessaires (nom, email, objet, message) a. si ça n'est pas le cas, réafficher le formulaire avec un message d'erreur b. si c'est le cas aller au 3 3. Instancier le ContactManager 4. Instancier un ContactMessage avec les infos du formulaire 5. Appeler la méthode create du ContactManager en lui passant le ContactMessage 6. Revenir à la page d'accueil avec un message de succès

RÉPONSE DE L'IA (Qwen 3.5)

Validation Globale Ton approche respecte globalement le principe de séparation des responsabilités dans un contexte MVC. Le Controller ne gère que le cycle de vie et l'interaction utilisateur (validation, redirection), tandis que le Manager gère la couche données (persistence). Cependant, voici quelques points d'attention spécifiques à ta logique pour l'approfondir avant mise en production : Analyse Étape par Étape 1. Vérifier si on a bien reçu le formulaire Logique : Correcte. Pourquoi : Empêche de traiter une requête GET comme une soumission (sécurité et logique métier). Si l'utilisateur rafraîchit la page sans cliquer sur le bouton, cela ne doit pas rejouer la requête. Point d'attention : Assure-toi que ce check porte bien sur le method HTTP (POST) ou sur la présence du token de sécurité CSRF (si tu en as un). 2. Vérifier les champs nécessaires et afficher les erreurs Logique : Correcte. Pourquoi : C'est crucial pour l'UX : ne pas laisser un formulaire vide passer avant le chargement des données ou la base de données, tout en montrant au utilisateur pourquoi ça a échoué. Point d'attention : Garde bien les champs dans une variable "temporaire" (ex: $formData) à l'étape 4 pour ne pas perdre les données après l'échec des validations, sinon tu perdras la saisie de l'utilisateur lors du réaffichage du formulaire. 3 & 4. Instancier Manager et Modèle/DTO (ContactMessage) Logique : Acceptable dans le contexte d'un "Manager Pattern" pur. Pourquoi : Tu sépare bien la logique métier (MVC) de la gestion de base de données (Manager). L'instantiation du DTO (ContactMessage) dans le Controller est une méthode courante pour préparer les données avant transmission. Point d'attention : Assure-toi que ton ContactManager::create attend bien un objet ou un tableau, et ne fait pas d'exécution de requête côté SQL à l'intérieur du Controller. 5. Appeler la méthode create du Manager Logique : C'est ici le point critique manquant dans ton algorithme actuel. Risque : Si tu fais appel au 6 (succès) directement après, sans vérifier si le retour de l'étape 5 a réussi ou échoué, tu peux afficher un message de succès alors que la base de données n'a pas enregistré les données. Validation : Tu devrais conditionner l'affichage du succès selon le résultat retourné par ContactManager (ex: retour true, false, ou exception). 6. Revenir à la page d'accueil avec un message de succès Logique : Acceptable mais dépend de ton choix technique. Nuance : Le terme "Revenir" est ambigu en MVC. Si tu utilises une header('Location', ...), c'est un rediriger (recommandé pour éviter le double soumission en cas de rafraîchissement). Si tu affiches simplement le HTML de la page d'accueil, l'utilisateur verra une page blanche ou chargée par défaut sans message flash visible s'il n'a pas géré les messages. Sécurité : N'oublie pas que si tu envoies vers "Accueil", tu dois avoir validé le token CSRF (généralement) car tu ne peux pas rediriger l'utilisateur directement depuis le formulaire de contact si ce dernier contient un formulaire d'inscription ou une action sensible. Conclusion sur la logique Ton flux est fonctionnel et respecte les étapes du MVC. La structure Controller -> Manager -> Base de données est bien respectée. Pour rendre cette logique totalement robuste, tu devrais impérativement ajouter une vérification de retour après l'appel au Manager (Étape 5) avant de confirmer le succès (Étape 6).

PROMPT 2

Je code un projet PHP sans framework, qui doit respecter le MVC. Pour gérer ma fonctionnalité du formulaire de contact, j'ai les routes appropriées dans mon Router, une méthode du ContactController pour afficher le template qui contient le formulaire de contact, un ContactManager qui contient les méthodes du CRUD de mon model Contact en base de données. Je créé une méthode du ContactController qui valide un formulaire de contact, ma première étape est de vérifier si un formulaire a bien été soumis, peux-tu me coder cette condition ? Je ne veux que cette condition, la gestion d'erreur sera gérée ultérieurement. Voici le squelette de ma méthode de controller :
public function validateContactMessage() : void { }

RÉPONSE DE L'IA (Qwen 3.5)

Voici le code pour la condition de vérification dans votre méthode `validateContactMessage()` :
public function validateContactMessage() : void { // Vérification que la requête provient d'un formulaire soumis en POST if ($_SERVER['REQUEST_METHOD'] === 'POST') { // La gestion des données et validation sera gérée ici ensuite } }
Pourquoi cette condition ? - `$_SERVER['REQUEST_METHOD']` : Il permet de distinguer la **demande de vue** (GET) d'une **requête de traitement** (POST). On ne traite les données que si le formulaire a été envoyé. - Cela respecte le principe MVC en séparant l'affichage (vue GET) du traitement (action POST).

Et ainsi de suite pour chaque étape de votre fonctionnalité.

Debugger avec l'IA

L'IA peut vous aider dans différents aspects du debug, mais comme pour tout le reste vous devez d'abord faire une partie du travail vous même.

Comprendre une erreur

PROMPT

J'essaie de récupérer le nom des équipes (team) qui ont participé à un match(game) grâce à une requête dans ma base de données mais je reçois l'erreur suivante : Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't1.id' in 'on clause' Voici le code de ma requête SQL, peux-tu m'indiquer ce qui pose problème sans corriger le code à ma place ?
SELECT game. *, team1.name AS team_01_name, team2.name AS team_02_name FROM games JOIN teams AS team1 ON t1.id = games.team_01 JOIN teams AS team2 ON t2.id = games.team_02 WHERE games.id = :id

RÉPONSE DE L'IA (Qwen 3.5)

qwen error bdd

Vérifier un flux d'exécution

Parfois ça n'affiche pas d'erreur, mais ça ne marche pas pour autant, et c'est souvent plus difficile à debugger. Dans la majorité des cas il y a une faille dans le processus d'exécution. Vous allez donc pouvoir utiliser l'IA pour valider les étapes d'exécution les une après les autres.

PROMPT

Dans mon projet en PHP sans framework, j'utilise une architecture MVC. Je suis en train de coder la fonctionnalité qui affiche le détail d'un post de blog stocké en base de données, mais lorsque je clique sur le lien de détail d'accès à cet article, j'ai une page blanche. Je vais donc te détailler tout le flux d'exécution pour que tu me dises si tu vois quelque chose qui cloche ou qui manque. 1. Je demande l'URL index.php
require "config/autoload.php"; session_start(); $router = new Router(); $router->handleRequest();
Ici tout va bien, la page m'affiche bien le template avec la liste des projets.
<?php foreach($projects as $project) { ?> <article> <h3><?= $project->getTitle() ?></h3> <a href="index.php?route=post&id=<?= ?>">Lire l'article</a> </article> <?php } ?>
Vois-tu à ce stade quelque chose qui pose problème ?

RÉPONSE DE L'IA (Qwen 3.5)

qwen white screen

Ici l'erreur était assez tôt dans le processus, mais elle peut également être plus en profondeur (une condition de controller, ou un erreur dans un manager), refaites les étapes 1 par 1 jusqu'à ce que vous puissiez l'identifier.

23 March 2026