Cours et exercices pour apprendre le langage PHP étape par étape
![Cours et exercices pour apprendre le langage PHP étape par étape](/images/remos_downloads/id-5560.5560.pdf_thumb_prev.jpg)
Chapitre 1
Sites dynamiques et langage PHP
Une page Web dynamique est une page Web dont le contenu HTML est généré automatiquement à l’aide d’un programme. Ceci est nécessaire lorsque le contenu de la page n’est pas connu à l’avance. À titre d’exemple, les pages Web obtenues via un moteur de recherche sont générées automatiquement en fonction des mots-clés saisis dans la barre de recherche.
Afin de créer des sites dynamiques, nous utiliserons dans ce cours le langage PHP. Ce langage est un langage de scripts interprété au niveau du serveur, permettant de générer du code HTML. Cela modifie alors le traitement d’une requête d’une page Web. Celui-ci se déroule de la manière suivante :
Figure 1.1 – Traitement d’une requête en PHP
1. Le client envoie une requête pour demander au serveur d’interpréter un script PHP. Ceci est fait en saisissant une adresse dont le fichier finit par l’extension .php. C’est le cas lorsque je saisis par exemple l’adresse .
2. Le serveur interprète le fichier PHP, ce qui a pour résultat de générer du code HTML.
3. Le serveur répond en renvoyant le code HTML généré.
4. Le navigateur interprète le code HTML et affiche la page Web.
Souvent, le langage PHP a besoin d’informations pour générer la page HTML. C’est le cas par exemple lorsque la page générée doit afficher la liste des différents messages postés sur un forum. Ces différentes informations (dans cet exemple, les différents messages postés) sont stockées dans une base de données. Lors de l’exécution du script PHP, l’interpréteur PHP va alors automatiquement chercher dans la base de données les informations nécessaires pour générer le code HTML. C’est d’ailleurs le couplage du langage PHP et d’une base de données qui donne toute la force aux sites dynamiques. Ceci sera étudié dans le deuxième chapitre du cours.
1
1.1 Le langage PHP
Le langage PHP est le langage que nous allons utiliser pour générer automatiquement du code HTML. Il existe d’autres langages ayant les mêmes fonctions mais PHP est le plus répandu. Pour que le serveur interprète le langage PHP, il faut bien évidemment qu’un interpréteur PHP soit installé sur le serveur. De plus, il faut impérativement que le fichier contenant du code PHP ait l’extension .php.
Le PHP est un langage serveur, c’est-à-dire que le navigateur est incapable d’interpréter le langage PHP! Il faut donc absolument passer par un serveur afin que celui-ci exécute le code PHP qui générera du code HTML et l’enverra au navigateur.
A l’intérieur d’un fichier .php, le code PHP doit être compris entre les balises <?php et?>. En dehors de ces balises, le seul code autorisé est le langage HTML.
Remarque : Le langage PHP ressemble par certains côtés au langage JAVA. Par exemple, toute instruction se termine par le caractère ";". De plus, les commentaires sont insérés derrière le symbole // (commentaire uniligne) ou entre les symboles /* et */ (commentaire multiligne).
1.1.1 Inclusion de code
Il est possible d’inclure dans un fichier du code venant d’un autre fichier. Ce code peut être du PHP ou du HTML. Ceci permet de découper son code PHP et HTML en plusieurs fichiers de manière logique.
L’inclusion d’un fichier en PHP se fait grâce à la commande require() prenant en paramètre le nom du fichier et son chemin (relatif ou absolu). Par exemple, pour inclure le fichier , contenant le code HTML relatif au menu, dans un autre fichier PHP se trouvant dans le même répertoire sur le serveur, il suffit d’utiliser <?phprequire(''); ?>.
Si l’on souhaite que le fichier ne soit inclus que s’il n’a pas déjà été inclus, on peut utiliser la fonction require_once() plutôt que require().
1.1.2 L’instruction echo
L’instruction echo est l’instruction la plus utilisée. Elle permet de générer du texte lors de l’interprétation du fichier PHP par le serveur. Le texte qui sera généré est entouré par des guillements ou des apostrophes. Ainsi, si le fichier PHP contient le code suivant
<?phpecho '<!doctype html> <html> <head> <title> TITRE OBLIGATOIRE </title> <meta charset="utf-8"/> </head> <body> <p> Hello world </p> </body> </html>'; ?> |
1
2
3
4
5
6
7
8
9 10
11
son interprétation générera le code HTML suivant
<!doctype html> <html> <head> <title> TITRE OBLIGATOIRE </title> <meta charset="utf-8"/> </head> |
1
2
3
4
5
6
<body> <p> Hello world </p> </body> </html> |
7
8
9
10
Le code HTML généré par l’interprétation d’un fichier PHP doit être valide! Autrement dit, il doit satisfaire toutes les règles d’écriture vues l’année dernière. Afin de ne pas surcharger inutilement un fichier PHP d’instructions echo, il est possible de mélanger du code HTML et du code PHP. Dans ce cas, tout ce qui n’est pas du code PHP peut être vu comme faisant partie d’une instruction echo. Ainsi, le même fichier HTML peut être généré grâce au code PHP
<!doctype html> <html> <head> <title> <?phpecho 'TITRE OBLIGATOIRE'; ?> </title> <meta charset="utf-8"/> </head> <body> <p> <?phpecho 'Hello world'; ?> </p> </body> </html> |
1
2
3
4
5
6
7
8
9
10
On remarque que le fichier PHP précédent contient deux portions de code PHP, chacune contenant une unique instruction echo.
1.1.3 Variables
Le nom d’une variable doit commencer par une lettre (majuscule ou minuscule) ou le caractère "_". Il peut ensuite comporter des lettres, des chiffres et le caractère "_". Pour spécifier à l’interpréteur que l’on manipule une variable, on doit toujours mettre le caractère "$" avant le nom de la variable, sans espace entre les deux.
Il n’est pas nécessaire de déclarer une variable avant de l’utiliser. De même, les variables ne sont pas typées, c’est-à-dire que le type de la variable (nombre entier, nombre réel, chaîne de caractères, booléen, etc) est défini lors de son affectation et peut changer à tout moment. Le code PHP
<?php $var = 148; $var = 'Hello world'; $var = 3.14; ?> |
1
2
3
4
5
définit une variable $var. Elle est d’abord de type entier et a pour valeur 148. Elle est ensuite de type chaîne de caractères et a pour valeur 'Hello world'. Elle devient finalement de type flottant avec pour valeur 3.14.
L’interpréteur effectue des conversions automatiques de type sur les variables selon les besoins. Il est cependant possible de les faire manuellement. Pour cela, il suffit d’indiquer le type que l’on souhaite (bool, int, float, string) entre parenthèses avant la valeur. Par exemple, pour convertir une variable entière $a en un nombre réel, on utilise l’instruction $a = (float) $a;.
Remarque : Contrairement à beaucoup d’autres langages, il n’y a pas de division entière en PHP. Ainsi, 3/4 est égal à 0.75. Pour obtenir une valeur entière, il faut caster le nombre en entier selon (int)(3/4), qui prendra la partie entière inférieure de 0.75, soit 0.
Remarque : Une variable booléenne peut seulement prendre les valeurs true ou false.
Important : La fonction isset($var) renvoie true si la variable $var existe, et false sinon.
La fonction unset($var) permet de supprimer la variable $var.
3
L’instruction echo permet également d’écrire, dans le fichier HTML généré, la valeur des variables. Le code PHP
$nom = 'Jean Dupond'; $age = 32; echo '<p> Bonjour '; echo $nom; echo ', vous avez '; echo $age; echo ' ans. </p>'; |
1
2
3
4
5
6
7
générera alors
<p> Bonjour Jean Dupond, vous avez 32 ans. </p> |
1
Remarque : Dans l’exemple précédent et par la suite, afin de ne pas surchager les exemples, seule une partie du code PHP est présentée. Mais il est clair qu’il faut rajouter toutes les instructions nécessaires afin que le fichier HTML soit valide. Par exemple, dans l’exemple précédent, il faut ajouter toutes les balises nécessaires telles que les balises html, head, body. Afin de toujours écrire du code PHP correct, il faut impérativement vérifier que le fichier HTML généré est valide à l’aide d’un validateur.
Remarque : La fonction var_dump() est une fonction PHP très utile lors du débogage d’un programme. Elle prend en paramètre une variable et affiche alors sa valeur et son type. Par exemple, le code $a=3.23; var_dump($a); affiche float(3.23).
1.1.4 Concaténation, apostrophes, guillemets et echo
Il est possible de concaténer des chaînes de caractères pour en former une seule. L’opérateur de concaténation du PHP est le caractère "." qui permet de concaténer deux chaînes de caractères. La concaténation permet notamment de diminuer le nombre d’instructions echo. Par exemple, les quatre instructions echo du code précédent peuvent être remplacées par l’unique instruction
echo '<p> Bonjour ' . $nom . ', vous avez ' . $age . ' ans. </p>'; |
1
Si la chaîne de caractères que je souhaite afficher contient un ou plusieurs caractères apostrophe, il faut alors spécifier que ces derniers ne correspondent pas à la fin de la chaîne de caractères que je souhaite afficher mais à des caractères normaux. Autrement dit, l’interpréteur doit voir ces caractères comme des caractères quelconques. On utilise alors le caractère d’échappement ’\’. Par exemple ’j\’ai 20 ans.’.
Il est aussi possible de délimiter une chaîne de caractères avec les guillemets plutôt que les apostrophes. L’utilisation est similaire, à la différence qu’il est possible d’insérer des variables dans une chaîne de caractères délimitée par des guillemets. L’interpréteur remplacera alors les variables par leurs valeurs. Ainsi, lors de l’exécution du code PHP
$a = 'Jean'; echo '<p> bonjour $a <br />'; echo "bonjour $a </p>"; |
1
2
3
le code HTML généré sera
<p> bonjour $a <br />bonjour Jean </p> |
1
et le navigateur affichera alors
bonjour $a bonjour Jean |
1
2
Si l’affichage des valeurs des variables semble plus simple grâce à l’utilisation des guillemets, cette technique comporte quelques bémols. Ceci ne fonctionne pas si la variable est une case d’un tableau (il faut dans ce cas ajouter des accolades) et il n’est pas possible d’afficher de cette manière le résultat d’un calcul.
Remarque : Par défaut, le code HTML est généré sur une seule ligne. Pour effectuer des retours à la ligne dans le code HTML et le rendre ainsi plus lisible, il faut utiliser le caractère spécial \n dans une chaîne de caractères délimitée par des guillemets (pour qu’il soit interprété). Attention, il ne faut pas confondre ceci avec la balise <br /> qui indique au navigateur d’aller à la ligne lors de l’affichage de la page Web.
I Sur ce thème : Exercice 1
1.1.5 Conditions
Les instructions de contrôle (instructions if) s’utilisent de manière similaire en PHP et en C. La syntaxe est quasiment la même, excepté que le langage PHP possède également l’instruction elseif. Comme en C, si plusieurs instructions doivent être effectuées pour une valeur du test (vrai ou faux), ces instructions doivent être délimitées par des accolades. Voici un exemple d’utilisation de structure de contrôle.
if($a < 0) echo '<p> nombre négatif </p>'; elseif($a < 10) echo '<p> nombre positif ou nul mais inférieur strictement à 10 </p>'; else echo '<p> nombre supérieur ou égal à 10 </p>'; |
1
2
3
4
5
6
Les opérations de comparaisons sont : <, <=, >, >=, ==, !=, ===, !==. Les quatre premiers sont classiques et n’ont donc pas besoin d’explication. Pour tester l’égalité entre deux éléments, il existe deux opérateurs : == et ===. Le premier opérateur renvoie true si les valeurs des deux éléments sont identiques. Pour tester les valeurs, une conversion automatique de type est effectuée si cela est nécessaire. Le deuxième opérateur renvoie true uniquement si les valeurs et les types des deux éléments sont identiques. Voici un exemple d’utilisation des opérateurs == et ===
echo '1.4'==1.4; | //Affiche 1 car le test est vrai |
echo '1.4'===1.4; | //N'affiche rien car le test est faux |
echo 2===2.0; | //N'affiche rien car le test est faux |
1
2
3
Les opérateurs != et !== sont respectivement les opérateurs inverses des opérateurs == et ===.
Une condition peut être définie par plusieurs conditions reliées par les opérateurs logiques and et or. Le non logique est défini par l’opérateur "!".
1.1.6 Boucles
Le langage PHP accepte les instructions for, while et dowhile. Ces boucles s’utilisent de la même manière qu’en langage C. Voici rapidement un exemple de boucles :
echo '<p>'; for($i=0;$i<10;$i++) echo 'itération numéro ' . $i . '<br />'; $i = 0; |
1
2
3
4
5
while($i < 10) { echo 'itération numéro ' . $i . '<br />'; $i++; } $i = 0; do { echo 'itération numéro ' . $i . '<br />'; $i++; } while ($i < 10); echo '</p>'; |
6
7
8
9
10
11
12
13
14
15
16
I Sur ce thème : Exercice 2
1.1.7 Tableaux
Les tableaux regroupent un ensemble de valeurs qui peuvent être de types différents. Chaque valeur est associée à une clé qui permet de retrouver l’élément dans le tableau. Cette clé peut être un entier (par exemple l’indice où se trouve l’élément dans le tableau) ou une chaîne de caractères. Pour accéder à une valeur du tableau, on utilise alors la notation $variableTableau[clé] où clé correspond à la clé associée à la valeur à laquelle on souhaite accéder. On parle de tableau associatif.
Un tableau se déclare à l’aide de crochets. Les différents couples clé/valeur du tableau sont mis entre les crochets et séparés par des virgules. Chaque couple clé/valeur est noté clé => valeur.
//Création d'un tableau contenant le nombre 21 et la chaîne 'toto'. $tableau = [0 => 21, 1 => 'toto']; //Création d'un tableau contenant 4 valeurs : 12, 'rue de la liberté', //'Paris', 75001 $adresse = ['numero' => 12, 'rue' => 'rue de la liberté', 'ville' => 'Paris', 'cp' => 75001]; echo '<p>' . $tableau[0] . '<br />' ; //Affiche 21echo $tableau[1] . '<br />' ; //Affiche totoecho $adresse['numero'] . '<br />' ; //Affiche 12echo $adresse['rue'] . '<br />' ; //Affiche rue de la libertéecho $adresse['cp'] . '<br />' ; //Affiche 75001echo $adresse['ville'] . '</p>' ; //Affiche Paris |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Important : Il n’est pas possible d’accéder aux valeurs d’un tableau à l’aide des indices, à moins que les clés correspondent aux indices comme dans le tableau $tableau. Ainsi, dans l’exemple précédent, $adresse[1] ne correspond pas à 'rue de la liberté', cela ne correspond à rien car il n’y a aucune clé associée à la valeur 1 dans le tableau $adresse.
Remarque : Il est possible de mélanger dans un tableau des clés de type entier et de type chaînes de caractères.
Pour modifier une valeur associée à une clé ou pour ajouter un nouveau couple clé/valeur, il suffit d’affecter à $variableTableau[clé] la nouvelle valeur.
//En reprenant l'exemple précédent $adresse['ville'] = 'Villetaneuse'; $adresse['cp'] = 93430; $adresse['pays'] = 'France'; |
1
2
3
4
5
/* Le tableau adresse contient maintenant les valeurs 12, 'rue de la liberté', 93430, 'Villetaneuse', 'France' */ |
6
7
Il est possible de laisser l’interpréteur PHP associer lui-même la clé à une valeur du tableau. Pour cela, il suffit de ne pas spécifier la clé. Dans ce cas, l’interpréteur recherche, parmi les clés entières du tableau, l’entier le plus grand et associe comme clé ce nombre plus un, si cette valeur correspond un nombre positif ou nul, ou la valeur 0.
$t = [35, 20 => 42, 10 => 27]; $t[] = -6; $t[] = 'hello world'; /* $t contient les valeurs 35, 42, 27, -6, 'hello world'. Les clés associées sont respectivement 0, 20, 10, 21, 22 */ |
1
2
3
4
5
Remarque : Lors du développement ou du débogage, il est possible d’utiliser la fonction print_r() plutôt que var_dump() pour afficher un tableau de manière plus lisible.
I Sur ce thème : Exercice 3
Parcours de tableaux
Pour parcourir un tableau, c’est-à-dire, pour accéder aux couples clés/valeurs d’un tableau, on utilise la boucle foreach selon :
foreach($tableau as $cle => $valeur ) { //Bloc d'instructions } |
1
2
3
La variable $tableau correspond au tableau que l’on veut parcourir. Le bloc d’instructions associé au foreach est exécuté pour chaque case du tableau. À chaque itération, les variables $cle et $valeur contiennent respectivement la clé et la valeur de la case courante. À titre d’exemple, l’exécution du code :
$tab = ['a' => 18, 'b' => 'hello', 'c']; foreach($tab as $c => $v) echo '<p> cle : ' . $c . ', valeur : ' . $v . ' </p>'. "\n" ; |
1
2
3
produit le résultat suivant :
<p> cle : a, valeur : 18 </p> <p> cle : b, valeur : hello </p> <p> cle : 0, valeur : c </p> |
1
2
3
Remarque : Dans l’exemple PHP précédent, 'c' est une valeur du tableau et non une clé. Comme aucune clé n’a été spécifiée pour cette valeur, l’interpréteur PHP lui a associé la clé 0.
Si l’on souhaite n’avoir que les valeurs du tableau, il est possible de supprimer la variable contenant la clé dans le foreach. L’instruction devient alors :
foreach($tableau as $valeur) echo '<p> valeur : ' . $valeur . ' </p>' ; |
1
2
I Sur ce thème : Exercice 4
Fonctions relatives aux tableaux
Il existe plusieurs fonctions relatives aux tableaux qui sont déjà définies en PHP. Voici les plus importantes d’entres elles.
Fonctioncount($tab$) : Cette fonction retourne le nombre de valeurs du tableau $tab.
Fonctionin_array($val,$tab,$strict=false) : Cette fonction renvoie true si la valeur $val est une valeur du tableau $tab, et false sinon. Le troisième paramètre (optionnel) indique si le test de $val avec les différentes valeurs du tableau prend en compte le type. S’il est à true, alors l’opérateur de comparaison est === alors que s’il est à false, l’opérateur utilisé est ==.
Fonctionarray_search($val,$tab,$strict=false) : Cette fonction renvoie la clé associée à la valeur $val dans le tableau $tab si $val est une valeur du tableau, et false sinon. Le troisième paramètre $strict joue le même rôle que pour la fonction in_array().
Tester si une clé existe : Pour tester si $cle est une clé du tableau $tab, il suffit de tester si la valeur associée à cette clé existe en utilisant isset($tab[$cle]).
Supprimer une valeur : La suppression de la valeur $val associée à la clé $cle dans le tableau $tab se fait de la manière suivante : unset($tab[$cle]).
Fonctionarray_sum($tab) : Cette fonction renvoie la somme des valeurs d’un tableau.
Fonctionarray_keys($tab) : Cette fonction renvoie un nouveau tableau dont les valeurs sont les clés du tableau $tab (les clés de ce nouveau tableau correspondent aux indices).
Fonctions de tri : La fonction sort($tab) permet de trier le tableau $tab de la valeur la plus petite à la valeur la plus grande. Les clés du tableau correspondent alors aux indices. Si l’on souhaite garder les clés du tableau $tab, il faut utiliser la fonction asort($tab). Pour trier le tableau selon les clés, il faut alors utiliser la fonction ksort($tab). Enfin, si l’on souhaite trier selon l’ordre inverse, il faut respectivement utiliser les fonctions rsort($tab), rasort($tab) et rksort($tab).
Fonctionimplode($colle,$tab) : Cette fonction retourne une chaîne de caractères constituée des valeurs du tableau collées entre elles avec la chaîne $colle. Ainsi, implode(' : ',['a',2,'c']) retourne la chaîne de caractères 'a : 2 : c'.
Fonctionexplode($delimiteur,$ch) : Cette fonction prend en paramètre deux chaînes de caractères. Elle découpe la chaîne $ch en morceaux qui sont délimités par la chaîne $delimiteur. Elle retourne un tableau dont les valeurs correspondent aux différents morceaux de la chaîne découpée. Ainsi, explode(' ', 'Il fait beau') retourne le tableau ['Il', 'fait', 'beau'].
I Sur ce thème : Exercices 5 et 6
1.1.8 Fonctions
La définition de fonctions se fait de la manière suivante :
function nom_fonction($param1, $param2, ) { //Bloc d'instructions return val; //Pour retourner une valeur } |
1
2
3
4
Pour appeler une fonction, on écrit son nom suivi des valeurs des paramètres entre parenthèses. Voici un exemple de fonction :
<?php //Définition de la fonctionfunction moyenne($tab) { return array_sum($tab) / count($tab); } //Appels de la fonction $res = moyenne([10,20,14,16]); echo '<p> Moyenne = ' . $res . '</p>'; $res = moyenne([1,1,1,4]); echo '<p> Moyenne = ' . $res . '</p>'; ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
L’exécution du code PHP précédent fournit alors le code HTML suivant :
<p> Moyenne = 15</p><p> Moyenne = 1.75</p> |
1
Remarque : Pour retourner plusieurs valeurs, il faut retourner un tableau.
Passage des paramètres d’une fonction
Par défaut, les paramètres d’une fonction sont passés par copie. Ceci signifie que la variable passée en paramètre aura la même valeur avant et après l’appel de la fonction (mais sa valeur peut changer durant l’appel). Ceci est également vrai pour les tableaux passés en paramètre.
function test($nb) { $nb += 5; echo '<p>'. $nb . '</p>'; } $x = 1; echo '<p>'. $x . '</p>'; //Affiche 1 test($x); //Affiche 6echo '<p>'. $x . '</p>'; //Affiche 1 |
1
2
3
4
5
6
7
8
9
Il est possible de passer les paramètres par référence. Pour cela, il faut ajouter le symbole & devant le paramètre. Ceci permet que les modifications de ce paramètre à l’intérieur de la fonction se répercutent en dehors.
function test(&$nb) { $nb += 5; echo '<p>'. $nb . '</p>'; } $x = 1; echo '<p>'. $x . '</p>'; //Affiche 1 test($x); //Affiche 6echo '<p>'. $x . '</p>'; //Affiche 6 |
1
2
3
4
5
6
7
8
9
Variables locales
Il est possible de créer des variables locales dans la fonction. Ces variables seront détruites à la fin de la fonction. Par ailleurs, seules les variables locales et les paramètres sont accessibles dans les instructions de la fonction. Il n’est donc pas possible d’utiliser une variable définie en dehors de la fonction et qui n’est pas passée en paramètre. Une exception cependant : les variables $_GET, $_POST, $_SESSION et $_COOKIE, que l’on verra par la suite, sont accessibles dans la fonction même si elles ne sont pas passées en paramètre.
I Sur ce thème : Exercice 7
1.1.9 Objets
Le langage PHP possède une couche objet dont la syntaxe est très proche de celle du langage JAVA. Le langage PHP implémente donc les classes, l’héritage, les interfaces, etc. Nous donnons ici un rapide aperçu sur l’utilisation de cette couche objet. Les personnes souhaitant acquérir une connaissance plus approfondie sur la programmation orientée objet en PHP pourront trouver des cours et tutoriels sur le Web.
La définition d’une classe se fait à l’aide du mot-clé class suivi du nom de la classe. Les accolades qui suivent contiennent alors les attributs (précédés du symbole $) et méthodes de cette classe. Chaque attribut ou méthode est précédé du mot-clé public, protected ou private suivant qu’il soit public, protégé ou privé.
Rappel : Un attribut (ou méthode) est public s’il est accessible partout dans le programme. Il est privé (respectivement protégé) s’il est accessible uniquement à l’intérieur de la classe (respectivement à l’intérieur de la classe et des ses descendants).
Pour accéder aux attributs d’un objet, on utilise la syntaxe $objet->attribut. À l’intérieur d’une méthode, $this fait référence à l’objet sur lequel est appelée la méthode.
Les attributs ou méthodes statiques (appartenant à une classe et non à un objet) sont précédés du mot clé static. Pour accéder à ces attributs ou méthodes, il faut faire précéder le nom de la méthode ou de l’attribut par le nom de la classe suivi de "::". Les constantes dans une classe sont définies à l’aide du mot-clé const et sont accessibles de la même manière que les attributs statiques.
Voici un exemple de définition et d’utilisation d’une classe en PHP.
classJoueur { public $login; private $score; const NOM_JEU = "Tarot"; public function __construct($ch,$ent) { //Teste si la valeur $ent correspond à un entierif (((string) $ent) === ((string)(int) $ent)) $this->score = $ent; else $this->score = 0; if (trim($ch)!='') $this->login = $ch; else $this->login = 'anonymous'; } public function score() { return $this->score; } public function gagne($score) { if (((string) $score) === ((string)(int) $score)) $this->score += $score; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
} } echo '<p>Jeu : ' . Joueur::NOM_JEU . '</p>'; $j1 = new Joueur('sky',33); $j2 = new Joueur('Dark',755); $j1->gagne(180); echo '<p> Scores : ' . $j1->login . ' a ' . $j1->score() . ' points <br/>'; echo $j2->login . ' a ' . $j2->score() . ' points. </p>'; |
26
27
28
29
30
31
32
33
L’exécution du code précédent affichera :
Jeu : Tarot Scores : sky a 213 points Dark a 755 points. |
1
2
3
4
Remarque : Le constructeur d’une classe est la méthode __construct(). La surchage, qui consiste à définir plusieurs versions d’une même fonction ou méthode avec un nombre différent de paramètres, n’est pas possible en PHP. Par conséquent, il n’y a qu’un constructeur par classe.
Attention : Une variable de type objet ne contient pas l’objet mais uniquement un identifiant de l’objet (ce qui permet de retrouver l’objet). Ainsi, si $a est une variable de type objet, après $b = $a;, $a et $b correspondent au même objet. Ils ont chacun une copie de l’identifiant qui pointe sur le même objet. De même, si je passe un objet en paramètre d’une fonction par copie, les modifications sur cet objet sont globales. Remarque : Une méthode (ou fonction) peut être appelée depuis une variable contenant son nom. Par exemple $methode = "score"; $j1->$methode(); appellera la méthode score de $j1.
I Sur ce thème : Exercice 8
1.2 Transmission d’informations et formulaires
Il est possible de transmettre des informations à un script PHP pour modifier son comportement. Ces informations peuvent être par exemple le nom de l’utilisateur ou les réponses d’un formulaire. Ces informations vont pouvoir modifier le déroulement du script. Elles vont par exemple permettre de créer des pages personnalisées, de sécuriser certaines pages par mot de passe, ou d’afficher les résultats d’un questionnaire.
1.2.1 Ajout d’arguments dans l’url
La méthode la plus simple pour transmettre des informations à un script PHP consiste à les mettre directement dans l’url. Le script récupérera ces informations dans un tableau spécifique nommé $_GET. Dans l’url, il faut alors spécifier un ou plusieurs couples de clés/valeurs selon clé=valeur, les couples étant séparés par le symbole &. Pour différencier l’adresse du fichier des couples clés/valeurs, il faut ajouter le symbole ? avant le premier couple. Chaque couple clé/valeur est appelé paramètre, la clé est appelée nom du paramètre et la valeur valeur du paramètre. Attention, il est obligatoire de préciser une clé pour chaque valeur. Voici un exemple d’url avec transmission d’informations : ?nom=Jean& age=32&etudiant=non. Dans cet exemple, nous avons passé trois paramètres, à savoir nom/Jean, age/32 et etudiant/non. Le script peut alors utiliser ces informations grâce au tableau $_GET. Les valeurs de $_GET sont les valeurs des paramètres, la clé associée à chaque valeur étant le nom du paramètre. Le script peut par exemple afficher les différents couples clés/valeurs dans une liste non ordonnée selon :
echo '<ul>'. "\n"; foreach($_GET as $cle => $val) echo '<li> ' . $cle . ' : ' . $val . ' </li>' . "\n"; echo '</ul>'. "\n"; |
1
2
3
4
Avec l’url précédente, le code HTML généré lors de l’exécution du code PHP précédent serait :
<ul> <li> nom : Jean </li> <li> age : 32 </li> <li> etudiant : non </li> </ul> |
1
2
3
4
5
Pour tester l’existence d’un paramètre de nom nom, on peut utiliser isset($_GET['nom']).
Important : Il faut TOUJOURS VÉRIFIER les valeurs saisies par l’utilisateur. La plupart des failles de sécurité sur le Web viennent de ce manque de vérification. On peut d’abord vérifier que la valeur d’un paramètre n’est pas nulle ou composée uniquement d’espaces. Pour cela, on utilise la fonction PHP trim() qui prend en paramètre une chaîne de caractères et retourne la même chaîne sans les espaces au début et à la fin. Ainsi, un premier test nécessaire pour un paramètre, disons celui associée à la clé nom, serait :
if( isset($_GET['nom']) and (trim($_GET['nom'])!='')) echo '<p> la clé nom existe et sa valeur ne contient pas que des espaces </p>'; |
1
2
3
Remarque : Les valeurs des paramètres sont toujours de type chaînes de caractères. Cependant, cela ne pose aucun problème car PHP gère les conversions automatiques de type.
I Sur ce thème : Exercice 9
1.2.2 Retour à l’HTML : les formulaires
Si le passage d’arguments dans l’url fonctionne correctement, ce procédé n’est pas confortable pour l’utilisateur. Dans le cas d’une inscription sur un site, par exemple, la saisie de toutes les informations dans l’url devient extrêmement fastidieuse à cause du nombre de paramètres. De plus, l’utilisateur ne connaît pas les noms des paramètres que vous souhaitez qu’il saisisse (par exemple : nom et pas name, etc). Un moyen beaucoup plus simple consiste alors à utiliser les formulaires. Les formulaires sont des balises HTML qui permettent à l’utilisateur de saisir uniquement les valeurs des paramères, les noms étant définis directement dans le formulaire. La transmission dans l’url est faite automatiquement lors de la soumission du formulaire. L’utilisation des formulaires est très courante. Les formulaires sont notamment utilisés lors de la création d’un compte (par exemple un compte facebook), lors de l’identification sur un site (comme celui de l’iut), lors de la saisie d’une recherche sur un moteur de recherche, etc. Nous présentons ici différentes balises HTML permettant la création d’un formulaire.
Balise form : Cette balise permet de définir un formulaire. Toute balise définissant un champ de saisie de formulaire doit être comprise entre des balises <form> et </form>. La balise form doit contenir l’attribut action qui indique le nom de la page PHP qui est appelée (et à qui les informations saisies dans le formulaire sont envoyées) lorsque l’utilisateur soumet le formulaire.
Balise input : Cette balise auto-fermante permet de créer des champs de saisie de différents types. Elle doit contenir l’attribut name indiquant le nom du paramètre. De plus, elle possède l’attribut type qui permet de définir le type du champ. Voici les principales valeurs que peut prendre l’attribut type :
— text : indique que le champ est de type texte. La valeur du paramètre sera égale au texte saisi par l’utilisateur.
— password : joue le même rôle que text mais le texte saisi par l’utilisateur est caché. Ceci est utilisé lors de la saisie de mots de passe.
— hidden : indique que le champ ne sera pas affiché ("hidden" signifie "caché" en anglais). Ce type permet de transmettre des informations invisibles pour l’utilisateur.
— radio : indique que le champ est une case à cocher. Ce type de bouton est à utiliser si l’on souhaite que l’utilisateur coche exactement un seul bouton pour une question. C’est le cas pour la civilité : l’utilisateur doit cocher Homme ou Femme. Dans ce cas, on crée deux balises input de type radio ayant le même nom de paramètre (défini par l’attribut name).
Il faut également spécifier pour chaque balise la valeur du paramètre si l’utilisateur coche cette case. Ceci se fait grâce à l’attribut value. Par exemple, on peut avoir :
<p> <input type="radio" name="civilite" value="h" /> Homme <br /> <input type="radio" name="civilite" value="f" /> Femme </p> |
1
2
3
4
Suivant la case cochée, le paramètre sera soit civilite=h, soit civilite=f.
Afin que le bouton soit cliquable même si l’on clique sur le texte à côté, il faut encadrer la balise input et le texte associé par les balises <label> et </label>.
— checkbox : indique que le champ est une case à cocher. Contrairement au bouton radio, la case checkbox permet de cocher autant de cases que l’on souhaite. Dans le cas où l’utilisateur peut cocher plusieurs cases (par exemple : quels langages de programmation utilisez-vous pour le Web?), il existe deux possibilités de programmer ceci. À chaque case à cocher est associé un nom de paramètre (name) différent. De plus, aucune valeur (value) n’est définie. Dans ce cas, si une case est cochée, par exemple celle dont le nom de paramètre est "php", le tableau $_GET contiendra le couple 'php' => 'on'. Autrement, il est possible de définir le même nom de paramètre (name) à chacune des cases à cocher. L’attribut value est alors utilisé pour indiquer quelle valeur sera renvoyée si la case est cochée. Comme l’utilisateur peut cocher plusieurs cases, il peut y avoir plusieurs valeurs pour un même nom de paramètre. Dans ce cas, il faut spécifier que la valeur associée au nom est un tableau. On indique ceci en HTML en ajoutant les crochets après le nom du paramètre dans la valeur de l’attribut name. Par exemple, on peut avoir :
<p> <input type="checkbox" name="langage[]" value="HTML" /> HTML <br /> <input type="checkbox" name="langage[]" value="css" /> CSS <br /> <input type="checkbox" name="langage[]" value="php" /> PHP <br /> <input type="checkbox" name="langage[]" value="javascript" /> Javascript </p> |
1 2
3
4
5
6
Si l’utilisateur sélectionne les cases associées à HTML, CSS et PHP, la valeur associée à la clé langage dans le tableau $_GET sera ['HTML','css','php'].
— submit : permet de soumettre le formulaire. On peut ajouter un attribut value dont la valeur correspondra au texte affiché sur le bouton (exemple : value="Envoi du formulaire").
On peut ajouter un attribut name pour ajouter un paramètre lors de la soumission du formulaire avec ce bouton submit. Sa valeur correspond à l’attribut value. Ceci est utile s’il y a plusieurs boutons submit dans un même formulaire.
Balise select : Cette balise permet de créer un menu déroulant pour que l’utilisateur saisisse une réponse parmi un ensemble prédéfini. La balise select utilise l’attribut name qui donne le nom du paramètre. Chaque valeur possible du paramètre est définie grâce à la balise option. Si l’attribut value est dans la balise ouvrante option, il indique alors la valeur du paramètre si la réponse associée est choisie. Dans le cas contraire, la valeur renvoyée est celle comprise entre <option> et </option>. Voici un exemple d’utilisation de la balise select :
<select name="pays"> <option value="en"> England </option> <option value="fr"> France </option> <option value="it"> Italia </option> </select> |
1
2
3
4
5
Si l’utilisateur choisit la réponse Italia lors de la soumission du formulaire, le paramètre associé sera pays=it.
Balise textarea : Cette balise permet la saisie d’un texte plus long que la balise input de type text. Les attributs obligatoires sont : name correspondant au nom du paramètre (la valeur du paramètre est le texte saisi par l’utilisateur), cols et rows qui donnent respectivement le nombre de colonnes et de lignes utilisées pour l’affichage de la zone de saisie du texte. Voici maintenant un exemple de formulaire :
1
2
3
4
<form action=""> <p> Nom : <input name="nom" type="text" /> <br /> Prénom : <input name="prenom" type="text" /> <br /> Civilité : <br /> <label> <input name="civilite" type="radio" value="h"/> Homme </label> <br <label> <input name="civilite" type="radio" value="f"/> Femme </label> <br <input type="submit" /> </p> </form> |
5 />
6 />
7
8
Voici maintenant le code PHP du fichier permettant d’utiliser les informations reçues lors de la soumission du formulaire précédent pour "souhaiter la bienvenue" à l’utilisateur :
if (isset($_GET['nom']) and isset($_GET['prenom']) and isset($_GET['civilite' and trim($_GET['nom'])!='' and trim($_GET['prenom'])!='' and trim($_GET['civilite'])!='') { if($_GET['civilite']=='h') echo '<p> Bienvenue Mr '; else echo '<p> Bienvenue Mme '; echo $_GET['prenom'] . ' ' . $_GET['nom'] . ' </p>' . "\n"; } else echo '<p> Problème lors de la saisie du formulaire </p>'; |
1])
2
3
4
5
6
7
8
9
10
11
Si l’utilisateur saisit "Jean" pour le prénom, "Dupond" pour le nom, et coche la case associée à Homme, la soumission du formulaire générera, avec le code PHP précédent, le code HTML :
<p> Bienvenue Mr Jean Dupond </p> |
1
I Sur ce thème : Exercice 10
1.2.3 Utilisation de $_POST
Lors de la soumission du formulaire avec la méthode précédente, les paramètres se trouvent dans l’url. Ceci n’est pas forcément très lisible et il peut être préférable de cacher ces éléments. Dans ce cas, il suffit d’utiliser la méthode post dans la déclaration du formulaire, par exemple : <form action="" method="post">. Les informations saisies dans le formulaire n’apparaissent alors plus dans l’url. Elles sont cependant récupérables dans le script appelé lors de la soumission du formulaire (ici ) dans le tableau $_POST. Elles n’apparaissent par contre plus dans le tableau $_GET.
1.2.4 Variable $_SESSION
Les sessions permettent de stocker des informations sur le serveur "le temps de la connexion de l’utilisateur sur le site". Plus précisément, si les sessions sont activées, lorsqu’un utilisateur se connecte, une variable globale $_SESSION (tableau) est créée sur le serveur pour cet utilisateur si elle n’existait pas déjà. De cette manière, il y a une variable $_SESSION par utilisateur. Les données stockées dans la variable $_SESSION sont accessibles pour tous les scripts (activant les sessions) que l’utilisateur exécute sur le site.
Les informations stockées dans la variable $_SESSION sont automatiquement détruites lorsque l’utilisateur n’accède plus au serveur pendant un certain temps. Cette durée dépend de la configuration du serveur. Elle est de l’ordre d’une demi-heure.
Pour activer les sessions, il faut ajouter sur la première ligne des fichiers PHP où vous souhaitez utiliser la variable $_SESSION l’instruction :
<?php session_start(); ?> |
1
Voici un exemple (incomplet) d’utilisation de la variable $_SESSION. Lorsque l’utilisateur se connecte à un site via un formulaire, si la connexion réussit, le script appelé lors de la soumission du formulaire peut alors stocker les informations dans la variable $_SESSION :
//Code PHP exécuté lors de la soumission du formulaire //On teste si l'utilisateur a correctement saisi son nom et son prénomif( isset ($_POST['nom']) and isset($_POST['prenom']) and trim($_POST['nom'])!="" and trim($_POST['prenom'])!="" ) { echo '<p> Connexion réussie </p>'; $_SESSION['nom'] = $_POST['nom']; $_SESSION['prenom'] = $_POST['prenom']; $_SESSION['connecte'] = true; } |
1
2
3
4
5
6
7
8
9
10
Les informations stockées dans la variable $_SESSION sont relativement sûres. (Le risque zéro n’existe pas!) En effet, comme ces informations sont stockées sur le serveur, il est difficile de pirater ces informations si le site est correctement configuré.
I Sur ce thème : Exercice 11
1.2.5 Utilisation des cookies
Il est possible de stocker des informations sur le client dans des fichiers appelés cookies. Ces informations ne sont donc pas du tout sécurisées puisque l’utilisateur peut modifier les cookies à la main. Ces fichiers ne servent donc qu’à stocker des informations non confidentielles. L’intérêt de ces fichiers est qu’ils peuvent être stockés autant de temps que nécessaire. C’est au moment de la création du cookie que l’on spécifie sa date d’expiration.
Comme il est possible de créer plusieurs cookies pour un même utilisateur, on stockera une unique information dans un cookie. La création d’un cookie se fait à l’aide de la fonction
<?php setcookie(nom, valeur, date_expiration, null, null, false, true); ?> |
1
2
3
qui doit être appelée avant tout envoi de code HTML, c’est-à-dire, avant tout code HTML et avant toute instruction echo. Si cette fonction peut paraître très compliquée à cause du nombre de paramètres, elle s’utilise très facilement. Les deux premiers paramètres sont des chaînes de caractères contenant respectivement le nom et la valeur du cookie. La date d’expiration est donnée par la fonction PHP time() plus la durée en secondes du temps de conservation du cookie. Les autres valeurs de paramètres sont toujours identiques.
Ainsi, si je souhaite créer un cookie contenant le pseudo d’un utilisateur, disons toto, et que je souhaite que ce cookie soit automatiquement supprimé au bout d’une semaine, je dois alors appeler la fonction setcookie() de la manière suivante :
1 setcookie('pseudo', 'toto', time() + 7 * 24 * 3600, null, null, false, true);
Pour modifier la valeur d’un cookie, il suffit de recréer le cookie, l’ancien étant automatiquement supprimé.
Les informations contenues dans les cookies peuvent être récupérées à l’aide du tableau $_COOKIE.
Si je souhaite récupérer et afficher la valeur du cookie précédent, je dois alors écrire
echo '<p> Bienvenue ' . $_COOKIE['pseudo'] . '</p>'; |
1
Remarque : Comme les cookies présents sur le client sont chargés avant toute instruction PHP, un cookie créé avec la fonction setcookie() ne sera pas visible (i.e., n’apparaîtra pas dans le tableau $_COOKIE) avant le prochain chargement de page.
I Sur ce thème : Exercice 12
1.3 Expressions régulières en PHP
Il est très important de vérifier que les données saisies par l’utilisateur sont correctes et cohérentes. En effet, si l’on demande l’âge de quelqu’un, il faut que la valeur saisie soit un nombre. De même, si vous demandez une adresse e-mail, il faut vous assurer que la saisie contient le symbole "@". Ceci peut être fait à l’aide des expressions régulières.
Il existe deux types d’expressions régulières : POSIX et PCRE. Celles-ci sont similaires, seules quelques règles d’écriture et fonctionnalités diffèrent. Nous décrivons ici les expressions régulières de type PCRE. Les explications données ici sont loin d’être exhaustives. Il est possible d’obtenir plus d’informations sur l’utilisation des expressions régulières sur le Web.
Une Expression Régulière (ER) représente toutes les chaînes vérifiant certaines propriétés. Des exemples d’ER sont :
— toutes les chaînes non vides composées uniquement de chiffres,
— toutes les chaînes de caractères contenant le symbole "@" et se terminant par les caractères ".fr" ou ".com",
— toutes les chaînes de caractères commençant par "http ://" et se terminant par ".org".
On dit qu’une chaîne de caractères satisfait l’expression régulière si elle appartient à l’ensemble des chaînes représentées par l’ER. Ainsi, la chaîne "" satisfait l’ER correspondant au deuxième exemple, contrairement à la chaîne "".
Les expressions régulières sont écrites sous forme de chaînes de caractères, en respectant plusieurs règles. Tout d’abord, une ER est délimitée au début et à la fin par le symbole "#". Voici plusieurs exemples d’ER :
— "#php#"
— "#p.*p#"
— "#ˆ[0-9]+$#"
— "#@.*\.(fr|com)$#"
— "#ˆhttp://.*\.org$#"
Le premier exemple d’expression régulière correspond à toutes les chaînes contenant la suite de caractères "php". Le deuxième correspond à toutes les chaînes contenant au moins deux lettres "p". Les chaînes "php" et "aerlkjperep" satisfont donc la deuxième ER. Les trois derniers exemples correspondent à la traduction des trois exemples donnés en toutes lettres ci-dessus.
L’écriture des ER utilise des caractères spéciaux qui sont des caractères ayant une signification particulière. Ceux-ci sont présentés dans le tableau 1.2.
Caractère spécial | Signification |
. | représente un caractère quelconque |
? | ce qui précède doit apparaître 0 ou 1 fois |
* | ce qui précède peut apparaître 0, 1 ou plusieurs fois |
+ | ce qui précède doit apparaître au moins une fois |
ˆ | ce qui suit correspond au début de la chaîne |
$ | ce qui précède correspond à la fin de la chaîne |
[ ] | définit un ensemble de caractères possibles |
( ) | définit une séquence de caractères |
\ | le caractère spécial suivant doit être considéré comme un caractère normal |
| | opérateur OU logique |
{n} | ce qui précède doit apparaître exactement n fois |
{n,m} | ce qui précède doit apparaître entre n et m fois |
Figure 1.2 – Tableau des caractères spéciaux et de leurs significations
Les caractères spéciaux et le caractère "#" apparaissant dans l’ER comme un caractère quelconque doivent alors être échappés, c’est-à-dire précédés du symbole ’\’. Ainsi, l’expression régulière "#faire\?$#" représente l’ensemble des chaînes se terminant par la suite de caractères ’faire?’, alors que l’ER "#faire?$#" correspond à l’ensemble des chaînes se terminant par ’fair’ ou ’faire’. Il y a une exception lorsque le caractère spécial est entre crochets; dans ce cas, il ne faut pas utiliser le symbole ’\’. Ainsi, l’ER "#faire[.?]$#" correspond à l’ensemble des chaînes terminant par ’faire.’ ou ’faire?’. Cependant, les caractères ’#’ et ’]’ doivent quand même être échappés à l’intérieur des crochets.
Le tiret peut être utilisé à l’intérieur des crochets afin de spécifier un intervalle. Ainsi, les ER "#ˆ[abcdef]#" et "#ˆ[a-f]#" sont équivalentes et représentent l’ensemble des chaînes commençant par l’une des six premières lettres de l’alphabet. Si l’on souhaite qu’un des caractères possibles entre les crochets soit un tiret, il faut que celui-ci soit placé en début ou fin. L’ER "#ˆ[af-]#" correspond à l’ensemble des chaînes commençant par la lettre ’a’, la lettre ’f’ ou le tiret.
Les expressions régulières peuvent être utilisées en PHP pour vérifier si une chaîne de caractères satisfait une expression régulière, ou pour remplacer dans une chaîne de caractères toute partie satisfaisant une ER par une autre chaîne. Ceci se fait à l’aide des deux fonctions PHP suivantes.
Fonctionpreg_match(er,ch) : Cette fonction retourne true si la chaîne ch satisfait l’expression régulière er, et false sinon. L’instruction preg_match('#p.p#','vive le php'); retourne donc true.
Cette fonction admet également un troisième paramètre utilisé lorsque la chaîne ch satisfait l’expression régulière er. Ce paramètre est un tableau et permet de récupérer certaines parties de la chaîne ch satisfaisant l’ER. La première case de ce tableau contiendra la partie de la chaîne satisfaisant exactement l’ER. Les cases suivantes contiendront les parties de cette chaîne satisfaisant exactement les parties de l’ER entre les différentes parenthèses. Ainsi, après preg_match('#^{}([a-zA-Z]+) a ([0-9]{1,3})#','Pierre a 20 ans.',$res);, le tableau $res contiendra les valeurs :
— $res[0] : 'Pierre a 20', — $res[1] : 'Pierre', — $res[2] : '20'.
Certaines expressions régulières complexes nécessitent l’utilisation de nombreuses parenthèses. Dans ce cas, le troisième paramètre contient beaucoup de cases dont certaines n’ont pas beaucoup d’intérêt. Il est alors possible de spécifier que ce troisième paramètre ne contienne pas certaines valeurs associées à certaines parenthèses. Pour cela, il suffit de faire suivre la parenthèse ouvrante par les symboles?:. Après l’exécution du code
preg_match('#^(?:(?:e-mail|email) *:)? *([a-zA-Z0-9]+)@.*$\backslash$.fr$#', '',$res); |
1
2
le tableau $res contiendra les valeurs : — $res[0] : '', — $res[1] : 'toto'.
Fonctionpreg_replace(er,remplacement,ch) : Cette fonction remplace tous les motifs de l’expression régulière er trouvés dans la chaîne de caractères ch par la chaîne de caractères remplacement. La fonction retourne la nouvelle chaîne de caractères ainsi obtenue. L’instruction echo preg_replace('#p.p#','PHP','les papillons papillonnent'); affichera alors les PHPillons PHPillonnent.
Références
Vous pouvez trouver de nombreux cours et tutoriels sur le Web. Voici quelques liens intéressants :
— le site PHP (manuel) (), — le site PHP facile ().
18
TD1 : PHP
Exercice 1 : Variables et conversion
Question 1.1 : Qu’affiche le code suivant?
var_dump(1 + 2) ; echo '<br/>'; var_dump('1'+ '2'); echo '<br/>'; var_dump(1 . 2) ; echo '<br/>'; var_dump('1'. '2'); echo '<br/>'; var_dump("3 fruits" + '1 légume' . 'donnent'); echo '<br/>'; var_dump("3 fruits" . '1 légume' + 'donnent'); echo '<br/>'; var_dump(1/2 + true - "-2");echo '<br/>'; |
1
2
3
4
5
6
7
Question 1.2 : Considérons les variables $voitures = 3; $motos = 6;. Afficher, à l’aide d’une seule instruction PHP, le paragraphe : J’ai 3 voitures et 6 motos, j’ai donc 9 véhicules. Les nombres 3, 6 et 9 dépendent des valeurs des variables données précédemment. Le faire une fois en utilisant uniquement les apostrophes et une fois en utilisant uniquement les guillemets.
Exercice 2 : Boucles
Écrire la table de multiplication de 7 (de 1 à 10). Cette table sera présentée d’abord sous forme d’une liste non ordonnée puis sous la forme d’une table HTML.
Exercice 3 : Tableaux
Question 3.1 : Soit le tableau $t = ['a'=>'z', 10=>20, 'toto'=>'titi', 'php']. Quelles sont les clés du tableau? Quelles sont les valeurs?
Question 3.2 : Définir une variable de type tableau. Ce tableau devra contenir tous les types de données PHP possibles pour les clés et pour les valeurs.
Question 3.3 : Ajouter à ce tableau deux valeurs 'jour' et 'nuit'. La clé associée à la première valeur sera 'bon'. La deuxième clé sera donnée par l’interpréteur PHP. Quelle clé donnera-t-il?
Exercice 4 : Parcours de tableaux
Le tableau suivant donne les noms des étudiants et leur note en PHP.
$tabE1 = [ 'Frédérique' => 12, 'Silvia' => 3, 'Julien' => 19, 'Lionel' => 12, 'Mario' => 12, 'Andrea' => 9, 'Gérard' => 3 ]; |
1
2
3
4
5
6
7
8
9
Question 4.1 : Afficher sous forme d’une liste ordonnée les noms des différents étudiants.
Question 4.2 : Afficher sous forme d’une table HTML les noms et les notes des étudiants.
Question 4.3 : Créer un autre tableau $tabE2 dans lequel les notes sont maintenant les clés.
Question 4.4 : Refaire les deux premières questions avec le tableau $tabE2.
Exercice 5 : Fonctions sur les tableaux I
Considérons le tableau suivant.
$anneeScolaire = [ "Rentrée" => [5,9,2016], "Vacances Toussaint" => [ "début" => [22,10,2016], "fin" => [30,10,2016] ], "Vacances Noël" =>[ "début" => [17,12,2016], "fin" => [2,1,2017] ], "Vacances d'hiver" =>[ "début" => [11,2,2017], "fin" => [19,2,2017] ], "Vacances de printemps" =>[ "début" => [1,4,2017], "fin" => [9,4,2017] ], "Fin des cours" => [8,7,2017] ]; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Écrire le code permettant d’obtenir l’affichage suivant.
- Rentrée : 5/9/2016 - Vacances Toussaint : du 22/10/2016 au 30/10/2016 - Vacances Noël : du 17/12/2016 au 2/1/2017 - Vacances d'hiver : du 11/2/2017 au 19/2/2017 - Vacances de printemps : du 1/4/2017 au 9/4/2017 - Fin des cours : 8/7/2017 |
1
2
3
4
5
6
Remarque : On utilisera uniquement deux boucles foreach imbriquées ainsi que les fonctions count et implode.
Exercice 6 : Fonctions sur les tableaux II
Question 6.1 : Qu’affiche le code suivant?
$tab = [ 2 => 'test', 0 => 'nombre' ]; if (in_array(2, $tab)) echo '<p> in_array : 2 est dans le tableau </p>'; if(in_array('nombre', $tab)) echo '<p> in_array : nombre est dans le tableau </p>'; |
1
2
3
4
5
6
7
Question 6.2 : Dans le if, peut-on remplacer in_array par array_search?
Exercice 7 : Fonctions
Considérons le tableau suivant :
$joueurs = [ ['nom' => 'Mehwish', 'score' => 150], ['nom' => 'Laurent', 'score' => 120], ['nom' => 'Ines', 'score' => 98], ['nom' => 'Sondes', 'score' => 153], ['nom' => 'Davide', 'score' => 118] ]; |
1
2
3
4
5
6
7
Écrire une fonction meilleur_joueur() prenant en paramètre un tableau ayant la même structure que le tableau $joueurs et retournant un tableau contenant le nom et le score du meilleur joueur.
Exercice 8 : Objets
Définir une classe Compte représentant un compte bancaire. Cette classe contiendra deux attributs privés, montant et interet (annuel), un constructeur prenant en paramètre un montant initial et un intérêt, une méthode get_montant retournant le montant du compte, ainsi qu’une méthode un_an modifiant le montant du compte au bout d’un an en fonction de l’intérêt.
Créer deux comptes, un d’un montant de 200 euros à 20% et l’autre d’un montant de 1000 euros à 2%. Afficher le montant de chaque compte au bout de 10 ans.
Exercice 9 : Passage de paramètres dans l’url
Question 9.1 : Créer un script qui teste s’il existe un paramètre de nom nombre.
Si c’est le cas, alors le script teste si sa valeur est un nombre ou pas et affiche cette information.
Question 9.2 : Donner l’url appelant le script en lui passant le nombre 25. On suppose que se trouve sur le serveur serveurWeb à la racine.
Exercice 10 : Formulaire
Créer un formulaire avec un champ de type texte (pour saisir un nombre) et un bouton submit.
La soumission du formulaire appellera le fichier défini dans l’exercice précédent.
Exercice 11 : Sessions
On suppose que le formulaire précédent est dans le fichier défini dans l’exercice 9. Question 11.1 : Utiliser les sessions pour faire l’addition des nombres saisis dans le formulaire.
Question 11.2 : Modifier le code de manière à pouvoir réinitialiser la somme des nombres en appuyant sur un autre bouton de type submit.
Exercice 12 : Cookies
A l’aide des cookies, modifier le script précédent pour qu’à chaque fois que l’on réinitialise une somme, la valeur de cette somme (si elle est non nullle) soit stockée dans un cookie. Afficher à la fin du script la valeur de la dernière somme calculée avant réinitialisation si cette information est disponible.
Exercice 13 : Expressions régulières
Question 13.1 : 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.
Question 13.2 : Parmi les différents ensembles de chaînes de caractères, lequel contient uniquement des chaînes satisfaisant l’expression régulière '#^[bon]?j+(our)?#'?
'bonjour', 'jour', 'j'
'bjour', 'jour', 'jr'
'our', 'jour', 'j'
Question 13.3 : Parmi les différents ensembles de chaînes de caractères, lequel contient uniquement des chaînes satisfaisant l’expression régulière '#^a.b(ba{3}|c)$#'?
'a.bc', 'abc', 'anbc'
'a.bc', 'aabbaaa', 'anbc'
'aabc', 'aabbababa', 'anbc'
[1] . Ce cours nécessite de connaître les langages HTML et CSS vus l’année dernière. Pour réviser ces deux langages, vous pouvez notamment lire le cours HTML/CSS se trouvant sur la page .
. par exemple
[3] . Pendant l’exécution d’une fonction/méthode, on peut par contre connaître le nombre de paramètres passés lors de son appel.
[4] . Il est possible de détruire dans le code une session sans attendre, comme cela est fait lorsque l’utilisateur se déconnecte du site de l’IUT par exemple.
[5] . Il est possible de choisir un autre symbole délimiteur.
16