24 Commits

Author SHA1 Message Date
Denis Monnerat f27180ac90 ajout groupe Ta 2026-06-16 09:19:25 +02:00
Denis Monnerat b35399a401 ajout groupe Ta 2026-06-16 09:19:00 +02:00
Denis Monnerat 5216c540ba ajout groupe Jdoudi-Lelievre 2026-06-14 17:52:46 +02:00
Denis Monnerat c0d480d11d oubli PIERRE LOUIS 2026-06-13 11:36:19 +02:00
Denis Monnerat 3a1f56a525 oubli 2026-06-11 10:26:15 +02:00
Denis Monnerat b1fdaedb1c oubli 2026-06-11 10:16:34 +02:00
Denis Monnerat 38b767d947 oubli 2026-06-11 10:14:46 +02:00
Denis Monnerat 0810d8a885 GROUPES.md 2026-06-11 07:31:42 +02:00
Denis Monnerat c33c3d41d9 soutenances 2026-06-10 15:46:46 +02:00
Denis Monnerat 55f3353551 Merge branch 'main' of grond.iut-fbleau.fr:monnerat/web_2025
ok
2026-06-10 15:44:58 +02:00
Denis Monnerat 395d54cc5a soutenances 2026-06-10 15:38:16 +02:00
Denis Monnerat c188dd0654 Merge pull request 'l'usage de l'IA dans le projet' (#4) from sae/proposition-pour-usage-de-l-ia into main
Reviewed-on: monnerat/web_2025#4
Reviewed-by: Denis Monnerat <monnerat@u-pec.fr>
2026-05-20 07:50:35 +02:00
Ulysse JARNOUEN DE VILLARTAY d03b943fcf l'usage de l'IA dans le projet 2026-05-19 21:28:58 +02:00
Denis Monnerat 9dc7bf6640 sae 2026-05-18 18:14:23 +02:00
Denis Monnerat 62ddd3cdc7 cm intro secusite 2026-05-17 10:07:53 +02:00
Denis Monnerat 7b7a55534a typo 2026-05-16 10:23:38 +02:00
Denis Monnerat c6932cab66 sae r3.01 2026-05-16 10:19:07 +02:00
Denis Monnerat 9055087d00 todos 2026-05-06 10:41:08 +02:00
Denis Monnerat 36234a5256 layout pour les vues 2026-05-06 09:01:23 +02:00
Denis Monnerat 78caabe3f1 tp5 mvc + codeigniter v3 2026-05-05 08:47:04 +02:00
Denis Monnerat 691f55f9d0 objet + mvc 2026-05-04 11:04:29 +02:00
Ulysse JARNOUEN DE VILLARTAY a4580652f8 correction-ulysse (#2)
# Correction pour les TP1 TP2 et TP3

Je n'ai pas testé la connexion à la DB pour le moment car je ne peux pas me co sur https://dwarves.iut-fbleau.fr/phpmyadmin

Co-authored-by: JARNOUEN DE VILLARTAY Ulysse (SAFRAN AIRCRAFT ENGINES) <ulysse.jarnouen-de-villartay@safrangroup.com>
Reviewed-on: monnerat/web_2025#2
2026-04-15 15:34:46 +02:00
Denis Monnerat 045ec81ae2 ajout tp4 cookies et sessions 2026-04-12 17:58:57 +02:00
Denis Monnerat 3c100c0200 cookies et sessions 2026-04-10 09:46:07 +02:00
53 changed files with 1661 additions and 219 deletions
+21 -4
View File
@@ -30,10 +30,13 @@ Les notions suivantes seront abordées :
| Semaine | Cours | TD/TP |
| ------------------ | -------------------------------------------------------- | ------------------ |
| 1 : 16/03 - 20/03| [Bases du langages](./cours/cm_bases_php.pdf) | |
| 2 : 23/03 - 27/03 | | [tp1](./tp/tp1) |
| 3 : 30/03 - 03/04 | [Intéractions avec le client](./cours/cm_interaction_client_serveur.pdf) | [tp2](./tp/tp2) |
| 4 : 07/04 - 10/04 | [PHP/MySQL](./cours/cm_extension_mysqli.pdf) | [tp3](./tp/tp3) |
| 1 | [Bases du langages](./cours/cm_bases_php.pdf) | |
| 2 | | [tp1](./tp/tp1) |
| 3 | [Intéractions avec le client](./cours/cm_interaction_client_serveur.pdf) | [tp2](./tp/tp2) |
| 4 | [PHP/MySQL](./cours/cm_extension_mysqli.pdf) | [tp3](./tp/tp3) |
| 5 | [Cookies et sessions](./cours/cm_cookies_sessions.pdf) | [tp3](./tp/tp3) , [tp4](./tp/tp4) |
| 6 | [PHP Objet](./cours/cm_objet.pdf), [MVC avec codeigniter](./cours/cm_mvc.pdf) | [tp5](./tp/tp5) |
| 7 | [securite](./cours/cm_securite.pdf) | |
@@ -51,4 +54,18 @@ aborde la récupération des données de formulaires avec PHP.
À chaque exercice correspond un sous répertoire avec
des fichiers à compléter.
#### TP3 : PHP/Mysql
Le [tp3](./tp/tp3)
aborde l'interfaçage de php avec mysql, au moyen de l'extention
[mysqli](http://php.net/manual/fr/book.mysqli.php) de php.
À chaque exercice correspond un sous répertoire avec
des fichiers à compléter.
#### TP4 : Cookies et sessions
Le [tp4](./tp/tp4)
aborde la notion de cookies et de sessions,et
les fonctions php dédiées.
À chaque exercice correspond un sous répertoire avec
des fichiers à compléter.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+57
View File
@@ -0,0 +1,57 @@
## Groupes et soutenances
Une soutenance de votre projet aura lieu le mercredi 18. Vous
devez arriver **5 minutes** avant l'horaire précisée, et préparer une machine
(navigateur avec votre application et vos sources sur grond) pour
que je teste votre site.
**Mercredi 18 juin 2025**
# GR12
- SALVIA-GILLET 13h30 224
- MERIGOT 13h50 225
- BENHAMOU-BELABED 14h10 224
- BONNET-LAURENT 14h30 225
- AMROUCHI-LECOINTRE 14h50 224
- BADIO-MOUHIB 15h10 225
- ROUX-JI 15h30 224
- SOUGOUMARANE 15h50 225
- GUINET-MILLERIOUX 16h10 224
- DOUCOURE-SLIMANI 16h30 225
- NKOUKA 16h50 224
- JDOUDI-LELIEVRE 17h10 225
- TA-GARNIER(?) 17h30 224
# GR34
- CHABOT-ALVES 9h00 224
- PRADAT-CUGUT 9h20 225
- OLIVIER-POUGET 9h40 224
- JOSSE-DICK 10h00 225
- ADDOUN 10h20 224
- DANOUSHE-NASSIM 10h40 225
- PAYEN-DE JESUS 11h00 224
- SAUNIER 11h20 225
- ABBAZ 11h40 224
- PICART-ZOUBA 12H00 225
- BRAZ MAWANA 12h20 224
- PIERRE LOUIS 12h40 225
# GR56
- (MO)OUISSI 13h30 222
- JANICOT 13h50 223
- TAFOK-GOBE 14h10 222
- OUISSI-SPOR 14h30 223
- VITARD-BLANCHARD 14h50 222
- TRENIER-LIROT 15h10 223
- GOMEZ 15h30 222
- BERNARD-MERCIER 15h50 223
- PASQUAZZO-JACKSON 16h10 222
- TALBIS 16h30 223
- PINEAU-ETIEVANT 16h50 222
- AKTAS-CHARRIERE 17h10 223
- BEDOUET-QUEUDOT 17h30 222
- MOOGIN-DUSSEAUX 17h50 223
+119
View File
@@ -0,0 +1,119 @@
# SAE S2.02 : Consultation/modificaion d'une base de jeux vidéos
> [Soutenances](./GROUPES.md)
## Le thème
Le projet utilise une [base de données](./sql/game.sql.gz) de jeux vidéos (créée par
Jérôme Cutrona, IUT de Reims). Il consiste à écrire une application web qui permet :
- la consultation/recherche d'informations contenues dans la bd (catégories, genres, jeux),
- la création, édition, suppression d'un jeu.
La [base de données](./sql/game.sql.gz) a la structure suivante :
<div align="center">
<img src="./img/game.svg">
</div>
## Principes généraux, fonctionnalités
1. La partie consultation permet l'accès à plusieurs vues :
- liste d'ensemble des catégories et genres de jeux (sous forme de lien),
- détails d'une catégorie et d'un genre avec la liste de ses jeux (sous forme de lien),
- détails d'un jeu (les genres et catégories du jeu sont des liens).
2. La partie modification permet, pour un jeu :
- l'édition (sans modification du poster)
- la création (poster facultatif)
- la suppression
3. Tri des listes de jeux par titre ou par année
4. fonction de recherche textuelle
## Contraintes de réalisations
- Votre code utilisera codeigniter v3, exactement comme en TP.
- Vous utiliserez le serveur de base de données mariaDB de l'iut, comme en TP.
- Vous travaillerez seul, ou en binôme, à l'intérieur de votre **groupe de TP**.
- Vous créerez un dépot GIT par monôme/binôme, avec le nom **sae_r301_grx** ($x\in\{12,34,56\}$) suivant votre groupe TP.
Ulysse Jarnouen et Denis Monnerat seront collaborateurs.
- Votre dépot contiendra un fichier README.md, avec :
- le prénom, nom des membres du binômes
- **l'url de votre site sur dwarves.iut-fbleau.fr**
## Usage de l'IA
### L'IA est autorisée mais ne remplace pas la compréhension
Le recours a l'IA peut être autorise comme outil d'assistance, au même titre qu'une documentation, un forum technique ou un IDE.
En revanche :
- tout code rendu doit être compris par l'étudiant;
- tout code non expliqué ou non modifiable en situation sera considéré comme non acquis;
- l'étudiant reste responsable de la qualité, de la sécurité et de la cohérence du code rendu.
## Règles communes concernant l'usage de l'IA
1. L'usage de l'IA est autorisé comme outil d'assistance.
2. Tout code rendu doit pouvoir être expliqué et modifié par l'étudiant.
3. Les propositions de l'IA doivent être relues, testées et adaptées.
4. Un code non compris ou non maitrise pourra être considére comme non acquis.
5. La transparence sur l'usage de l'IA est attendue dans le journal de bord, dans le dépôt et en soutenance.
Exemple de contenu attendu dans le journal sur la partie "Usage de l'IA":
- les prompts utilisés;
- les extraits de réponse juges utiles;
- ce qui a été retenu, adapte ou rejeté;
- les vérifications effectuées après usage.
## Organisation générale de l'évaluation
### Workflow de travail attendu
Afin de structurer le travail, de faciliter le suivi, le projet devra s'appuyer sur un workflow Git simple et obligatoire.
Pour chaque séance :
1. Vous devrez créer une branche de travail dédiée a la séance;
2. Vous devrez pousser régulièrement vos modifications sur cette branche au cours de la séance ;
3. en fin de séance, vous devrez ouvrir une "Pull Request" vers la branche cible définie (main) pour le projet;
4. Vous devrez assigner cette Pull Request a l'enseignant;
5. L'enseignant examinera et approuvera la Merge Request pour valider le travail réalisé ;
6. une fois la Merge Request approuvée, vous pourrez procéder au merge.
> Il est recommandé que les messages de commit et les titres de Merge Request soient explicites et lies a l'objectif technique traité.
### Traces de progression
Voici une liste d'éléments qui prouveront votre progression :
- dépôt Git avec commits réguliers;
- journal de bord court a chaque séance;
- liste des taches réalisées et reste a faire;
- tableau de répartition des responsabilités.
Le journal de bord doit suivre une structure simple et identique pour tous les groupes. Il peut rester concis, mais il doit être présent a chaque séance.
Structure recommandée pour chaque séance :
- objectif de la séance;
- travail réalisé;
- difficultés rencontrées;
- décisions prises ;
- travail de chacun dans le binôme;
- points a reprendre a la séance suivante;
- usage de l'IA, si applicable.
Le journal de bord doit être conservé dans un fichier Markdown (JOURNAL.md) du dépôt afin de rester consultable avec le reste des traces du projet.
## Évaluation
- L'avancement de votre travail sera mesuré à chaque fin de séance de TP (4 semaines).
- Votre réalisation sera évalué la semaine du 15 juin.
- Tout dépot avec quelques commits récents se verra fortement pénalisé.
- Un coefficient multiplicateur de 0 à 1 sera appliqué pour refléter l'équilibre du travail entre les deux membres du binôme.
### La note ne repose pas uniquement sur le livrable final
Une application fonctionnelle ne suffit pas a prouver l'acquisition des compétences. L'évaluation reposera sur plusieurs types de preuves :
- un livrable fonctionnel;
- des traces de progression;
- une explication orale individuelle;
- une courte mise en situation technique en direct.
Quand le projet est réalisé en binôme, une partie de la portera sur le travail collectif. Chaque étudiant doit notamment être en mesure d'expliquer un extrait de code introduit ou modifié par son binôme.
+108
View File
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="125 35 1123 415" width="998px" height="380px" xmlns="http://www.w3.org/2000/svg" version="1.1">
<line x1="600" y1="350" x2="590" y2="350" style="stroke:#333;stroke-width:1;"/>
<line x1="508" y1="370" x2="498" y2="370" style="stroke:#333;stroke-width:1;"/>
<line x1="590" y1="350" x2="508" y2="370" style="stroke:#333;stroke-width:1;"/>
<line x1="592.5" y1="350" x2="596.03553390593" y2="353.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="592.5" y1="350" x2="596.03553390593" y2="346.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="503" y1="370" x2="506.53553390593" y2="373.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="503" y1="370" x2="506.53553390593" y2="366.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="726" y1="370" x2="736" y2="370" style="stroke:#333;stroke-width:1;"/>
<line x1="790" y1="370" x2="800" y2="370" style="stroke:#333;stroke-width:1;"/>
<line x1="736" y1="370" x2="790" y2="370" style="stroke:#333;stroke-width:1;"/>
<line x1="733.5" y1="370" x2="729.96446609407" y2="373.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="733.5" y1="370" x2="729.96446609407" y2="366.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="795" y1="370" x2="791.46446609407" y2="373.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="795" y1="370" x2="791.46446609407" y2="366.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="370" y1="110" x2="360" y2="110" style="stroke:#0b0;stroke-width:1;"/>
<line x1="238" y1="160" x2="228" y2="160" style="stroke:#0b0;stroke-width:1;"/>
<line x1="360" y1="110" x2="238" y2="160" style="stroke:#0b0;stroke-width:1;"/>
<line x1="362.5" y1="110" x2="366.03553390593" y2="113.53553390593" style="stroke:#0b0;stroke-width:2;"/>
<line x1="362.5" y1="110" x2="366.03553390593" y2="106.46446609407" style="stroke:#0b0;stroke-width:2;"/>
<line x1="233" y1="160" x2="236.53553390593" y2="163.53553390593" style="stroke:#0b0;stroke-width:2;"/>
<line x1="233" y1="160" x2="236.53553390593" y2="156.46446609407" style="stroke:#0b0;stroke-width:2;"/>
<line x1="483" y1="90" x2="493" y2="90" style="stroke:#bbb;stroke-width:1;"/>
<line x1="590" y1="170" x2="600" y2="170" style="stroke:#bbb;stroke-width:1;"/>
<line x1="493" y1="90" x2="590" y2="170" style="stroke:#bbb;stroke-width:1;"/>
<line x1="490.5" y1="90" x2="486.96446609407" y2="93.535533905933" style="stroke:#bbb;stroke-width:2;"/>
<line x1="490.5" y1="90" x2="486.96446609407" y2="86.464466094067" style="stroke:#bbb;stroke-width:2;"/>
<line x1="595" y1="170" x2="591.46446609407" y2="173.53553390593" style="stroke:#bbb;stroke-width:2;"/>
<line x1="595" y1="170" x2="591.46446609407" y2="166.46446609407" style="stroke:#bbb;stroke-width:2;"/>
<line x1="810" y1="80" x2="800" y2="80" style="stroke:#bbb;stroke-width:1;"/>
<line x1="736" y1="170" x2="726" y2="170" style="stroke:#bbb;stroke-width:1;"/>
<line x1="800" y1="80" x2="736" y2="170" style="stroke:#bbb;stroke-width:1;"/>
<line x1="802.5" y1="80" x2="806.03553390593" y2="83.535533905933" style="stroke:#bbb;stroke-width:2;"/>
<line x1="802.5" y1="80" x2="806.03553390593" y2="76.464466094067" style="stroke:#bbb;stroke-width:2;"/>
<line x1="731" y1="170" x2="734.53553390593" y2="173.53553390593" style="stroke:#bbb;stroke-width:2;"/>
<line x1="731" y1="170" x2="734.53553390593" y2="166.46446609407" style="stroke:#bbb;stroke-width:2;"/>
<line x1="902" y1="100" x2="912" y2="100" style="stroke:#bbb;stroke-width:1;"/>
<line x1="1010" y1="180" x2="1020" y2="180" style="stroke:#bbb;stroke-width:1;"/>
<line x1="912" y1="100" x2="1010" y2="180" style="stroke:#bbb;stroke-width:1;"/>
<line x1="909.5" y1="100" x2="905.96446609407" y2="103.53553390593" style="stroke:#bbb;stroke-width:2;"/>
<line x1="909.5" y1="100" x2="905.96446609407" y2="96.464466094067" style="stroke:#bbb;stroke-width:2;"/>
<line x1="1015" y1="180" x2="1011.4644660941" y2="183.53553390593" style="stroke:#bbb;stroke-width:2;"/>
<line x1="1015" y1="180" x2="1011.4644660941" y2="176.46446609407" style="stroke:#bbb;stroke-width:2;"/>
<rect width="88" height="20" x="140" y="130" style="fill:#007;stroke:black;"/>
<text width="88" height="20" x="145" y="144" style="fill:#fff;" font-family="Arial" font-size="16px"> category</text>
<rect width="88" height="20" x="140" y="150" style="fill:#aea;stroke:black;"/>
<text width="88" height="20" x="145" y="164" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="88" height="20" x="140" y="170" style="fill:none;stroke:black;"/>
<text width="88" height="20" x="145" y="184" style="fill:black;" font-family="Arial" font-size="16px">description</text>
<rect width="78" height="20" x="420" y="340" style="fill:#007;stroke:black;"/>
<text width="78" height="20" x="425" y="354" style="fill:#fff;" font-family="Arial" font-size="16px"> developer</text>
<rect width="78" height="20" x="420" y="360" style="fill:#aea;stroke:black;"/>
<text width="78" height="20" x="425" y="374" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="78" height="20" x="420" y="380" style="fill:none;stroke:black;"/>
<text width="78" height="20" x="425" y="394" style="fill:black;" font-family="Arial" font-size="16px">name</text>
<rect width="126" height="20" x="600" y="140" style="fill:#007;stroke:black;"/>
<text width="126" height="20" x="605" y="154" style="fill:#fff;" font-family="Arial" font-size="16px"> game</text>
<rect width="126" height="20" x="600" y="160" style="fill:#aea;stroke:black;"/>
<text width="126" height="20" x="605" y="174" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="126" height="20" x="600" y="180" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="194" style="fill:black;" font-family="Arial" font-size="16px">name</text>
<rect width="126" height="20" x="600" y="200" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="214" style="fill:black;" font-family="Arial" font-size="16px">releaseYear</text>
<rect width="126" height="20" x="600" y="220" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="234" style="fill:black;" font-family="Arial" font-size="16px">shortDescription</text>
<rect width="126" height="20" x="600" y="240" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="254" style="fill:black;" font-family="Arial" font-size="16px">price</text>
<rect width="126" height="20" x="600" y="260" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="274" style="fill:black;" font-family="Arial" font-size="16px">windows</text>
<rect width="126" height="20" x="600" y="280" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="294" style="fill:black;" font-family="Arial" font-size="16px">linux</text>
<rect width="126" height="20" x="600" y="300" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="314" style="fill:black;" font-family="Arial" font-size="16px">mac</text>
<rect width="126" height="20" x="600" y="320" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="334" style="fill:black;" font-family="Arial" font-size="16px">metacritic</text>
<rect width="126" height="20" x="600" y="340" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="354" style="fill:black;" font-family="Arial" font-size="16px">developerId</text>
<rect width="126" height="20" x="600" y="360" style="fill:none;stroke:black;"/>
<text width="126" height="20" x="605" y="374" style="fill:black;" font-family="Arial" font-size="16px">posterId</text>
<rect width="113" height="20" x="370" y="60" style="fill:#007;stroke:black;"/>
<text width="113" height="20" x="375" y="74" style="fill:#fff;" font-family="Arial" font-size="16px"> game_category</text>
<rect width="113" height="20" x="370" y="80" style="fill:#aea;stroke:black;"/>
<text width="113" height="20" x="375" y="94" style="fill:black;" font-family="Arial" font-size="16px">gameId</text>
<rect width="113" height="20" x="370" y="100" style="fill:#aea;stroke:black;"/>
<text width="113" height="20" x="375" y="114" style="fill:black;" font-family="Arial" font-size="16px">categoryId</text>
<rect width="92" height="20" x="810" y="50" style="fill:#007;stroke:black;"/>
<text width="92" height="20" x="815" y="64" style="fill:#fff;" font-family="Arial" font-size="16px"> game_genre</text>
<rect width="92" height="20" x="810" y="70" style="fill:#aea;stroke:black;"/>
<text width="92" height="20" x="815" y="84" style="fill:black;" font-family="Arial" font-size="16px">gameId</text>
<rect width="92" height="20" x="810" y="90" style="fill:#aea;stroke:black;"/>
<text width="92" height="20" x="815" y="104" style="fill:black;" font-family="Arial" font-size="16px">genreId</text>
<rect width="88" height="20" x="1020" y="150" style="fill:#007;stroke:black;"/>
<text width="88" height="20" x="1025" y="164" style="fill:#fff;" font-family="Arial" font-size="16px"> genre</text>
<rect width="88" height="20" x="1020" y="170" style="fill:#aea;stroke:black;"/>
<text width="88" height="20" x="1025" y="184" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="88" height="20" x="1020" y="190" style="fill:none;stroke:black;"/>
<text width="88" height="20" x="1025" y="204" style="fill:black;" font-family="Arial" font-size="16px">description</text>
<rect width="54" height="20" x="800" y="340" style="fill:#007;stroke:black;"/>
<text width="54" height="20" x="805" y="354" style="fill:#fff;" font-family="Arial" font-size="16px"> poster</text>
<rect width="54" height="20" x="800" y="360" style="fill:#aea;stroke:black;"/>
<text width="54" height="20" x="805" y="374" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="54" height="20" x="800" y="380" style="fill:none;stroke:black;"/>
<text width="54" height="20" x="805" y="394" style="fill:black;" font-family="Arial" font-size="16px">jpeg</text>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.
+1 -1
View File
@@ -3,7 +3,7 @@
<body>
<?php
echo "<h1>hello world !!!</h1>";
//phpinfo();
phpinfo();
?>
</body>
</html>
+25
View File
@@ -6,6 +6,8 @@ $clients = [
"Arnaud"
];
var_dump($clients);
$produits = [
20 => "Chemise",
3 => "Pantalon",
@@ -23,4 +25,27 @@ print_r($clients);
print_r($produits);
print_r($array);
echo "</pre>";
// Exercice 2.1
$tab = [];
$somme = 0;
for ($i = 0; $i < 10; $i++) {
$somme += $i; // somme des entiers de 0 à i
$tab[$i] = $somme; // la clé i contient cette somme
}
print_r($tab);
// Exercice 2.2
for ($debut = 1; $debut <= 50; $debut += 10) {
echo "<p>";
for ($i = $debut; $i < $debut + 10; $i++) {
if ($i % 2 === 0) {
echo "<strong>$i</strong> ";
} else {
echo "<em>$i</em> ";
}
}
echo "</p>";
}
?>
+20 -3
View File
@@ -1,5 +1,5 @@
<?php
include './include/data.inc.php';
include_once './include/data.inc.php';
?>
<!DOCTYPE html>
<html lang="fr">
@@ -28,9 +28,26 @@ include './include/data.inc.php';
</tr>
</thead>
<tbody>
<?php include_once './include/data.inc.php'; ?>
<?php foreach ($data as $person) : ?>
<?php
$poids = (float) $person['Poids'];
$tailleM = (float) $person['Taille'] / 100;
<!-- À compléter -->
$imc = null;
if ($tailleM > 0) {
$imc = $poids / ($tailleM * $tailleM);
}
?>
<tr class="<?= $imc < 18.5 ? 'underweight' : ($imc < 25 ? 'normal' : 'warning') ?>">
<td><?= $person['Nom'] ?></td>
<td><?= $person['Prenom'] ?></td>
<td><?= $person['Email'] ?></td>
<td><?= $person['Taille'] ?></td>
<td><?= $person['Poids'] ?></td>
<td><?= round($imc, 2) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</main>
+20 -4
View File
@@ -1,3 +1,19 @@
<?php
// Generate random values for two six-sided dice.
$die1 = mt_rand(1, 6);
$die2 = mt_rand(1, 6);
$sum = $die1 + $die2;
// Map dice values to matching SVG filenames.
$diceImages = [
1 => 'dice-six-faces-one.svg',
2 => 'dice-six-faces-two.svg',
3 => 'dice-six-faces-three.svg',
4 => 'dice-six-faces-four.svg',
5 => 'dice-six-faces-five.svg',
6 => 'dice-six-faces-six.svg',
];
?>
<!DOCTYPE html>
<html lang="fr">
<head>
@@ -13,12 +29,12 @@
</head>
<body>
<main>
<h5><a href=""> Tirage aléatoire</a></h5>
<h5><a href="./">Tirage aléatoire</a></h5>
<article class="is-center">
<img src='./img/dice-six-faces-five.svg'>
<img src='./img/dice-six-faces-one.svg'>
<img src="./img/<?= $diceImages[$die1] ?>" alt="Dé 1 : <?= $die1 ?>">
<img src="./img/<?= $diceImages[$die2] ?>" alt="Dé 2 : <?= $die2 ?>">
</article>
<h5>Somme = </h5>
<h5>Somme = <?= $sum ?></h5>
</main>
</body>
</html>
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
include './include/favoris.inc.php';
include_once './include/favoris.inc.php';
?>
<!DOCTYPE html>
<html lang="fr">
+4 -4
View File
@@ -1,7 +1,7 @@
<?php
function createPassword($n,$alphabet){
$length = strlen($alphabet);
$password = "";
return $password;
function createPassword($n,$alphabet) {
$length = strlen($alphabet);
$password = "";
return $password;
}
?>
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
include './include/fonction.php';
include_once './include/fonction.php';
$alphabet = "@#!*^&azertyuiopqsdfghjkklmwxcvbnAZERTYUIOPLMKJHGFDSQWXCVBN1234567890";
?>
<!DOCTYPE html>
+6 -5
View File
@@ -1,8 +1,9 @@
<?php
include 'include/controller.php';
include_once 'include/controller.php';
?>
<!DOCTYPE html>
<html lang="en">
<html lang="fr">
<head>
<link
rel="stylesheet"
@@ -11,14 +12,14 @@ include 'include/controller.php';
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity="sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="./css/style.css">
<meta charset="UTF-8" />
<title></title>
<title>Exercice 1</title>
</head>
<body>
<main>
<ul>
<?php
echo "<li>$prenom $nom</li>";
echo "<li><i class='fa-brands $icon fa-2x'></i></li>";
echo '<li>' . htmlspecialchars($prenom . ' ' . $nom, ENT_QUOTES, 'UTF-8') . '</li>';
echo '<li>' . htmlspecialchars($systeme, ENT_QUOTES, 'UTF-8') . " <i class='fa-brands $icon fa-2x'></i></li>";
?>
</ul>
</main>
+26 -1
View File
@@ -1,2 +1,27 @@
<?php
// TODO
$nom = '';
$prenom = '';
$systeme = '';
$icon = 'fa-circle-question';
$systemes = [
1 => ['nom' => 'Linux', 'icon' => 'fa-linux'],
2 => ['nom' => 'Windows', 'icon' => 'fa-windows'],
3 => ['nom' => 'macOS', 'icon' => 'fa-apple'],
4 => ['nom' => 'Android', 'icon' => 'fa-android'],
];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nomSaisi = trim((string) filter_input(INPUT_POST, 'nom', FILTER_UNSAFE_RAW));
$prenomSaisi = trim((string) filter_input(INPUT_POST, 'prenom', FILTER_UNSAFE_RAW));
$os = filter_input(INPUT_POST, 'os', FILTER_VALIDATE_INT);
$nom = ucfirst(strtolower($nomSaisi));
$prenom = ucfirst(strtolower($prenomSaisi));
if (isset($systemes[$os])) {
$systeme = $systemes[$os]['nom'];
$icon = $systemes[$os]['icon'];
}
}
+17 -1
View File
@@ -1,2 +1,18 @@
<?php
// TODO
$table = filter_input(INPUT_GET, 'table', FILTER_VALIDATE_INT);
$lignes = [];
$messageErreur = '';
if ($table === false || $table === null) {
$messageErreur = 'Veuillez saisir un entier valide.';
} else {
for ($multiplicateur = 1; $multiplicateur <= 10; $multiplicateur++) {
$lignes[] = [
'multiplicateur' => $multiplicateur,
'resultat' => $table * $multiplicateur,
];
}
}
+27 -3
View File
@@ -1,8 +1,8 @@
<?php
include 'include/controller.php';
include_once 'include/controller.php';
?>
<!doctype html>
<html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<link
@@ -10,14 +10,38 @@ include 'include/controller.php';
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/>
<link rel="stylesheet" href="./css/style.css">
<title>Exercice 2</title>
</head>
<body>
<main>
<h4>Table de multiplication</h4>
<form method="GET">
<input type=number name="table" placeholder="table">
<input
type="number"
name="table"
placeholder="table"
value="<?php echo htmlspecialchars($table, ENT_QUOTES, 'UTF-8'); ?>"
>
<button type="submit">ENVOYER</button>
</form>
<?php if ($messageErreur !== '') : ?>
<p><?php echo htmlspecialchars($messageErreur, ENT_QUOTES, 'UTF-8'); ?></p>
<?php endif; ?>
<?php if ($table !== false && $table !== null) : ?>
<ul>
<?php foreach ($lignes as $ligne) : ?>
<li>
<?php echo htmlspecialchars((string) $table, ENT_QUOTES, 'UTF-8'); ?>
x
<?php echo htmlspecialchars((string) $ligne['multiplicateur'], ENT_QUOTES, 'UTF-8'); ?>
=
<?php echo htmlspecialchars((string) $ligne['resultat'], ENT_QUOTES, 'UTF-8'); ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</main>
</body>
</html>
+38 -13
View File
@@ -1,16 +1,16 @@
<?php
include 'include/controller.php';
include_once 'include/controller.php';
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<title></title>
<link
<title>Exercice 3</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
href="https://cdn.jsdelivr.net/npm/@picocss/pico.min.css"
/>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
@@ -18,17 +18,42 @@ include 'include/controller.php';
<h3>Calculatrice</h3>
<form method="POST">
<div class="grid">
<input placeholder="un nombre" type="number" step="any" name="op1" value ="" required>
<input
placeholder="un nombre"
type="number"
step="any"
name="op1"
value="<?php echo htmlspecialchars($valeurOp1, ENT_QUOTES, 'UTF-8'); ?>"
required
>
<select name="operation" required>
<option value="+">+</option>
<option value="-">-</option>
<option value="x">x</option>
<option value="/">/</option>
<option value="+" <?php echo $operation === '+' ? 'selected' : ''; ?>>+</option>
<option value="-" <?php echo $operation === '-' ? 'selected' : ''; ?>>-</option>
<option value="x" <?php echo $operation === 'x' ? 'selected' : ''; ?>>x</option>
<option value="/" <?php echo $operation === '/' ? 'selected' : ''; ?>>/</option>
</select>
<input placeholder="un nombre" type="number" step="any" name="op2" required>
<button type="submit" name="soumis"> Calculer</button>
</grid>
<input
placeholder="un nombre"
type="number"
step="any"
name="op2"
value="<?php echo htmlspecialchars($valeurOp2, ENT_QUOTES, 'UTF-8'); ?>"
required
>
<button type="submit" name="soumis">Calculer</button>
</div>
</form>
<?php if ($messageErreur !== '') : ?>
<p><?php echo htmlspecialchars($messageErreur, ENT_QUOTES, 'UTF-8'); ?></p>
<?php endif; ?>
<?php if ($aCalcule) : ?>
<p>
Résultat :
<?php echo htmlspecialchars($valeurOp1, ENT_QUOTES, 'UTF-8'); ?>
</p>
<?php endif; ?>
</main>
</body>
</html>
+55 -1
View File
@@ -1,2 +1,56 @@
<?php
//TODO
$op1Saisi = filter_input(INPUT_POST, 'op1', FILTER_UNSAFE_RAW);
$op2Saisi = filter_input(INPUT_POST, 'op2', FILTER_UNSAFE_RAW);
$operationSaisie = filter_input(INPUT_POST, 'operation', FILTER_UNSAFE_RAW);
$op1Saisi = is_string($op1Saisi) ? trim($op1Saisi) : '';
$op2Saisi = is_string($op2Saisi) ? trim($op2Saisi) : '';
$operationSaisie = is_string($operationSaisie) ? trim($operationSaisie) : '+';
$operationsAutorisees = ['+', '-', 'x', '/'];
$operation = in_array($operationSaisie, $operationsAutorisees, true) ? $operationSaisie : '+';
$resultat = null;
$messageErreur = '';
$aCalcule = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$op1 = filter_var($op1Saisi, FILTER_VALIDATE_FLOAT);
$op2 = filter_var($op2Saisi, FILTER_VALIDATE_FLOAT);
if ($op1 === false || $op2 === false) {
$messageErreur = 'Veuillez saisir deux nombres valides.';
} elseif (!in_array($operation, $operationsAutorisees, true)) {
$messageErreur = 'Veuillez choisir une opération valide.';
} elseif ($operation === '/' && (float) $op2 == 0.0) {
$messageErreur = 'La division par zéro est impossible.';
} else {
$aCalcule = true;
switch ($operation) {
case '+':
$resultat = $op1 + $op2;
break;
case '-':
$resultat = $op1 - $op2;
break;
case 'x':
$resultat = $op1 * $op2;
break;
case '/':
$resultat = $op1 / $op2;
break;
default:
$messageErreur = 'Veuillez choisir une opération valide.';
$aCalcule = false;
}
}
}
$valeurOp1 = $aCalcule ? (string) $resultat : $op1Saisi;
$valeurOp2 = $op2Saisi;
+10
View File
@@ -2,3 +2,13 @@ button{
float:right;
}
.bonne-reponse {
color: #1b7f3a;
font-weight: 700;
}
.mauvaise-reponse {
color: #c62828;
font-weight: 700;
}
+70 -6
View File
@@ -1,17 +1,81 @@
<?php
$nombreQuestions = 0;
$score = 0;
$questionsTraitees = 0;
$message = 'Aucun resultat a afficher.';
$resultatsParQuestion = [];
$nombreQuestionsSaisi = filter_input(INPUT_POST, 'nbq', FILTER_VALIDATE_INT);
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $nombreQuestionsSaisi !== false && $nombreQuestionsSaisi !== null) {
$nombreQuestions = $nombreQuestionsSaisi;
$message = '';
for ($index = 1; $index <= $nombreQuestions; $index++) {
$reponse = filter_input(INPUT_POST, 'question' . $index, FILTER_UNSAFE_RAW);
if ($reponse !== null) {
$questionsTraitees++;
}
if ($reponse === 'vrai') {
$score++;
$resultatsParQuestion[] = [
'numero' => $index,
'classe' => 'bonne-reponse',
'message' => 'Bonne reponse',
];
} else {
$resultatsParQuestion[] = [
'numero' => $index,
'classe' => 'mauvaise-reponse',
'message' => 'Mauvaise reponse',
];
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<html lang="fr">
<head>
<link rel="stylesheet" href="./css/style.css">
<link
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/>
<title></title>
/>
<meta charset="UTF-8" />
<title>Exercice 4</title>
</head>
<body>
<main>
<h4>Réponses</h4>
</div>
<h4>Resultat du quizz</h4>
<?php if ($message !== '') : ?>
<p><?php echo htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); ?></p>
<?php else : ?>
<p>
Vous avez obtenu
<?php echo htmlspecialchars((string) $score, ENT_QUOTES, 'UTF-8'); ?>
bonne(s) reponse(s) sur
<?php echo htmlspecialchars((string) $nombreQuestions, ENT_QUOTES, 'UTF-8'); ?>.
</p>
<p>
Questions repondues :
<?php echo htmlspecialchars((string) $questionsTraitees, ENT_QUOTES, 'UTF-8'); ?>.
</p>
<ul>
<?php foreach ($resultatsParQuestion as $resultatQuestion) : ?>
<li>
Question <?php echo htmlspecialchars((string) $resultatQuestion['numero'], ENT_QUOTES, 'UTF-8'); ?> :
<span class="<?php echo htmlspecialchars($resultatQuestion['classe'], ENT_QUOTES, 'UTF-8'); ?>">
<?php echo htmlspecialchars($resultatQuestion['message'], ENT_QUOTES, 'UTF-8'); ?>
</span>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<p>
<a href="quizz.html">Revenir au quizz</a>
</p>
</main>
</body>
</html>
+29 -7
View File
@@ -1,23 +1,45 @@
<?php
include 'include/controller.php';
include_once 'include/controller.php';
?>
<!DOCTYPE html>
<html lang="en">
<html lang="fr">
<head>
<meta charset="UTF-8" />
<link
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/>
/>
<link rel="stylesheet" href="./css/style.css">
<title></title>
<title>Exercice 5</title>
</head>
<body>
<main>
<h3>Conjugaison</h3>
<?php if ($messageErreur !== '') : ?>
<p><?php echo htmlspecialchars($messageErreur, ENT_QUOTES, 'UTF-8'); ?></p>
<?php else : ?>
<p>
Verbe :
<?php echo htmlspecialchars($verbe, ENT_QUOTES, 'UTF-8'); ?>
</p>
<?php foreach ($conjugaisons as $conjugaison) : ?>
<section>
<h4><?php echo htmlspecialchars($conjugaison['temps'], ENT_QUOTES, 'UTF-8'); ?></h4>
<ul>
<?php foreach ($conjugaison['formes'] as $forme) : ?>
<li><?php echo htmlspecialchars($forme, ENT_QUOTES, 'UTF-8'); ?></li>
<?php endforeach; ?>
</ul>
</section>
<?php endforeach; ?>
<?php endif; ?>
<p>
<a href="ex5.html">Retour au formulaire</a>
</p>
</main>
</body>
</html>
+58 -6
View File
@@ -1,12 +1,64 @@
<?php
$terminaisons = array(
"present"=>array("e","es","e","ons","ez","ent"),
"futur"=>array("erai","eras","era","erons","erez","eront"),
"imparfait"=>array("ais","ais","ait","ions","iez","aient")
'present' => array('e', 'es', 'e', 'ons', 'ez', 'ent'),
'futur' => array('erai', 'eras', 'era', 'erons', 'erez', 'eront'),
'imparfait' => array('ais', 'ais', 'ait', 'ions', 'iez', 'aient')
);
$pronoms=array("je","tu","il","nous","vous","ils");
$libellesTemps = array(
'present' => 'Present',
'futur' => 'Futur',
'imparfait' => 'Imparfait'
);
$verbe = filter_input(INPUT_POST,"verbe",FILTER_SANITIZE_STRING);
$radical = substr($verbe,0,strlen($verbe)-2);
$pronoms = array('je', 'tu', 'il', 'nous', 'vous', 'ils');
$verbeSaisi = filter_input(INPUT_POST, 'verbe', FILTER_UNSAFE_RAW);
$verbeSaisi = is_string($verbeSaisi) ? trim($verbeSaisi) : '';
$verbe = strtolower($verbeSaisi);
$tempsChoisis = filter_input(INPUT_POST, 'temps', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$tempsChoisis = is_array($tempsChoisis) ? $tempsChoisis : array();
$messageErreur = '';
$conjugaisons = array();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($verbe === '') {
$messageErreur = 'Veuillez saisir un verbe.';
} elseif (strlen($verbe) < 3 || substr($verbe, -2) !== 'er') {
$messageErreur = 'Veuillez saisir un verbe du premier groupe.';
} elseif ($tempsChoisis === array()) {
$messageErreur = 'Veuillez choisir au moins un temps.';
} else {
$radical = substr($verbe, 0, strlen($verbe) - 2);
foreach ($tempsChoisis as $temps) {
if (!isset($terminaisons[$temps], $libellesTemps[$temps])) {
continue;
}
$formes = array();
foreach ($pronoms as $index => $pronom) {
$forme = $radical . $terminaisons[$temps][$index];
if ($pronom === 'je' && preg_match('/^[aeiouh]/', $forme) === 1) {
$formes[] = "j'" . $forme;
} else {
$formes[] = $pronom . ' ' . $forme;
}
}
$conjugaisons[] = array(
'temps' => $libellesTemps[$temps],
'formes' => $formes
);
}
if ($conjugaisons === array()) {
$messageErreur = 'Aucun temps valide n a ete transmis.';
}
}
}
+3
View File
@@ -8,3 +8,6 @@ color:#2E8B57;
.Loss{
color:#FF6347;
}
.Draw{
color:#DAA520;
}
+29 -14
View File
@@ -1,20 +1,35 @@
<?php
$images = ["rock.png","paper.png","scissors.png"];
$isPlaying = true;
$ROCK = 0;
$PAPER = 1;
$SCISSORS = 2;
$playerChoice = 0;
$computerChoice = 1;
$images = ["rock.png", "paper.png", "scissors.png"];
$rules = [
$ROCK => [$ROCK => "Draw", $PAPER => "Loss", $SCISSORS => "Win"],
$PAPER => [$ROCK => "Win", $PAPER => "Draw", $SCISSORS => "Loss"],
$SCISSORS => [$ROCK => "Loss", $PAPER => "Win", $SCISSORS => "Draw"],
];
$message = "Win";
$class = "Win";
$playerChoice = filter_input(
INPUT_GET,
'choice',
FILTER_VALIDATE_INT,
['options' => ['min_range' => 0, 'max_range' => 2]]
);
$imagePlayer = $images[$playerChoice];
$imageComputer = $images[$computerChoice];
$isPlaying = ($playerChoice !== null && $playerChoice !== false);
include './views/header.php';
if ($isPlaying){
include './views/game.php';
include './views/message.php';
if ($isPlaying) {
$computerChoice = mt_rand(0, 2);
$message = $rules[$playerChoice][$computerChoice];
$class = $message;
$imagePlayer = $images[$playerChoice];
$imageComputer = $images[$computerChoice];
}
include './views/footer.php';
?>
include_once './views/header.php';
if ($isPlaying) {
include_once './views/game.php';
include_once './views/message.php';
}
include_once './views/footer.php';
+29 -6
View File
@@ -1,14 +1,37 @@
<?php
include './modeles/modeleFilms.php';
include_once './modeles/modeleFilms.php';
$films = getFilms();
$currentPage = filter_input(
INPUT_GET,
'page',
FILTER_VALIDATE_INT,
['options' => ['min_range' => 1]]
);
if ($currentPage === null || $currentPage === false) {
$currentPage = 1;
}
$perPage = 10;
$data = getFilms($currentPage, $perPage);
$films = $data['films'];
$errorMessage = $data['error'];
$totalFilms = $data['total'];
$totalPages = max(1, (int) ceil($totalFilms / $perPage));
if ($currentPage > $totalPages && $totalFilms > 0) {
$currentPage = $totalPages;
$data = getFilms($currentPage, $perPage);
$films = $data['films'];
$errorMessage = $data['error'];
$totalFilms = $data['total'];
}
//
// on "charge" la vue
//
include './vues/header.php';
include './vues/vueFilms.php';
include './vues/footer.php';
?>
include_once './vues/header.php';
include_once './vues/vueFilms.php';
include_once './vues/footer.php';
@@ -1,16 +1,69 @@
<?php
function _getConnection()
function getConnection()
{
static $_conn = NULL;
if ($_conn === NULL){
$_conn = mysqli_connect("localhost","","","");
static $conn = null;
if ($conn === null) {
$host = getenv('DB_HOST') ?: 'https://dwarves.iut-fbleau.fr';
$login = getenv('DB_USER') ?: getenv('USER') ?: getenv('USERNAME') ?: 'root';
$password = getenv('DB_PASSWORD') ?: $login;
$database = getenv('DB_NAME') ?: $login;
$conn = mysqli_connect($host, $login, $password, $database);
if ($conn !== false) {
mysqli_set_charset($conn, 'utf8mb4');
}
return $_conn;
}
return $conn;
}
function getFilms()
function getFilms($page = 1, $perPage = 10)
{
// A completer
$conn = getConnection();
if ($conn === false) {
return [
'films' => [],
'total' => 0,
'error' => 'Connexion MySQL impossible.',
];
}
$page = max(1, (int) $page);
$perPage = max(1, (int) $perPage);
$offset = ($page - 1) * $perPage;
$sql = "SELECT SQL_CALC_FOUND_ROWS
F.idFilm,
F.titre,
F.annee,
G.code AS genre,
A.prenom,
A.nom
FROM Film AS F
INNER JOIN Artiste AS A ON F.idMes = A.idArtiste
INNER JOIN Genre AS G ON F.genre = G.code
ORDER BY F.titre ASC
LIMIT {$offset}, {$perPage}";
$result = mysqli_query($conn, $sql);
if ($result === false) {
return [
'films' => [],
'total' => 0,
'error' => 'Exécution de la requête impossible.',
];
}
$films = mysqli_fetch_all($result, MYSQLI_ASSOC);
$totalResult = mysqli_query($conn, 'SELECT FOUND_ROWS() AS total');
$totalRow = $totalResult ? mysqli_fetch_assoc($totalResult) : ['total' => 0];
$total = isset($totalRow['total']) ? (int) $totalRow['total'] : 0;
return [
'films' => $films,
'total' => $total,
'error' => null,
];
}
?>
+38 -6
View File
@@ -4,6 +4,9 @@
-->
<h2>Films</h2>
<?php if (!empty($errorMessage)) { ?>
<article><?php echo htmlspecialchars($errorMessage, ENT_QUOTES, 'UTF-8'); ?></article>
<?php } ?>
<table>
<thead>
<tr>
@@ -15,18 +18,47 @@
</thead>
<tbody>
<?php
foreach($films as $film){
foreach ($films as $film) {
$titre = htmlspecialchars($film['titre'], ENT_QUOTES, 'UTF-8');
$annee = htmlspecialchars((string) $film['annee'], ENT_QUOTES, 'UTF-8');
$genre = htmlspecialchars($film['genre'], ENT_QUOTES, 'UTF-8');
$realisateur = htmlspecialchars($film['prenom'] . ' ' . $film['nom'], ENT_QUOTES, 'UTF-8');
echo "
<tr>
<td><a href='#'>{$film['titre']}</a></td>
<td>{$film['annee']}</td>
<td>{$film['genre']}</td>
<td>{$film['prenom']} {$film['nom']}</td>
<td><a href='#'>{$titre}</a></td>
<td>{$annee}</td>
<td>{$genre}</td>
<td>{$realisateur}</td>
</tr>";
}
?>
</tbody>
</table>
<?php if ($totalPages > 1) { ?>
<nav>
<ul>
<li>
<?php if ($currentPage > 1) { ?>
<a href="?page=<?php echo $currentPage - 1; ?>">Précédent</a>
<?php } else { ?>
<span>Précédent</span>
<?php } ?>
</li>
</ul>
<ul>
<li>Page <?php echo $currentPage; ?> / <?php echo $totalPages; ?></li>
</ul>
<ul>
<li>
<?php if ($currentPage < $totalPages) { ?>
<a href="?page=<?php echo $currentPage + 1; ?>">Suivant</a>
<?php } else { ?>
<span>Suivant</span>
<?php } ?>
</li>
</ul>
</nav>
<?php } ?>
+76
View File
@@ -0,0 +1,76 @@
# TP4 : Cookies et sessions en PHP.
### Ex1.
Complétez le script `index.php` de l'exercice 1 de manière à
mémoriser grâce à un cookie votre os préféré (parmi Linux, Windows et
MacOS). Le cookie est valable pendant une minute, et l'os par
défaut est Linux.
![](./img/cookie.png)
### Ex2.
Le but est de créer un min-jeu de morpion.
![](./img/ttt.png)
Les variables de session :
- `grid` : le plateau du jeu. tableau de 9 cases, prennant les valeurs 0 (libre), 1 (joueur 1), 2 (joueur 2).
- `playerTurn` : le joueur qui joue.
Le script prend en paramètre la variable `pos` : la position du coup joué par le joueur.
### Ex3.
On désire rendre les pages du [tp3](./../tp3) (cinema) accessibles
uniquement à des utilisateur **inscrits au préalable**.
1. Rajouter à la base une table `user` qui comprend un **login**,
**email** et un **password**. (login est la clé)
2. Ecrire un formulaire d'inscription au site qui comprend les
champs correspondants. Vous enregistrerez dans la base la mot de
passe hashé avec la fonction
[password\_hash](http://php.net/manual/fr/function.password-hash.php)
de php.
3. Faire en sorte que toutes les pages de l'application soient
accessibles **uniquement** si l'utilisateur s'est authentifié.
(utiliser une session)
Ecrire les scripts ou pages suivants
<dl>
<dt><code>inscription.php</code></dt>
<dd>formulaire d'inscription, et qui traite les données du formulaire.
Si le formulaire n'est pas correctement rempli, Il est réaffiché.
(les champs correctes sont conservés !)</dd>
<dt><code>authentification.html</code></dt>
<dd>formulaire d'authentification.</dd>
<dt><code>verification.php</code></dt>
<dd>traite le formulaire précédent et vérifie si l'utilisateur est
enregistré. En cas de succés, renvoie vers la page d'accueil du
site. Pour éviter des attaques force brute, ajoutez une
temporisation qui ralentira de telles attaques.</dd>
<dt><code>securite.php</code></dt>
<dd>morceau de code que vous inclurez systématiquement dans vos pages
que vous voulez rendre accessible uniquement aux utilisateurs dûment
authentifiés. Ce script vérifiera l'existence d'une variable de
session créée lors de la connexion.</dd>
</dl>
Pour permettre l'authentification d'un utilisateur, il faut que
login et le mot de passe conviennent. On compare le hash de
l'utilisateur stocké dans la base avec le hashage calculé du
password soumis lors de l'authentification :
```php
<?php
// Voir l'exemple fourni sur la page de la fonction password_hash()
// pour savoir d'où cela provient.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Le mot de passe est valide !';
} else {
echo 'Le mot de passe est invalide.';
}
?>
```
+6
View File
@@ -0,0 +1,6 @@
<?php
$osSet = ['linux','apple','windows'];
$os = "linux";
include './views/main.php';
?>
+44
View File
@@ -0,0 +1,44 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<main class="container">
<form method="POST">
<fieldset class="grid">
<legend>Changez votre os</legend>
<label>
<input type="radio" name="os" value="linux">
<i class="fa fa-linux fa-2x" aria-hidden="true"></i>
</label>
<label>
<input type="radio" name="os" value="windows">
<i class="fa fa-windows fa-2x" aria-hidden="true"></i>
</label>
<label>
<input type="radio" name="os" value="apple">
<i class="fa fa-apple fa-2x" aria-hidden="true"></i>
</label>
</fieldset>
<button type="submit">Envoyer</button>
</form>
<article>
<header>Votre os</header>
<?php echo "<i class='fa fa-$os fa-5x'></i>";?>
<footer>
Rafraîchir la page <a href=""><i class="fa fa-refresh" aria-hidden="true"></i></a>
</footer>
</article>
</main>
</body>
</html>
+32
View File
@@ -0,0 +1,32 @@
table.morpion{
border-collapse: collapse;
table-layout:fixed;
margin-left:auto;
margin-right:auto;
display:inline-block;
width:auto;
}
table.morpion td {
border : 1px solid #aaaaaa;
width:10rem;
height:10rem;
padding : 0px;
margin:0px;
overflow: hidden;
white-space: nowrap;
text-align:center;
vertical-align:middle;
}
table.morpion i {
font-size:8rem;
}
table.morpion a {
display : inline-block;
width : 8rem;
height: 8rem;
}
.center{
text-align:center;
}
+54
View File
@@ -0,0 +1,54 @@
<?php
function isWinner($grid, $player)
{
$winStates = array
(
array(0, 1, 2), array(3, 4, 5), array(6, 7, 8), // Horizontal
array(0, 3, 6), array(1, 4, 7), array(2, 5, 8), // Vertical
array(0, 4, 8), array(2, 4, 6) // Diagonal
);
foreach ($winStates as $winState)
{
if ($grid[$winState[0]] == $player &&
$grid[$winState[1]] == $player &&
$grid[$winState[2]] == $player)
{
return true;
}
}
return false;
}
function noWinner($grid)
{
for($i = 0; $i < 9; $i++)
if ($grid[$i] == 0)
return false;
return true;
}
function displayGrid($grid)
{
echo '<table class="morpion">';
for ($i = 0; $i < 3; $i ++){
echo "<tr>";
for ($j = 0; $j < 3; $j ++){
echo "<td>";
$pos = 3*$i + $j;
if ($grid[$pos] == 0)
echo "<a href='?pos=$pos'></a>";
if ($grid[$pos] == 1)
echo '<i class="fa fa-times" aria-hidden="true"></i>';
if ($grid[$pos] == 2)
echo '<i class="fa fa-circle-o" aria-hidden="true"></i>';
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
}
+11
View File
@@ -0,0 +1,11 @@
<?php
include 'helpers.php';
// view variables
$message = "";
$grid = [0,1,0,1,0,2,2,0,0];
$playerTurn = 1; // 1 or 2
include './views/tictactoe.php';
+24
View File
@@ -0,0 +1,24 @@
<html>
<head>
<meta charset="UTF-8">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
<link rel="stylesheet" href="./css/style.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<main class="container center">
<h4>Tic Tac Toe : <?php echo "player $playerTurn turn";?></h4>
<?php
displayGrid($grid);
if ($message != "")
echo "<h5>$message <a href='.'>new game</a></h5>";
?>
</main>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.
+77
View File
@@ -0,0 +1,77 @@
# TP5 : prise en main de codeigniter
## Installation
Téléchargez les sources de [codeigniter v3](https://github.com/pocketarc/codeigniter) (il s'agit d'un fork qui évite certains
porblèmes de compatibilité avec des versions récentes de php), et placez les dans votre
`public_html`.
1. Importez dans votre base de données la table [todo.sql](src/sql/todo.sql)
2. Copiez le repertoire [assets](src/assets) à la racine de votre application.
3. Copiez les [contrôleurs](src/ci), [modèles](src/ci) et [vues](src/ci) dans votre application.
4. Configurez les paramètres nécessaires à codeigniter :
- `config/config.php`
- `config/database.php`
```php
$config['base_url']='/~login/chemin/vers/codeigniter';
```
Vous devriez obtenir une application `todolist` fonctionnelle à l'url :
```
https://dwarves.iut-fbleau.fr/~login/chemin/vers/codeigniter/index.php/todo
```
![todo](img/todo.png)
## Suppression des tâches
Modifiez le code pour la suppression des tâches.
## Edition des tâches
Modifiez le code (contrôleur et modèle) pour l'édition des tâches.
## Tri de la todolist
Ajoutez la possibilité de trier la todolist par ordre (croissant/décroissant) alphabètique
## Créer sa propre classe controller
Il est possible de redefinir, ou d'étendre les classes systèmes dans votre répertoire `application/core`. Par exemple, pour étendre la classe
controller de codeigniter, vous pouvez écrire votre propre classe `MY_Controller.php`
```php
class MY_Controller extends CI_Controller {
}
```
Utilisez ce moyen pour définir une nouvelle méthode render, qui permet d'utiliser un layout quelconque pour afficher une vue.
## Création de compte
1. Ajoutez dans votre de base de données une table `user`, qui permettra de stocker des utilisateurs.
attributs : nom, prenom, email (clé primaire), password.
2. Complétez le contrôleur de création de compte. On rappelle que la base de données doit contenir un hash du mot de passe (cf tp4).
```php
<?php
/**
* We just want to hash our password using the current DEFAULT algorithm.
* This is presently BCRYPT, and will produce a 60 character result.
*
* Beware that DEFAULT may change over time, so you would want to prepare
* By allowing your storage to expand past 60 characters (255 would be good)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>
```
```php
<?php
// Voir l'exemple fourni sur la page de la fonction password_hash()
// pour savoir d'où cela provient.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Le mot de passe est valide !';
} else {
echo 'Le mot de passe est invalide.';
}
?>
```
3. Ajoutez un formulaire d'authentification.
4. Utilisez une session pour proteger l'accès à la todolist par authentification.
5. Ajouter à la table todo un lien vers la table user, et modifez l'ensemble de l'application pour que
chaque utilisateur possède sa propre todolist.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+13
View File
@@ -0,0 +1,13 @@
.action{
text-align : right;
}
.action a {
margin-right : 1rem;
}
table {
font-size : 1.5rem;
}
body {
padding : 2rem;
}
+64
View File
@@ -0,0 +1,64 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Todo extends CI_Controller {
public $filter = 'all';
public function __construct()
{
parent::__construct();
$this->load->helper('html');
$this->load->helper('url');
$this->load->helper('form');
$this->load->model('model_todo');
$this->filter = $this->input->get('filter') ?? 'all';
}
public function index()
{
$todos = $this->model_todo->getTodos($this->filter);
$this->load->view('layout/header');
$this->load->view('todos',['todos'=>$todos,'filter'=>$this->filter]);
$this->load->view('layout/footer');
}
public function delete($id)
{
// TODO
}
public function toggle($id)
{
$this->model_todo->toggleTodo($id);
redirect('/todo');
}
public function add()
{
$todo = ['text'=>$this->input->post('todo'),'done'=>0];
$this->model_todo->addTodo($todo);
$todos = $this->model_todo->getTodos();
$this->index();
}
public function edit($id)
{
$this->load->library('form_validation');
$this->load->model('model_todo');
$todo = $this->model_todo->getTodo($id);
$this->form_validation->set_rules('todo', 'Todo', 'required');
if ($this->form_validation->run() === FALSE){
$this->load->view('layout/header');
$this->load->view('edit',['todo'=>$todo]);
$this->load->view('layout/footer');
}else{
// TODO
}
}
}
+35
View File
@@ -0,0 +1,35 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class User extends CI_Controller {
public function create()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('nom', 'Nom', 'required');
$this->form_validation->set_rules('prenom', 'Prénom', 'required');
$this->form_validation->set_rules('email', 'Adresse mail', 'valid_email');
$this->form_validation->set_rules('password', 'current password', 'min_length[5]|required');
$this->form_validation->set_rules('cpassword', 'confirm password', 'required|matches[password]');
if ($this->form_validation->run() === FALSE){
$this->load->view('layout/header');
$this->load->view('create_user_form');
$this->load->view('layout/footer');
}else{
//
// TODO
//
}
}
public function auth()
{
//
// TODO
//
}
}
+57
View File
@@ -0,0 +1,57 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Model_todo extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function deleteTodo($id)
{
$this->db->delete('todo',['id'=>$id]);
}
public function getTodos($filter='all')
{
$where_filter = ["done" => 1, "active" => 0, "all" => "%"];
return $this
->db
->query("SELECT * FROM todo WHERE done LIKE ?",[$where_filter[$filter]])
->result();
}
public function toggleTodo($id){
/* en utilisant Query Builder class
* $this
->db
->set('done','1-done',false)
->where('id',$id)
->update('todo');
*/
$sql = "UPDATE todo SET done = 1 - done WHERE id = ?";
$this
->db
->query($sql,[$id]);
}
public function editTodo($id,$text)
{
// TODO
}
public function getTodo($id){
$sql = "SELECT * FROM todo where id = ?";
return $this
->db
->query($sql,[$id])->row();
}
public function addTodo($todo)
{
$this->db->insert('todo', $todo);
return $this
->db
->insert_id();
}
}
@@ -0,0 +1,33 @@
<?=validation_errors(); ?>
<?=form_open('user/create')?>
<!-- Grid -->
<div class="grid">
<!-- Markup example 1: input is inside label -->
<label for="prenom">
Prénom
<input type="text" id="prenom" name="prenom" placeholder="Prénom" value="<?=set_value('prenom')?>"required>
</label>
<label for="nom">
Nom
<input type="text" id="nom" name="nom" placeholder="nom" value="<?=set_value('nom')?>" required>
</label>
</div>
<!-- Markup example 2: input is after label -->
<label for="email">Adresse mail</label>
<input type="email" id="email" name="email" placeholder="Email" value="<?=set_value('email')?>" required>
<div class="grid">
<label for="password">Password
<input type="password" id="password" name="password" placeholder="Password" value="<?=set_value('password')?>" required>
</label>
<label for="password">Confirmation password
<input type="password" id="cpassword" name="cpassword" placeholder="Password" value="<?=set_value('cpassword')?>" required>
</label>
</div>
<!-- Button -->
<button type="submit">Submit</button>
</form>
+13
View File
@@ -0,0 +1,13 @@
<article>
<?php echo form_open("/todo/edit/{$todo->id}");?>
<form>
<label for="email">Todo
<input type="text" name="todo" value="<?=set_value('todo',$todo->text)?>" required>
</label>
<!-- Button -->
<button type="submit">Submit</button>
</form>
</article>
@@ -0,0 +1,3 @@
</main>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More