Les exercices suivants sont les exercices du premier chapitre de cours de PHP. Pour tous les exercices, nous allons utiliser le serveur local. Étant donné la configuration des ordinateurs de l’IUT, le serveur local ne peut accéder qu’aux fichiers du répertoire /home/$USER/public_html
. Pour accéder à ces documents en passant par le serveur local, il faut alors taper l’url :
http://localhost/~VOTRE_NUMERO_ETUDIANT/chemin/nom_du_fichier
où chemin
correspond au chemin où se trouve votre fichier à partir du répertoire public_html
. Par exemple, si votre numéro d’étudiant est le 001 et si vous créez un dossier TP1
dans votre répertoire public_html
et un fichier exercice1.php
dans TP1
, pour accéder à ce fichier, vous devez spécifier l’adresse Web :
http://localhost/~001/TP1/exercice1.php
Attention : Les données stockées dans le répertoire public_html
sont supprimées à chaque redémarrage de l’ordinateur. Le moyen le plus simple pour que vos documents soient sauvegardés tout en étant accessibles via le serveur local est d’utiliser le task runner robo. Correctement configuré, ce task runner va vous permettre de synchroniser votre répertoire de travail (situé dans la partie sauvegardée de vos documents) avec le répertoire /home/$USER/public_html
. Cette synchronisation implique que chaque changement effectué dans votre répertoire de travail sera automatiquement appliqué dans le répertoire public_html
.
Pour configurer facilement le task runner, il faut le configurer une première fois puis l'activer à chaque début de séance.
Configuration du task runner
Ouvrez un terminal et tapez les commandes suivantes :
cd ~/Bureau/Mes_Montages/$USER
git clone https://github.com/mathieuLacroix/R301.git
Activation en début de séance
Ouvrez un terminal et tapez les commandes suivantes :
cd ~/Bureau/Mes_Montages/$USER/R301
code web/
robo sync
Le répertoire /home/$USER/public_html
contient alors une copie du répertoire ~/Bureau/Mes_Montages/$USER/R301/web
qui est mise à jour à chaque modification de ce dernier.
Attention : La synchronisation se fait tant que la commande robo sync
s'exécute. Il ne faut donc pas fermer le terminal ou tuer le processus. De plus, vous devez mettre tout votre code uniquement dans le répertoire ~/Bureau/Mes_Montages/$USER/R301/web
.
Remarque : Comme l’ensemble des réponses aux exercices contiennent du code PHP, il n’est pas possible d’ouvrir le fichier directement à l’aide du navigateur. Il est donc impératif de passer par le serveur local.
Exercice 1 : Premiers pas en PHP
Voici un code php.
<!doctype html>
<html>
<head>
<title> <?php echo 'Premiers pas en PHP'; ?> </title>
<meta charset="utf-8"/>
</head>
<body>
<h1> Mes premiers pas en PHP </h1>
<?php $tps=2; echo '<p> Je débute depuis '; echo $tps; echo ' heures... </p>';?>
<p> Mais cela a l'air intéressant <?php echo '!' ?> </p>
<?php echo '
<h2> Vive le PHP </h2>
<p> Les pages vont pouvoir être dynamiques! </p>
'; ?>
<p> Encore quelques paragraphes </p>
echo '<p> Avant dernier paragraphe </p>';
<p> Voilà, c'est terminé! </p>
</body>
</html>
Répondre aux questions suivantes :
-
Donner dans ce fichier les parties correspondant à du code PHP et à du code HTML.
-
Si ce fichier s’appelle
exo1.php
, et s’il est stocké sur le site Webwww.exemple.org
dans le répertoirePremierTP
, comment “exécuter” ce fichier ? Que donne son exécution ? Ceci est-il valide ? Pourquoi ? Corriger alors le problème. -
Remplacer les trois instructions
echo
de la ligne 9 par une seule.
Exercice 2 : Inclusion d’en-tête et pied de page
Le langage PHP permet d’inclure des fichiers dans d’autres. Ceci permet alors de décomposer un code HTML ou PHP en plusieurs parties logiques et d’insérer ensuite ces différentes parties dans un fichier PHP.
-
Créer un fichier
debut_code_html.php
contenant tout le code HTML jusqu’à la balise<body>
incluse. -
Créer un fichier
fin_code_html.php
contenant les balises</body></html>
. -
Créer un fichier
code.php
contenant un titre et un paragraphe et incluant les fichiersdebut_code_html.php
etfin_code_html.php
. -
Modifier le fichier
debut_code_html.php
pour que le titre de l’onglet (balise<title>
) dépende de la valeur de la variable$title
définie dans le fichiercode.php
.
Exercice 3 : Instruction echo
et concaténation
Dans le code PHP suivant, afficher, à l’aide d’une seule instruction PHP le paragraphe “J’ai 3 chats et 2 chiens, ce qui me fait 5 animaux”. Les valeurs 3, 2 et 5 affichées dépendent des valeurs des variables $chats
et $chiens
.
Le faire une fois en utilisant uniquement les apostrophes et une fois en utilisant uniquement les guillemets.
Remarque : Le code utilise les fichiers debut_code_html.php
et fin_code_html.php
de l’exercice 2 pour définir une page Web complète. Il est recommandé de les utiliser pour chaque exercice du TP.
<?php
$title = "Exercice 3";
require "debut_code_html.php";
$chats = 3;
$chiens = 2;
// TO DO : afficher le paragraphe en fonction des variables $chats et $chiens
require "fin_code_html.php";
Exercice 4 : Tableaux
Considérons le tableau PHP suivant.
$t = [
'english',
'first'=>'html',
2 => 'css',
'best'=>'php',
'javascript',
5 => 'jQuery'
];
-
Quelles sont les clés du tableau ? Quelles sont les valeurs ?
-
À l’aide de l’instruction
var_dump($t);
, vérifier si les clés et les valeurs sont bien celles prédites. -
Afficher la liste des valeurs du tableau dans une liste ordonnée.
-
Afficher la liste des clés du tableau dans une deuxième liste ordonnée.
Exercice 5 : Tableau à deux dimensions
On définit le tableau suivant :
$personnes = [
'mdupond' => ['Prénom' => 'Martin', 'Nom' => 'Dupond', 'Age' => 25, 'Ville' => 'Paris' ],
'jm' => ['Prénom' => 'Jean' , 'Nom' => 'Martin', 'Age' => 20, 'Ville' => 'Villetaneuse'],
'toto' => ['Prénom' => 'Tom' , 'Nom' => 'Tonge' , 'Age' => 18, 'Ville' => 'Epinay' ],
'arn' => ['Prénom' => 'Arnaud', 'Nom' => 'Dupond', 'Age' => 33, 'Ville' => 'Paris' ],
'email' => ['Prénom' => 'Emilie', 'Nom' => 'Ailta' , 'Age' => 46, 'Ville' => 'Villetaneuse'],
'dask' => ['Prénom' => 'Damien', 'Nom' => 'Askier', 'Age' => 7 , 'Ville' => 'Villetaneuse']
];
-
Quelles sont les clés du tableau
$personnes
et leur type ? De quel type sont les valeurs de ce tableau ? Quelle est la valeur associée à ‘toto’ ? -
Comment accéder à la valeur 33 dans le tableau ? À la valeur ‘Epinay’ ? Au tableau contenant les valeurs ‘Damien’, ‘Askier’, 7, ‘Villetaneuse’ ?
-
Écrire une fonction prenant en paramètre un tableau (avec une structure similaire à
$personnes
) et l’affichant sous forme d’une table HTML. Le code HTML obtenu avec le tableau$personnes
doit être :<table> <tr> <td>Martin</td> <td>Dupond</td> <td>25</td> <td>Paris</td> </tr> <tr> <td>Jean</td> <td>Martin</td> <td>20</td> <td>Villetaneuse</td> </tr> <tr> <td>Tom</td> <td>Tonge</td> <td>18</td> <td>Epinay</td> </tr> <tr> <td>Arnaud</td> <td>Dupond</td> <td>33</td> <td>Paris</td> </tr> <tr> <td>Emilie</td> <td>Ailta</td> <td>46</td> <td>Villetaneuse</td> </tr> <tr> <td>Damien</td> <td>Askier</td> <td>7</td> <td>Villetaneuse</td> </tr> </table>
- Modifier la fonction précédente pour ajouter une ligne d’en-têtes. Les en-têtes seront les clés du tableau contenu dans la première case. Dans le cas de
$personnes
, les en-têtes seront Prénom, Nom, Age, Ville.
Indice : Utiliserarray_keys($personnes)[0]
pour récupérer la première clé du tableau$personnes
. - Vérifier que l’affichage obtenu est correct lorsque la fonction prend en paramètre le tableau suivant :
$scores = [ ['Joueur' => 'Camille' , 'score' => 156 ], ['Joueur' => 'Guillaume', 'score' => 254 ], ['Joueur' => 'Julien' , 'score' => 192 ], ['Joueur' => 'Nabila' , 'score' => 317 ], ['Joueur' => 'Lorianne' , 'score' => 235 ], ['Joueur' => 'Tom' , 'score' => 83 ], ['Joueur' => 'Michael' , 'score' => 325 ], ['Joueur' => 'Eddy' , 'score' => 299 ] ];
Exercice 6 : Tableau à deux dimensions
On considère les deux tableaux suivants :
$tabMagazines = [
'le monde' => ['frequence' => 'quotidien', 'type' => 'actualité', 'prix' => 220],
'le point' => ['frequence' => 'hebdo' , 'type' => 'actualité', 'prix' => 80 ],
'causette' => ['frequence' => 'mensuel' , 'type' => 'féminin' , 'prix' => 180],
'politis' => ['frequence' => 'hebdo' , 'type' => 'opinion' , 'prix' => 100],
'le monde diplomatique' => ['frequence' => 'mensuel' , 'type' => 'analyse' , 'prix' => 60 ],
'libération' => ['frequence' => 'quotidien', 'type' => 'actualité', 'prix' => 190],
];
$tabMagazinesAbonne = ['le monde', 'le monde diplomatique'];
-
Afficher sur une ligne le nom de tous les magazines triés par ordre alphabétique et séparés par des virgules, sans faire de boucle. Vous utiliserez des fonctions déjà existantes telles que implode, sort et array_keys que vous trouverez dans le manuel php.
-
Afficher séparés par des virgule les noms des quotidiens (et uniquement ceux-ci).
- Afficher les magazines exactement de la façon suivante en supposant qu’il peut y avoir beaucoup de magazines et beaucoup de propriétés associées :
- le monde (quotidien, actualité, 220)
- le point (hebdo, actualité, 80)
- causette (mensuel, féministe, 180)
- politis (hebdo, opinion, 100)
- le monde diplomatique (mensuel, analyse, 60)
- En utilisant le tableau
$tabMagazinesAbonne
contenant le nom des magazines d’un abonné, calculer le prix total de son abonnement.
Exercice 7 : Objets
L’objectif de cet exercice est de développer une classe permettant la gestion d’une TODO liste (liste de tâches à réaliser).
-
Créer la classe
TODOList
contenant un attribut privé$to_dos
, correspondant à un tableau contenant la liste des tâches à réaliser (chaque case correspond à une tâche qui est une chaîne de caractères). Les clés correspondront aux indices. Cette classe sera définie dans le fichierTODOList.php
. -
Définir un constructeur ne prenant pas d’argument et initialisant une TODO liste vide.
-
Définir la méthode
add_to_do
prenant en paramètre une chaîne de caractères (correspondant à une tâche). Si cette chaîne n’est pas vide et n’est pas constituée uniquement d’espaces, la méthode ajoute cette tâche à la fin de la TODO liste. -
Définir la méthode
remove_to_do
prenant en paramètre un indice et supprimant la tâche associée à cet indice dans la TODO liste. -
Définir la méthode
is_empty
retournanttrue
s’il n’y a aucune tâche, etfalse
sinon. -
Définir la méthode
get_html
retournant une chaîne de caractères correspondant au code HTML d’une liste non ordonnée où chaque item correspond à une tâche. Dans le cas où la TO DO liste est vide,get_html
doit renvoyer le paragraphe “Aucune tâche à faire !”. -
Créer un script
testTDL.php
créant une TODO liste avec 4 tâches, l’affichant, supprimant une des tâches puis l’affichant à nouveau. Ajouter des tests pour vérifier que la méthodeis_empty
fonctionne correctement et qu’une tâche vide ou constituée uniquement d’espaces n’est pas ajoutée à la liste.
Exercice 8 : Expressions régulières
On souhaite écrire des expressions régulières et vérifier qu’un ensemble de chaînes vérifie ou pas une expression régulière.
-
Définir une fonction
check_er
prenant en paramètre une expression régulière et un tableau dont les clés sont des chaînes de caractères et les valeurs des booléens indiquant si la clé doit vérifier ou non l’expression régulière. La fonction doit parcourir les chaînes de caractères (clés) du tableau. Pour chaque chaîne, si celle-ci vérifie l’expression régulière alors que la valeur associée dans le tableau estfalse
, ou si elle ne vérifie pas l’expression régulière alors que la valeur esttrue
, la fonction doit afficher un message d’erreur. De plus, la fonction doit afficher le nombre d’erreurs.À titre d’exemple, si la fonction
check_er
est appelée avec l’expression régulière"/php/"
et le tableau[ "J'adore le php !" => true, "Génial le php !!!" => false, "Javascript est mieux" => false, "J'adore le javascript" => true ]
la fonction doit afficher :
- ERREUR : “Génial le php !!!” vérifie l’er alors que la valeur est false !
- ERREUR : “J’adore le javascript” ne vérifie pas l’er alors que la valeur est true !
Il y a 2 erreurs !
- Donner l’expression régulière correspondant à un nombre entier. Il est possible d’avoir un nombre négatif. L’appel de la fonction
check_er
avec l’expression régulière et le tableau suivant ne doit donner aucune erreur.[ "10" => true, "0" => true, "-34539" => true, "--44" => false, "" => false, "123a456" => false, "10.2" => false ]
- Donner l’expression régulière correspondant à un nombre décimal. On utilisera le symbole
.
comme séparateur décimal. Pour simplifier, on supposera qu’il y a forcément un chiffre après le séparateur décimal si celui-ci est donné. L’appel de la fonctioncheck_er
avec l’expression régulière et le tableau suivant ne doit donner aucune erreur.[ "10" => true, "0" => true, "-34539" => true, "--44" => false, "" => false, "123a456" => false, "10.2" => true, "0.001" => true, ".001" => true, "10." => false ]
-
Donner l’expression régulière correspondant aux dates au format JJ/MM/AAAA. Il est possible de ne spécifier qu’un chiffre pour le jour et le mois. L’année contient obligatoirement 4 chiffres.
Attention : L’expression régulière vérifie si le format correspond à celui demandé, pas si la date donnée est valide. Par exemple
34/78/1234
est considéré comme valide.L’appel de la fonction
check_er
avec l’expression régulière et le tableau suivant ne doit donner aucune erreur.[ "10/10/2021" => true, "9/9/1234" => true, "90/9/5476" => true, "8/23/0014" => true, "111/23/0423" => false, "12/12/123" => false, "1/11234" => false, "10/2" => false, "1a/2b/8790" => false ]
Exercice 9 : Passage de paramètres dans l’url
-
Créer un script
nombre.php
qui teste s’il existe un paramètre de nomnombre
. Si c’est le cas, alors le script teste par une expression régulière si sa valeur est un nombre entier ou pas et affiche cette information. - Tester le script dans les cas suivants :
- sans passer de paramètre,
- en passant un paramètre avec un nom différent de
nombre
, - en passant un paramètre
nombre
de valeur 25, - en passant un paramètre
nombre
de valeur12a34
.
Dans tous les cas, le script
nombre.php
ne doit générer aucune erreur. - Créer un formulaire avec un champ de type texte (pour saisir un nombre) et un bouton
submit
. La soumission du formulaire appellera le fichiernombre.php
. Placer ensuite ce formulaire dans le scriptnombre.php
pour pouvoir saisir plusieurs valeurs, le script indiquant à chaque fois si la valeur saisie est un nombre.
Exercice 10 : Sessions et cookies
Attention : cet exercice nécessite d’avoir fait l’exercice précédent car c’est la suite. Il faut modifier le script nombre.php
défini dans l’exercice précédent pour effectuer des multiplications.
-
Utiliser les sessions pour faire la multiplication des nombres saisis dans le formulaire.
-
Pourquoi est-ce important de vérifier que le nombre saisi correspond à un nombre ? Que se passe-t-il si aucune vérification n’était faite ? Tester en passant au script le paramètre
nombre
avec la valeurabc
. -
Modifier le code de manière à pouvoir réinitialiser le produit des nombres en appuyant sur un autre bouton de type
submit
. -
À l’aide des cookies, modifier le script pour qu’à chaque fois que l’on réinitialise un produit, la valeur de ce produit calculé (s’il est différent de 1) soit stocké dans un cookie. Afficher à la fin du script la valeur du dernier produit calculé avant réinitialisation si cette information est disponible.
Exercice 11 : TODO liste
L’objectif de cet exercice est de programmer une page Web (tdl.php
) permettant de gérer une TODO liste (liste de tâches à réaliser). Chaque utilisateur se connectant sur la page Web doit pouvoir gérer sa propre TODO liste : créer des tâches, en supprimer et les sauvegarder. L’ajout d’une tâche se fera à l’aide d’un formulaire et la suppression d’une tâche se fera grâce à un lien hypertexte. La sauvegarde de la TODO liste se fera grâce aux cookies. La TODO liste doit être sauvegardée dans les sessions pour être accessible à chaque appel du script. L’instance de la classe TODOList
sera stockée dans la variable $_SESSION["tdl"]
.
Important : Cet exercice utilise la classe TODOList
définie dans l’exercice 6. Il faut donc avoir terminé cet exercice avant de commencer celui-ci.
Important : Comme l’objet TODOList
est sauvegardé dans la session, il est impératif d’inclure la définition de la classe avant d’activer les sessions. Le fichier tdl.php
doit commencer par :
require_once "TODOList.php"; // avant session_start car on stocke un objet TODOList dans la session
session_start();
- Créer le script
tdl.php
. Celui-ci doit :- vérifier que la TODO liste est existe dans la session. Si ce n’est pas le cas, il initialise une TODO liste vide qu’il sauvegarde dans la session ;
- vérifier s’il existe dans l’url un paramètre
task
. Si ce paramètre existe, alors le script ajoute à la TODO liste une tâche correspondant à la valeur du paramètretask
; - afficher la TODO liste.
-
Créer un formulaire facilitant l’ajout d’une tâche dans la TODO liste.
-
Modifier la méthode
get_html
de la classe TODO liste pour que chaque item soit un hyperlien sur le scripttdl.php
avec le numéro de la tâche comme valeur du paramètrerm
. -
Modifier le script
tdl.php
pour permettre la suppression des tâches dans la TODO liste lors d’un clic sur un hyperlien d’une tâche. - Définir les méthodes
get_representation
etset_representation
dans la classeTODOList
. La première méthode retournera une chaîne de caractères contenant les différentes tâches séparées par"///"
(on suppose qu’aucune tâche contient"///"
). La deuxième méthode chargera la liste des tâches (ie, modifiera le tableauto_dos
) en fonction de la représentation passée en paramètre. - Modifier le script
tdl.php
pour permettre de sauvegarder la représentation de la TODO liste dans un cookie lors d’un clic sur un hyperlien (à ajouter dans le script). Modifier l’initialisation de la TODO liste (lorsqu’elle n’est pas dans la session) pour que celle-ci charge la représentation dans le cookie si celui-ci existe. Ajouter un lien supprimant$_SESSION["tdl"]
pour vérifier que la sauvegarde via le cookie fonctionne.
Lorsque tous les exercices de ce TP sont compris et terminés, vous pouvez faire les exercices de révision du premier chapitre.