3 Commits

Author SHA1 Message Date
JARNOUEN DE VILLARTAY Ulysse (SAFRAN AIRCRAFT ENGINES) 17a16feb2d ex3 2026-04-15 16:20:11 +02:00
JARNOUEN DE VILLARTAY Ulysse (SAFRAN AIRCRAFT ENGINES) 553b30bdcc tp4 ex2 2026-04-15 16:06:48 +02:00
JARNOUEN DE VILLARTAY Ulysse (SAFRAN AIRCRAFT ENGINES) 74ebab4b24 tp4 ex1 2026-04-15 16:03:11 +02:00
58 changed files with 754 additions and 1482 deletions
+4
View File
@@ -0,0 +1,4 @@
CINEMA_DB_HOST=dwarves.iut-fbleau.fr
CINEMA_DB_USER=foo
CINEMA_DB_PASSWORD=foo
CINEMA_DB_NAME=foo
+1
View File
@@ -328,3 +328,4 @@ TSWLatexianTemp*
# Uncomment the next line to have this generated file ignored. # Uncomment the next line to have this generated file ignored.
#*Notes.bib #*Notes.bib
.env
-2
View File
@@ -35,8 +35,6 @@ Les notions suivantes seront abordées :
| 3 | [Intéractions avec le client](./cours/cm_interaction_client_serveur.pdf) | [tp2](./tp/tp2) | | 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) | | 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) | | 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) | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
-57
View File
@@ -1,57 +0,0 @@
## 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
@@ -1,119 +0,0 @@
# 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
@@ -1,108 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.
+6 -6
View File
@@ -1,9 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<body> <body>
<?php <?php
echo "<h1>hello world !!!</h1>"; echo "<h1>hello world !!!</h1>";
phpinfo(); //phpinfo();
?> ?>
</body> </body>
</html> </html>
+10 -35
View File
@@ -1,19 +1,17 @@
<?php <?php
$clients = [ $clients = [
"Luc", "Luc",
7 => "Paul", 7 => "Paul",
2 =>"Martin", 2 =>"Martin",
"Arnaud" "Arnaud"
]; ];
var_dump($clients);
$produits = [ $produits = [
20 => "Chemise", 20 => "Chemise",
3 => "Pantalon", 3 => "Pantalon",
10 => "Jupe", 10 => "Jupe",
"Veste", "Veste",
"Blouson" "Blouson"
]; ];
$array = ["a","b","c"]; $array = ["a","b","c"];
$array[] = "d"; $array[] = "d";
@@ -25,27 +23,4 @@ print_r($clients);
print_r($produits); print_r($produits);
print_r($array); print_r($array);
echo "</pre>"; 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>";
}
?> ?>
+32 -49
View File
@@ -1,55 +1,38 @@
<?php <?php
include_once './include/data.inc.php'; include './include/data.inc.php';
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>tp1 - ex3</title> <title>tp1 - ex3</title>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
> >
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
</head> </head>
<body> <body>
<main> <main>
<h2>Exercice 3 : IMC </h2> <h2>Exercice 3 : IMC </h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>Nom</th> <th>Nom</th>
<th>Prénom</th> <th>Prénom</th>
<th>Email</th> <th>Email</th>
<th>Taille</th> <th>Taille</th>
<th>Poids</th> <th>Poids</th>
<th>IMC</th> <th>IMC</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php include_once './include/data.inc.php'; ?>
<?php foreach ($data as $person) : ?>
<?php
$poids = (float) $person['Poids'];
$tailleM = (float) $person['Taille'] / 100;
$imc = null; <!-- À compléter -->
if ($tailleM > 0) {
$imc = $poids / ($tailleM * $tailleM); </tbody>
} </table>
?> </main>
<tr class="<?= $imc < 18.5 ? 'underweight' : ($imc < 25 ? 'normal' : 'warning') ?>"> </body>
<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>
</body>
</html> </html>
+4 -20
View File
@@ -1,19 +1,3 @@
<?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> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
<head> <head>
@@ -29,12 +13,12 @@ $diceImages = [
</head> </head>
<body> <body>
<main> <main>
<h5><a href="./">Tirage aléatoire</a></h5> <h5><a href=""> Tirage aléatoire</a></h5>
<article class="is-center"> <article class="is-center">
<img src="./img/<?= $diceImages[$die1] ?>" alt="Dé 1 : <?= $die1 ?>"> <img src='./img/dice-six-faces-five.svg'>
<img src="./img/<?= $diceImages[$die2] ?>" alt="Dé 2 : <?= $die2 ?>"> <img src='./img/dice-six-faces-one.svg'>
</article> </article>
<h5>Somme = <?= $sum ?></h5> <h5>Somme = </h5>
</main> </main>
</body> </body>
</html> </html>
+2 -2
View File
@@ -1,5 +1,5 @@
<?php <?php
include_once './include/favoris.inc.php'; include './include/favoris.inc.php';
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
@@ -17,7 +17,7 @@ include_once './include/favoris.inc.php';
<body> <body>
<main> <main>
<h2> <h2>
Exercice 4 : Favoris Exercice 4 : Favoris
</h2> </h2>
<!-- À compléter --> <!-- À compléter -->
+4 -4
View File
@@ -1,7 +1,7 @@
<?php <?php
function createPassword($n,$alphabet) { function createPassword($n,$alphabet){
$length = strlen($alphabet); $length = strlen($alphabet);
$password = ""; $password = "";
return $password; return $password;
} }
?> ?>
+1 -1
View File
@@ -1,5 +1,5 @@
<?php <?php
include_once './include/fonction.php'; include './include/fonction.php';
$alphabet = "@#!*^&azertyuiopqsdfghjkklmwxcvbnAZERTYUIOPLMKJHGFDSQWXCVBN1234567890"; $alphabet = "@#!*^&azertyuiopqsdfghjkklmwxcvbnAZERTYUIOPLMKJHGFDSQWXCVBN1234567890";
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
+17 -18
View File
@@ -1,27 +1,26 @@
<?php <?php
include_once 'include/controller.php'; include 'include/controller.php';
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en">
<html lang="fr"> <head>
<head>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/> />
<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="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"> <link rel="stylesheet" href="./css/style.css">
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>Exercice 1</title> <title></title>
</head> </head>
<body> <body>
<main> <main>
<ul> <ul>
<?php <?php
echo '<li>' . htmlspecialchars($prenom . ' ' . $nom, ENT_QUOTES, 'UTF-8') . '</li>'; echo "<li>$prenom $nom</li>";
echo '<li>' . htmlspecialchars($systeme, ENT_QUOTES, 'UTF-8') . " <i class='fa-brands $icon fa-2x'></i></li>"; echo "<li><i class='fa-brands $icon fa-2x'></i></li>";
?> ?>
</ul> </ul>
</main> </main>
</body> </body>
</html> </html>
+1 -26
View File
@@ -1,27 +1,2 @@
<?php <?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'];
}
}
+1 -17
View File
@@ -1,18 +1,2 @@
<?php <?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,
];
}
}
+19 -43
View File
@@ -1,47 +1,23 @@
<?php <?php
include_once 'include/controller.php'; include 'include/controller.php';
?> ?>
<!doctype html> <!doctype html>
<html lang="fr"> <html>
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/> />
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
<title>Exercice 2</title> </head>
</head> <body>
<body> <main>
<main> <h4>Table de multiplication</h4>
<h4>Table de multiplication</h4> <form method="GET">
<form method="GET"> <input type=number name="table" placeholder="table">
<input <button type="submit">ENVOYER</button>
type="number" </form>
name="table" </main>
placeholder="table" </body>
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> </html>
+28 -53
View File
@@ -1,59 +1,34 @@
<?php <?php
include_once 'include/controller.php'; include 'include/controller.php';
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>Exercice 3</title> <title></title>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/> />
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
</head> </head>
<body> <body>
<main class="container"> <main class="container">
<h3>Calculatrice</h3> <h3>Calculatrice</h3>
<form method="POST"> <form method="POST">
<div class="grid"> <div class="grid">
<input <input placeholder="un nombre" type="number" step="any" name="op1" value ="" required>
placeholder="un nombre" <select name="operation" required>
type="number" <option value="+">+</option>
step="any" <option value="-">-</option>
name="op1" <option value="x">x</option>
value="<?php echo htmlspecialchars($valeurOp1, ENT_QUOTES, 'UTF-8'); ?>" <option value="/">/</option>
required </select>
> <input placeholder="un nombre" type="number" step="any" name="op2" required>
<select name="operation" required> <button type="submit" name="soumis"> Calculer</button>
<option value="+" <?php echo $operation === '+' ? 'selected' : ''; ?>>+</option> </grid>
<option value="-" <?php echo $operation === '-' ? 'selected' : ''; ?>>-</option> </form>
<option value="x" <?php echo $operation === 'x' ? 'selected' : ''; ?>>x</option> </main>
<option value="/" <?php echo $operation === '/' ? 'selected' : ''; ?>>/</option> </body>
</select>
<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> </html>
+1 -55
View File
@@ -1,56 +1,2 @@
<?php <?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,13 +2,3 @@ button{
float:right; float:right;
} }
.bonne-reponse {
color: #1b7f3a;
font-weight: 700;
}
.mauvaise-reponse {
color: #c62828;
font-weight: 700;
}
+15 -79
View File
@@ -1,81 +1,17 @@
<?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> <!DOCTYPE html>
<html lang="fr"> <html lang="en">
<head> <head>
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/> />
<meta charset="UTF-8" /> <title></title>
<title>Exercice 4</title> </head>
</head> <body>
<body> <main>
<main> <h4>Réponses</h4>
<h4>Resultat du quizz</h4> </div>
<?php if ($message !== '') : ?> </main>
<p><?php echo htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); ?></p> </body>
<?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> </html>
+15 -37
View File
@@ -1,45 +1,23 @@
<?php <?php
include_once 'include/controller.php'; include 'include/controller.php';
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"
/> />
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
<title>Exercice 5</title>
</head>
<body>
<main>
<h3>Conjugaison</h3>
<?php if ($messageErreur !== '') : ?> <title></title>
<p><?php echo htmlspecialchars($messageErreur, ENT_QUOTES, 'UTF-8'); ?></p> </head>
<?php else : ?> <body>
<p> <main>
Verbe :
<?php echo htmlspecialchars($verbe, ENT_QUOTES, 'UTF-8'); ?>
</p>
<?php foreach ($conjugaisons as $conjugaison) : ?> </main>
<section> </body>
<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> </html>
+6 -58
View File
@@ -1,64 +1,12 @@
<?php <?php
$terminaisons = array( $terminaisons = array(
'present' => array('e', 'es', 'e', 'ons', 'ez', 'ent'), "present"=>array("e","es","e","ons","ez","ent"),
'futur' => array('erai', 'eras', 'era', 'erons', 'erez', 'eront'), "futur"=>array("erai","eras","era","erons","erez","eront"),
'imparfait' => array('ais', 'ais', 'ait', 'ions', 'iez', 'aient') "imparfait"=>array("ais","ais","ait","ions","iez","aient")
); );
$libellesTemps = array( $pronoms=array("je","tu","il","nous","vous","ils");
'present' => 'Present',
'futur' => 'Futur',
'imparfait' => 'Imparfait'
);
$pronoms = array('je', 'tu', 'il', 'nous', 'vous', 'ils'); $verbe = filter_input(INPUT_POST,"verbe",FILTER_SANITIZE_STRING);
$radical = substr($verbe,0,strlen($verbe)-2);
$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,6 +8,3 @@ color:#2E8B57;
.Loss{ .Loss{
color:#FF6347; color:#FF6347;
} }
.Draw{
color:#DAA520;
}
+14 -29
View File
@@ -1,35 +1,20 @@
<?php <?php
$ROCK = 0; $images = ["rock.png","paper.png","scissors.png"];
$PAPER = 1; $isPlaying = true;
$SCISSORS = 2;
$images = ["rock.png", "paper.png", "scissors.png"]; $playerChoice = 0;
$rules = [ $computerChoice = 1;
$ROCK => [$ROCK => "Draw", $PAPER => "Loss", $SCISSORS => "Win"],
$PAPER => [$ROCK => "Win", $PAPER => "Draw", $SCISSORS => "Loss"],
$SCISSORS => [$ROCK => "Loss", $PAPER => "Win", $SCISSORS => "Draw"],
];
$playerChoice = filter_input( $message = "Win";
INPUT_GET, $class = "Win";
'choice',
FILTER_VALIDATE_INT,
['options' => ['min_range' => 0, 'max_range' => 2]]
);
$isPlaying = ($playerChoice !== null && $playerChoice !== false); $imagePlayer = $images[$playerChoice];
$imageComputer = $images[$computerChoice];
if ($isPlaying) { include './views/header.php';
$computerChoice = mt_rand(0, 2); if ($isPlaying){
$message = $rules[$playerChoice][$computerChoice]; include './views/game.php';
$class = $message; include './views/message.php';
$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';
+8
View File
@@ -19,6 +19,14 @@ SET time_zone = "+00:00";
-- -------------------------------------------------------- -- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
login VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
PRIMARY KEY (login)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --
-- Table structure for table `Artiste` -- Table structure for table `Artiste`
-- --
@@ -0,0 +1,46 @@
<?php
$login = isset($_GET['login']) ? trim($_GET['login']) : '';
$error = isset($_GET['error']);
$registered = isset($_GET['registered']);
$loggedOut = isset($_GET['logged_out']);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Authentification</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
</head>
<body>
<main class="container">
<h1>Authentification</h1>
<?php if ($registered) { ?>
<article>Inscription réussie. Vous pouvez maintenant vous connecter.</article>
<?php } ?>
<?php if ($loggedOut) { ?>
<article>Vous avez été déconnecté.</article>
<?php } ?>
<?php if ($error) { ?>
<article aria-invalid="true">Login ou mot de passe incorrect.</article>
<?php } ?>
<form action="./verification.php" method="post">
<label for="login">Login</label>
<input id="login" name="login" value="<?php echo htmlspecialchars($login, ENT_QUOTES); ?>">
<label for="password">Mot de passe</label>
<input id="password" name="password" type="password">
<button type="submit">Se connecter</button>
</form>
<p><a href="./inscription.php">Créer un compte</a></p>
</main>
</body>
</html>
+14
View File
@@ -0,0 +1,14 @@
<?php
session_start();
$_SESSION = array();
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 3600, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
session_destroy();
header('Location: ./authentification.php?logged_out=1');
exit;
+3 -26
View File
@@ -1,34 +1,11 @@
<?php <?php
include_once './securite.php';
include_once './modeles/modeleFilms.php'; include_once './modeles/modeleFilms.php';
$currentPage = filter_input( $films = getFilms();
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 // On charge les fichiers de vue une fois les données prêtes.
// //
include_once './vues/header.php'; include_once './vues/header.php';
+98
View File
@@ -0,0 +1,98 @@
<?php
session_start();
include_once './modeles/modeleUtilisateurs.php';
$errors = array();
$values = array(
'login' => '',
'email' => '',
);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$values['login'] = isset($_POST['login']) ? trim($_POST['login']) : '';
$values['email'] = isset($_POST['email']) ? trim($_POST['email']) : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
// On valide champ par champ pour pouvoir réafficher proprement le formulaire.
if ($values['login'] === '') {
$errors['login'] = 'Le login est obligatoire.';
} elseif (!preg_match('/^[a-zA-Z0-9_-]{3,30}$/', $values['login'])) {
$errors['login'] = 'Le login doit contenir entre 3 et 30 caractères alphanumériques, _ ou -.';
}
if ($values['email'] === '') {
$errors['email'] = 'L\'email est obligatoire.';
} elseif (!filter_var($values['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Le format de l\'email est invalide.';
}
if ($password === '') {
$errors['password'] = 'Le mot de passe est obligatoire.';
} elseif (strlen($password) < 8) {
$errors['password'] = 'Le mot de passe doit contenir au moins 8 caractères.';
}
if ($values['login'] !== '' && findUserByLogin($values['login']) !== null) {
$errors['login'] = 'Ce login est déjà utilisé.';
}
if (empty($errors)) {
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
createUser($values['login'], $values['email'], $passwordHash);
header('Location: ./authentification.php?registered=1');
exit;
}
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Inscription</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
</head>
<body>
<main class="container">
<h1>Inscription</h1>
<p>Créez un compte avant d'accéder aux pages du site.</p>
<form method="post">
<label for="login">Login</label>
<input
id="login"
name="login"
value="<?php echo htmlspecialchars($values['login'], ENT_QUOTES); ?>"
>
<?php if (isset($errors['login'])) { ?>
<small><?php echo htmlspecialchars($errors['login'], ENT_QUOTES); ?></small>
<?php } ?>
<label for="email">Email</label>
<input
id="email"
name="email"
type="email"
value="<?php echo htmlspecialchars($values['email'], ENT_QUOTES); ?>"
>
<?php if (isset($errors['email'])) { ?>
<small><?php echo htmlspecialchars($errors['email'], ENT_QUOTES); ?></small>
<?php } ?>
<label for="password">Mot de passe</label>
<input id="password" name="password" type="password">
<?php if (isset($errors['password'])) { ?>
<small><?php echo htmlspecialchars($errors['password'], ENT_QUOTES); ?></small>
<?php } ?>
<button type="submit">S'inscrire</button>
</form>
<p><a href="./authentification.php">Déjà inscrit ? Se connecter</a></p>
</main>
</body>
</html>
@@ -0,0 +1,33 @@
<?php
function getConnection()
{
static $conn = null;
if ($conn !== null) {
return $conn;
}
// On autorise deux modes de configuration :
// 1) via des variables d'environnement ;
// 2) en remplaçant directement les valeurs par votre login/mot de passe.
$host = getenv('CINEMA_DB_HOST') ? getenv('CINEMA_DB_HOST') : 'localhost';
$user = getenv('CINEMA_DB_USER') ? getenv('CINEMA_DB_USER') : '';
$password = getenv('CINEMA_DB_PASSWORD') ? getenv('CINEMA_DB_PASSWORD') : '';
$database = getenv('CINEMA_DB_NAME') ? getenv('CINEMA_DB_NAME') : '';
if ($user === '' || $database === '') {
die(
"Configurez d'abord l'accès MySQL dans modeles/connexion.php " .
"ou via les variables d'environnement CINEMA_DB_HOST, CINEMA_DB_USER, CINEMA_DB_PASSWORD et CINEMA_DB_NAME."
);
}
var_dump($host, $user, $password, $database);
$conn = mysqli_connect($host, $user, $password, $database, 3306);
if ($conn === false) {
die('Connexion MySQL impossible : ' . mysqli_connect_error());
}
mysqli_set_charset($conn, 'utf8mb4');
return $conn;
}
+16 -57
View File
@@ -1,69 +1,28 @@
<?php <?php
function getConnection() include_once __DIR__ . '/connexion.php';
{
static $conn = null;
if ($conn === null) { function getFilms()
$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;
}
function getFilms($page = 1, $perPage = 10)
{ {
$conn = getConnection(); $conn = getConnection();
if ($conn === false) { $sql = "
return [ SELECT Film.idFilm, Film.titre, Film.annee, Genre.code AS genre, Artiste.nom, Artiste.prenom
'films' => [], FROM Film
'total' => 0, JOIN Genre ON Genre.code = Film.genre
'error' => 'Connexion MySQL impossible.', JOIN Artiste ON Artiste.idArtiste = Film.idMes
]; ORDER BY Film.titre ASC
} ";
$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); $result = mysqli_query($conn, $sql);
if ($result === false) { if ($result === false) {
return [ die('Erreur SQL lors de la récupération des films : ' . mysqli_error($conn));
'films' => [],
'total' => 0,
'error' => 'Exécution de la requête impossible.',
];
} }
$films = mysqli_fetch_all($result, MYSQLI_ASSOC); $films = array();
while ($film = mysqli_fetch_assoc($result)) {
$films[] = $film;
}
$totalResult = mysqli_query($conn, 'SELECT FOUND_ROWS() AS total'); mysqli_free_result($result);
$totalRow = $totalResult ? mysqli_fetch_assoc($totalResult) : ['total' => 0];
$total = isset($totalRow['total']) ? (int) $totalRow['total'] : 0;
return [ return $films;
'films' => $films,
'total' => $total,
'error' => null,
];
} }
@@ -0,0 +1,53 @@
<?php
include_once __DIR__ . '/connexion.php';
function findUserByLogin($login)
{
$conn = getConnection();
$stmt = mysqli_prepare($conn, 'SELECT login, email, password FROM `user` WHERE login = ?');
if ($stmt === false) {
die('Préparation SQL impossible : ' . mysqli_error($conn));
}
mysqli_stmt_bind_param($stmt, 's', $login);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $dbLogin, $dbEmail, $dbPassword);
$user = null;
if (mysqli_stmt_fetch($stmt)) {
$user = array(
'login' => $dbLogin,
'email' => $dbEmail,
'password' => $dbPassword,
);
}
mysqli_stmt_close($stmt);
return $user;
}
function createUser($login, $email, $passwordHash)
{
$conn = getConnection();
$stmt = mysqli_prepare($conn, 'INSERT INTO `user` (login, email, password) VALUES (?, ?, ?)');
if ($stmt === false) {
die('Préparation SQL impossible : ' . mysqli_error($conn));
}
mysqli_stmt_bind_param($stmt, 'sss', $login, $email, $passwordHash);
$success = mysqli_stmt_execute($stmt);
$errorCode = mysqli_errno($conn);
mysqli_stmt_close($stmt);
// 1062 = violation de clé unique (login déjà pris).
if (!$success && $errorCode === 1062) {
return false;
}
if (!$success) {
die('Insertion SQL impossible : ' . mysqli_error($conn));
}
return true;
}
+11
View File
@@ -0,0 +1,11 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Ce fichier est inclus en tête de chaque page protégée.
// Si l'utilisateur n'est pas connecté, on le renvoie vers le formulaire.
if (!isset($_SESSION['user_login'])) {
header('Location: ./authentification.php');
exit;
}
+35
View File
@@ -0,0 +1,35 @@
<?php
session_start();
include_once './modeles/modeleUtilisateurs.php';
$login = isset($_POST['login']) ? trim($_POST['login']) : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
// Cette temporisation ralentit volontairement les tentatives répétées,
// ce qui rend les attaques par force brute moins efficaces.
usleep(500000);
if ($login === '' || $password === '') {
header('Location: ./authentification.php?error=1&login=' . urlencode($login));
exit;
}
$user = findUserByLogin($login);
if ($user === null) {
header('Location: ./authentification.php?error=1&login=' . urlencode($login));
exit;
}
if (!password_verify($password, $user['password'])) {
header('Location: ./authentification.php?error=1&login=' . urlencode($login));
exit;
}
session_regenerate_id(true);
$_SESSION['user_login'] = $user['login'];
$_SESSION['user_email'] = $user['email'];
header('Location: ./films.php');
exit;
+21 -11
View File
@@ -1,14 +1,24 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>Films</title> <title>Films</title>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/> />
<link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href="./css/style.css">
</head> </head>
<body> <body>
<main class="container"> <main class="container">
<nav>
<ul>
<li><strong>Cinema</strong></li>
</ul>
<ul>
<li><a href="./films.php">Films</a></li>
<li>Connecté : <?php echo htmlspecialchars(isset($_SESSION['user_login']) ? $_SESSION['user_login'] : 'inconnu', ENT_QUOTES); ?></li>
<li><a href="./deconnexion.php">Déconnexion</a></li>
</ul>
</nav>
+22 -54
View File
@@ -1,64 +1,32 @@
<!-- <!--
Variables de la vue Variables de la vue
$films : les films de la page $films : les films de la page
--> -->
<h2>Films</h2> <h2>Films</h2>
<?php if (!empty($errorMessage)) { ?>
<article><?php echo htmlspecialchars($errorMessage, ENT_QUOTES, 'UTF-8'); ?></article>
<?php } ?>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>Titre</th> <th>Titre</th>
<th>Année</th> <th>Année</th>
<th>Genre</th> <th>Genre</th>
<th>Réalisateur</th> <th>Réalisateur</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php <?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'); echo "
$genre = htmlspecialchars($film['genre'], ENT_QUOTES, 'UTF-8'); <tr>
$realisateur = htmlspecialchars($film['prenom'] . ' ' . $film['nom'], ENT_QUOTES, 'UTF-8'); <td><a href='#'>{$film['titre']}</a></td>
<td>{$film['annee']}</td>
<td>{$film['genre']}</td>
<td>{$film['prenom']} {$film['nom']}</td>
</tr>";
echo "
<tr>
<td><a href='#'>{$titre}</a></td>
<td>{$annee}</td>
<td>{$genre}</td>
<td>{$realisateur}</td>
</tr>";
} }
?> ?>
</tbody> </tbody>
</table> </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 } ?>
+25 -4
View File
@@ -1,6 +1,27 @@
<?php <?php
$osSet = ['linux','apple','windows']; // Les valeurs autorisées servent à la fois pour la validation
$os = "linux"; // du formulaire et pour l'affichage dans la vue.
$osSet = [
'linux' => 'Linux',
'windows' => 'Windows',
'apple' => 'MacOS',
];
include './views/main.php'; $cookieName = 'preferred_os';
?> $os = 'linux';
// Si le formulaire est soumis, on valide la valeur reçue avant
// de l'enregistrer dans un cookie valable 60 secondes.
if (isset($_POST['os']) && array_key_exists($_POST['os'], $osSet)) {
$os = $_POST['os'];
setcookie($cookieName, $os, time() + 60);
// On met aussi $_COOKIE à jour pour refléter immédiatement le choix
// sans attendre le rechargement suivant du navigateur.
$_COOKIE[$cookieName] = $os;
} elseif (isset($_COOKIE[$cookieName]) && array_key_exists($_COOKIE[$cookieName], $osSet)) {
// En l'absence de soumission, on relit la préférence mémorisée.
$os = $_COOKIE[$cookieName];
}
include_once './views/main.php';
+46 -40
View File
@@ -1,44 +1,50 @@
<!doctype html> <!doctype html>
<html> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link <title>Cookie OS préféré</title>
rel="stylesheet" <link
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" 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"> />
<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>
<?php foreach ($osSet as $value => $label) { ?>
<label>
<input
type="radio"
name="os"
value="<?php echo htmlspecialchars($value, ENT_QUOTES); ?>"
<?php echo $os === $value ? 'checked' : ''; ?>
>
<i class="fa fa-<?php echo htmlspecialchars($value, ENT_QUOTES); ?> fa-2x" aria-hidden="true"></i>
<?php echo htmlspecialchars($label, ENT_QUOTES); ?>
</label>
<?php } ?>
</fieldset>
</head> <button type="submit">Envoyer</button>
<body> </form>
<main class="container"> <article>
<form method="POST"> <header>Votre os</header>
<fieldset class="grid"> <p>
<legend>Changez votre os</legend> <!-- On affiche l'icône et le nom de l'OS courant. -->
<label> <i class="fa fa-<?php echo htmlspecialchars($os, ENT_QUOTES); ?> fa-5x" aria-hidden="true"></i>
<input type="radio" name="os" value="linux"> </p>
<i class="fa fa-linux fa-2x" aria-hidden="true"></i> <p><?php echo htmlspecialchars($osSet[$os], ENT_QUOTES); ?></p>
</label> <footer>
<label> Rafraîchir la page
<input type="radio" name="os" value="windows"> <a href="./" aria-label="Rafraîchir la page">
<i class="fa fa-windows fa-2x" aria-hidden="true"></i> <i class="fa fa-refresh" aria-hidden="true"></i>
</label> </a>
<label> </footer>
<input type="radio" name="os" value="apple"> </article>
<i class="fa fa-apple fa-2x" aria-hidden="true"></i> </main>
</label> </body>
</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> </html>
+55 -26
View File
@@ -1,54 +1,83 @@
<?php <?php
function initializeGame()
{
// Une grille vide contient 9 cases valant 0.
$_SESSION['grid'] = array_fill(0, 9, 0);
$_SESSION['playerTurn'] = 1;
}
function nextPlayer($player)
{
return $player === 1 ? 2 : 1;
}
function isWinner($grid, $player) function isWinner($grid, $player)
{ {
$winStates = array $winStates = array(
( array(0, 1, 2), array(3, 4, 5), array(6, 7, 8),
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),
array(0, 3, 6), array(1, 4, 7), array(2, 5, 8), // Vertical array(0, 4, 8), array(2, 4, 6)
array(0, 4, 8), array(2, 4, 6) // Diagonal );
);
foreach ($winStates as $winState) foreach ($winStates as $winState) {
{ if (
if ($grid[$winState[0]] == $player && $grid[$winState[0]] == $player &&
$grid[$winState[1]] == $player && $grid[$winState[1]] == $player &&
$grid[$winState[2]] == $player) $grid[$winState[2]] == $player
{ ) {
return true; return true;
} }
} }
return false; return false;
} }
function noWinner($grid) function noWinner($grid)
{ {
for($i = 0; $i < 9; $i++) for ($i = 0; $i < 9; $i++) {
if ($grid[$i] == 0) if ($grid[$i] == 0) {
return false; return false;
}
}
return true; return true;
} }
function displayGrid($grid) function getWinner($grid)
{
if (isWinner($grid, 1)) {
return 1;
}
if (isWinner($grid, 2)) {
return 2;
}
return 0;
}
function displayGrid($grid, $isInteractive = true)
{ {
echo '<table class="morpion">'; echo '<table class="morpion">';
for ($i = 0; $i < 3; $i ++){ for ($i = 0; $i < 3; $i++) {
echo "<tr>"; echo '<tr>';
for ($j = 0; $j < 3; $j ++){ for ($j = 0; $j < 3; $j++) {
echo '<td>';
echo "<td>"; $pos = 3 * $i + $j;
if ($grid[$pos] == 0 && $isInteractive) {
$pos = 3*$i + $j;
if ($grid[$pos] == 0)
echo "<a href='?pos=$pos'></a>"; echo "<a href='?pos=$pos'></a>";
if ($grid[$pos] == 1) }
if ($grid[$pos] == 1) {
echo '<i class="fa fa-times" aria-hidden="true"></i>'; echo '<i class="fa fa-times" aria-hidden="true"></i>';
if ($grid[$pos] == 2) }
if ($grid[$pos] == 2) {
echo '<i class="fa fa-circle-o" aria-hidden="true"></i>'; echo '<i class="fa fa-circle-o" aria-hidden="true"></i>';
}
echo "</td>"; echo '</td>';
} }
echo "</tr>"; echo '</tr>';
} }
echo "</table>"; echo '</table>';
} }
+65 -6
View File
@@ -1,11 +1,70 @@
<?php <?php
include 'helpers.php'; session_start();
// view variables include_once 'helpers.php';
$message = "";
$grid = [0,1,0,1,0,2,2,0,0];
$playerTurn = 1; // 1 or 2
// Si on demande une nouvelle partie, on réinitialise l'état stocké
// en session puis on recharge la page sans paramètre.
if (isset($_GET['reset'])) {
initializeGame();
header('Location: .');
exit;
}
include './views/tictactoe.php'; if (!isset($_SESSION['grid']) || !isset($_SESSION['playerTurn'])) {
initializeGame();
}
// Variables transmises à la vue.
$message = '';
$grid = $_SESSION['grid'];
$playerTurn = (int) $_SESSION['playerTurn'];
$winner = getWinner($grid);
$isGameOver = $winner !== 0 || noWinner($grid);
// On joue uniquement si la partie est encore en cours.
if (!$isGameOver && isset($_GET['pos'])) {
$pos = filter_input(
INPUT_GET,
'pos',
FILTER_VALIDATE_INT,
array('options' => array('min_range' => 0, 'max_range' => 8))
);
if ($pos === false || $pos === null) {
$message = 'Coup invalide.';
} elseif ($grid[$pos] !== 0) {
$message = 'Cette case est déjà occupée.';
} else {
// On enregistre le coup du joueur courant dans la grille.
$grid[$pos] = $playerTurn;
if (isWinner($grid, $playerTurn)) {
$message = "Le joueur $playerTurn gagne la partie.";
} elseif (noWinner($grid)) {
$message = 'Match nul.';
} else {
$playerTurn = nextPlayer($playerTurn);
}
$_SESSION['grid'] = $grid;
$_SESSION['playerTurn'] = $playerTurn;
}
$winner = getWinner($grid);
$isGameOver = $winner !== 0 || noWinner($grid);
}
// Si la page est simplement rafraîchie, on recalcule un message cohérent
// à partir de l'état stocké en session.
if ($message === '') {
if ($winner !== 0) {
$message = "Le joueur $winner gagne la partie.";
} elseif (noWinner($grid)) {
$message = 'Match nul.';
}
}
include_once './views/tictactoe.php';
+22 -10
View File
@@ -1,23 +1,35 @@
<html> <!DOCTYPE html>
<html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Tic Tac Toe</title>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/> />
<link rel="stylesheet" href="./css/style.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"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head> </head>
<body> <body>
<main class="container center"> <main class="container center">
<h4>Tic Tac Toe : <?php echo "player $playerTurn turn";?></h4> <h4>
<?php if ($isGameOver) { ?>
Partie terminée
<?php } else { ?>
Tic Tac Toe : joueur <?php echo $playerTurn; ?> à vous de jouer
<?php } ?>
</h4>
<?php <?php
displayGrid($grid); // Quand la partie est finie, les liens dans les cases vides
// disparaissent pour empêcher tout coup supplémentaire.
displayGrid($grid, !$isGameOver);
if ($message != "") if ($message != '') {
echo "<h5>$message <a href='.'>new game</a></h5>"; echo '<h5>' . htmlspecialchars($message, ENT_QUOTES) . " <a href='?reset=1'>nouvelle partie</a></h5>";
?> } else {
echo "<p><a href='?reset=1'>Recommencer la partie</a></p>";
}
?>
</main> </main>
</body> </body>
</html> </html>
-77
View File
@@ -1,77 +0,0 @@
# 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.

Before

Width:  |  Height:  |  Size: 32 KiB

-13
View File
@@ -1,13 +0,0 @@
.action{
text-align : right;
}
.action a {
margin-right : 1rem;
}
table {
font-size : 1.5rem;
}
body {
padding : 2rem;
}
-64
View File
@@ -1,64 +0,0 @@
<?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
}
}
}

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