Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bdc3e430b6 | |||
| 5dad311827 | |||
| 09e55a2b28 | |||
| cf7a51459c | |||
| 6451778bb8 | |||
| 5ef7c7b630 | |||
| c165b74c99 | |||
| 91524fb5e5 |
@@ -33,6 +33,8 @@ Les notions suivantes seront abordées :
|
||||
| 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) |
|
||||
|
||||
|
||||
|
||||
## Les TPS
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
include './include/data.inc.php';
|
||||
include_once './include/data.inc.php';
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
include './include/favoris.inc.php';
|
||||
include_once './include/favoris.inc.php';
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
@@ -17,7 +17,7 @@ include './include/favoris.inc.php';
|
||||
<body>
|
||||
<main>
|
||||
<h2>
|
||||
Exercice 4 : Favoris
|
||||
Exercice 4 : Favoris
|
||||
</h2>
|
||||
|
||||
<!-- À compléter -->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
include './include/fonction.php';
|
||||
include_once './include/fonction.php';
|
||||
$alphabet = "@#!*^&azertyuiopqsdfghjkklmwxcvbnAZERTYUIOPLMKJHGFDSQWXCVBN1234567890";
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
# TP 3 : Passage de paramètres à un script, PHP-MariaDB avec l'extension **mysqli**.
|
||||
|
||||
> Le style utilisé dans les sources est [picocss](https://picocss.com/).
|
||||
|
||||
### Ex1.
|
||||
Le but est d'écrire un script php simulant le jeu de hasard pierre,
|
||||
feuille ciseaux (encore appelé chifoumi).
|
||||
<div align="center">
|
||||
<img src="./img/chifoumi.png">
|
||||
</div>
|
||||
|
||||
Le joueur joue en cliquant sur l'icone représentant le coup qu'il
|
||||
a choisi. Celui-ci est un lien vers le même script, auquel est passé
|
||||
en GET un paramètre représentant son choix. Par exemple :
|
||||
|
||||
```html
|
||||
<a href="?choice=0"><img href="rock.png"></a>
|
||||
<a href="?choice=1"><img href="paper.png"></a>
|
||||
<a href="?choice=2"><img href="scissors.png"></a>
|
||||
```
|
||||
Le script récupère le coup du joueur, fait un tirage aléatoire, et
|
||||
affiche les deux coups joués avec un message pour indiquer le
|
||||
résultat de la partie.
|
||||
|
||||
Le code est organisé sommairement suivant le pattern `MVC`. Le script `index.php` fait office de contrôleur.
|
||||
- il récupére le choix du joueur,
|
||||
- il fait jouer l'ordinateur (tirage aléatoire),
|
||||
- il calcule l'issue de la partie,
|
||||
- il affiche (include) les différentes parties de la vue finale, avec les variables nécessaires.
|
||||
|
||||
Remarque : pour éviter un code trop verbeux au niveau des tests pour calculer le résultat d'une partie,
|
||||
vous pouvez utiliser un tableau pour représenter les règles du jeu. Par exemple,
|
||||
|
||||
```php
|
||||
<?php
|
||||
// 0 rock, 1 paper, 2 scissors
|
||||
$rules = [ 0 => [ 0 => "Draw", 1 => "Loss", 2 => "Win"], ... ];
|
||||
```
|
||||
|
||||
### Ex2.
|
||||
|
||||
**Avant de commencer**
|
||||
>- Vous diposez, sur le serveur mysql qui tourne sur la machine
|
||||
> dwarves.iut-fbleau.fr, d'un compte identifié par votre login. Le mot de
|
||||
> passe a été initailisé avec votre login. Pensez à le changer
|
||||
> rapidement.
|
||||
>- Vous disposez en lecture/écriture d'une seule base de données
|
||||
> identifiée là encore par votre login.
|
||||
>- Vous avez aussi accès à cette
|
||||
> [url](https://dwarves.iut-fbleau.fr/phpmyadmin/) à une interface web
|
||||
> (phpmyadmin) de gestion de votre base.
|
||||
|
||||
Pour travailler, importez dans votre base les tables et leurs contenus
|
||||
|
||||
```sql
|
||||
Artiste (idArtiste,nom,prenom,anneeNaiss)
|
||||
---------
|
||||
Genre (code)
|
||||
----
|
||||
Pays (code,nom,langue)
|
||||
----
|
||||
Film (idFilm,titre,annee,#idMes,#genre,resume,#codePays,urlImage)
|
||||
------
|
||||
Role (#idFilm,#idActeur,nomRole)
|
||||
------- -------- -------
|
||||
```
|
||||
|
||||
qui se trouvent dans le fichier **cinema.sql**. Vous pouvez directement
|
||||
l'importer à partir de phpmyadmin. Examinez les tables, leurs
|
||||
structures et relations.
|
||||
|
||||
 Par pitié !
|
||||
|
||||
**Testez directement vos requêtes sql avec phpmyadmin (ou autre) avant
|
||||
des les "intégrer" à php !**
|
||||
|
||||
|
||||
1. Complétez le script **films.php** qui affiche la liste de tous les films
|
||||
de votre base sous forme d'une table html, classée par titre, avec
|
||||
l'année, le genre et le réalisateur.
|
||||
|
||||

|
||||
|
||||
<details><summary>Conseils</summary>
|
||||
<div>
|
||||
|
||||
- le serveur tourne sur le serveur http, donc pour vous connecter,
|
||||
utiliser `localhost` comme nom.
|
||||
- Pour récuperer les informations demandées, pensez à faire une
|
||||
jointure entre Film et Artiste.
|
||||
</div>
|
||||
</details>
|
||||
|
||||
2. Modifiez le script précédent afin de paginer l'affichage des films.
|
||||
|
||||

|
||||
|
||||
<details><summary>Conseils</summary>
|
||||
<div>
|
||||
|
||||
- La clause `LIMIT` dans un SELECT permet de restreindre le nombre de
|
||||
résultats de la requête.
|
||||
|
||||
- L'option `SQL_CALC_FOUND_ROWS` permet, en présence de la clause
|
||||
LIMIT, de savoir combien de resultats auraient été selectionnée en
|
||||
son absence.
|
||||
|
||||
Il faut utliser juste après la requête la fonction MySQL
|
||||
`FOUND_ROWS()`.
|
||||
</div>
|
||||
</details>
|
||||
|
||||
3. Ajoutez dans le script précédent un formulaire avec une liste déroulante
|
||||
qui permet de filtrer les films par réalisateur.
|
||||
|
||||

|
||||
|
||||
<details><summary>Conseils</summary>
|
||||
<div>
|
||||
|
||||
Il faut récupérer dans la table Artiste les réalisateurs, et peupler une
|
||||
liste déroulante. La valeur envoyé par le formulaire sera bien sûr
|
||||
l'identifiant du réalisateur.
|
||||
|
||||
Faites en sorte, comme sur la capture d'écran, de réafficher la liste
|
||||
déroulante avec le nom du réalisateur dernièrement selectionné.
|
||||
</div>
|
||||
</details>
|
||||
|
||||
4. On veut dans cette question, à partir de la liste, afficher le détail
|
||||
d'un film. Pour cela, chaque titre, dans le tableau, sera un lien qui
|
||||
conduira à la fiche du film. L'identifiant du film sera passé dans
|
||||
l'url du lien.
|
||||
|
||||
<a href="./fiche.php?film=1">Vertigo</a>
|
||||
|
||||

|
||||
|
||||
5. Pour ceux qui s'ennuient, faites en sorte que l'on puisse trier
|
||||
l'affichage sous forme de tableau par odre de titre, année, ou genre.
|
||||
@@ -0,0 +1,13 @@
|
||||
.center{
|
||||
text-align:center;
|
||||
}
|
||||
.Win{
|
||||
color:#2E8B57;
|
||||
|
||||
}
|
||||
.Loss{
|
||||
color:#FF6347;
|
||||
}
|
||||
.Draw{
|
||||
color:#DAA520;
|
||||
}
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
$images = ["rock.png", "paper.png", "scissors.png"];
|
||||
$rules = [
|
||||
0 => [0 => "Draw", 1 => "Loss", 2 => "Win"],
|
||||
1 => [0 => "Win", 1 => "Draw", 2 => "Loss"],
|
||||
2 => [0 => "Loss", 1 => "Win", 2 => "Draw"],
|
||||
];
|
||||
|
||||
$playerChoice = filter_input(
|
||||
INPUT_GET,
|
||||
'choice',
|
||||
FILTER_VALIDATE_INT,
|
||||
['options' => ['min_range' => 0, 'max_range' => 2]]
|
||||
);
|
||||
|
||||
$isPlaying = ($playerChoice !== null && $playerChoice !== false);
|
||||
|
||||
if ($isPlaying) {
|
||||
$computerChoice = mt_rand(0, 2);
|
||||
$message = $rules[$playerChoice][$computerChoice];
|
||||
$class = $message;
|
||||
$imagePlayer = $images[$playerChoice];
|
||||
$imageComputer = $images[$computerChoice];
|
||||
}
|
||||
|
||||
include_once './views/header.php';
|
||||
if ($isPlaying) {
|
||||
include_once './views/game.php';
|
||||
include_once './views/message.php';
|
||||
}
|
||||
include_once './views/footer.php';
|
||||
@@ -0,0 +1,3 @@
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,15 @@
|
||||
<div class="grid">
|
||||
<article>
|
||||
<header>Player</header>
|
||||
<section class="center">
|
||||
<img src="./images/<?php echo $imagePlayer;?>">
|
||||
</section>
|
||||
</article>
|
||||
<article>
|
||||
<header>Computer</header>
|
||||
<section class="center">
|
||||
<img src="./images/<?php echo $imageComputer;?>">
|
||||
</section>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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">
|
||||
<title>Chifoumi</title>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container">
|
||||
|
||||
<h3>Rock Paper Scissors</h3>
|
||||
|
||||
<section class="center">
|
||||
<p>Choose : </p>
|
||||
<a href="?choice=0"><img width="100px" src="./images/rock.png"></a>
|
||||
<a href="?choice=1"><img width="100px" src="./images/paper.png"></a>
|
||||
<a href="?choice=2"><img width="100px" src="./images/scissors.png"></a>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<h2 class="center">
|
||||
<span class="<?php echo $class;?>"><?php echo $message;?></span>
|
||||
</h2>
|
||||
@@ -0,0 +1,18 @@
|
||||
table{
|
||||
width:100%;
|
||||
}
|
||||
img{
|
||||
width:500px;
|
||||
}
|
||||
td + td + td + td{
|
||||
width : 20%;
|
||||
}
|
||||
td:first-child + td{
|
||||
width:10%;
|
||||
}
|
||||
td:first-child{
|
||||
width:30%;
|
||||
}
|
||||
td:first-child + td + td {
|
||||
width:30%;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
include_once './modeles/modeleFilms.php';
|
||||
|
||||
$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_once './vues/header.php';
|
||||
include_once './vues/vueFilms.php';
|
||||
include_once './vues/footer.php';
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
function getConnection()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
function getFilms($page = 1, $perPage = 10)
|
||||
{
|
||||
$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,
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Films</title>
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
|
||||
/>
|
||||
|
||||
<link rel="stylesheet" href="./css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<main class="container">
|
||||
@@ -0,0 +1,64 @@
|
||||
<!--
|
||||
Variables de la vue
|
||||
$films : les films de la page
|
||||
-->
|
||||
|
||||
<h2>Films</h2>
|
||||
<?php if (!empty($errorMessage)) { ?>
|
||||
<article><?php echo htmlspecialchars($errorMessage, ENT_QUOTES, 'UTF-8'); ?></article>
|
||||
<?php } ?>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Titre</th>
|
||||
<th>Année</th>
|
||||
<th>Genre</th>
|
||||
<th>Réalisateur</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
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='#'>{$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 } ?>
|
||||
|
||||
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 543 KiB |