Sunteți pe pagina 1din 19

IUT de Villetaneuse

TP2 : PHP (Corrig)


Exercice 1 : Premiers pas en PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Voici un exemple de code PHP.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
< title > <?php echo Premiers pas en PHP; ?> </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1> Mes premiers pas en PHP </h1>
<?php $temps=2; echo <p> Je dbute depuis ; echo $temps; echo heures... </p>; ?>
<p> Mais cela a lair intressant <?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, cest termin! </p>
</body>
</html>

Rpondre aux questions suivantes :

1. Donner dans ce chier les parties correspondant du code PHP et du code XHTML.
2. Si ce chier sappelle exo1.php, et sil est stock sur le site Web www.exemple.org dans le
rpertoire PremierTP, comment "excuter" ce chier ? Que donne son excution ? Ceci est-il
valide ? Pourquoi ? Corriger alors le problme.
3. Remplacer les trois instructions echo de la ligne 10 par une seule.
Correction :
1. XHMTL : lignes 1-4, balises ouvrantes et fermantes title de la ligne 5, lignes 6-9, dbut et n de la ligne
11, lignes 16-20. Le reste est du PHP.
2. Avec un navigateur, taper lurl http://www.exemple.org/PremierTP/exo1.php. Linterprtation du code PHP
produit du code XHTML. Le rsultat de linterprtation de ce code donne
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
< title > Premiers pas en PHP </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1> Mes premiers pas en PHP </h1>
<p> Je dbute depuis 2 heures... </p><p> Mais cela a lair intressant ! </p>
<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, cest termin! </p>

Mathieu LACROIX


76

Introduction Web, 1re anne

Dpartement informatique

16
17

</body>
</html>

Le code XHTML gnr nest pas valide car il contient du texte (echo et ;) qui nest contenue dans
aucune balise de type block. Pour corriger cela, il faut ajouter <?php au dbut de la ligne 17 et ?> la n
de cette mme ligne.

3. echo <p> Je dbute depuis . $temps . heures... </p>;

Exercice 2 : Inclusion den-tte et pied de page

Le langage PHP permet dinclure des chiers dans dautres. Ceci permet alors de dcomposer
un code XHTML ou PHP en plusieurs parties logiques et dinsrer ensuite ces direntes parties
dans un chier PHP. Utiliser linclusion de chiers pour sparer, dans le chier prcdent, le corps
du document du reste. Quel est lintrt dune telle dcomposition ?
Correction :

Fichier debut.php :

1
2
3
4
5
6
7
8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
< title > Premiers pas en PHP </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

Fichier fin.php :

1
2

</body>
</html>

Fichier exo2.php :

1
2
3
4
5
6
7
8
9

<?php require(debut.php); ?>


<h1> Mes premiers pas en PHP </h1>
<p> Je dbute depuis 2 heures... </p><p> Mais cela a lair intressant ! </p>
<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, cest termin! </p>
<?php require(fin.php); ?>

Intrts : clarication du code, dcomposition en parties logiques, les parties dun site Web qui ne bougent pas et
sont prsentes dans toutes les pages Web du site peuvent tre crites une seule fois.

Exercice 3 : Achage des carrs de tous les nombres entre 1 et 30*

Crer une page PHP permettant dacher, sous forme de liste non ordonne, les carrs des
nombres de 1 30 selon le format :
12 = 1
22 = 4
...
302 = 900
Utiliser dabord linstruction echo avec des apostrophes puis avec des guillemets.
Remarque : Pour mettre du texte en exposant en XHTML, il est possible dutiliser la balise sup.

Introduction Web, 1re anne


77

Mathieu LACROIX

IUT de Villetaneuse

1
2
3
4
5
6
7
8
9

Crer ensuite une fonction prenant en paramtre un nombre n et retournant la chane de


caractres n2 = m. Utiliser cette fonction pour produire la mme page Web.
Correction :

<?php require(../Exo2/debut.php); ?>


<h1> Suite de carrs </h1>
<ul>
<?php
for ($i = 1; $i < 31 ; $i++)
echo <li> . $i . <sup> 2 </sup> = . $i * $i . </li>. "\n";
?>
</ul>
<?php require(../Exo2/fin.php); ?>

Instruction echo avec des guillemets : echo "<li> $i <sup> 2 </sup> =". $i*$i . "</li>\n";.

1
2

<?php

3
4
5

function chCarre($nb)
{
return $nb . <sup>2 </sup> = . $nb * $nb ;
}

6
7
8
9

for ($i = 1; $i < 31 ; $i++)


echo <li> . chCarre($i) . "</li>\n";
?>

Exercice 4 : Table de multiplication*

Crer un script PHP permettant dacher la table de multiplication donne par la gure 3.3.

Figure 3.3 Table de multiplication


Loprateur modulo (symbole %) permet de donner le reste de la division entire. Pour dterminer si une ligne est paire ou impaire, il sut alors de regarder la valeur du numro de ligne
modulo 2.
Mathieu LACROIX


78

Introduction Web, 1re anne

Dpartement informatique

1
2

< table >


<?php

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

Correction :

$n=10;
for($ligne=1;$ligne<$n;$ligne++)
{
if($ligne%2)
$class =impair;
else
$class =pair;
echo <tr class=". $class. ">;
for($col=1;$col<$n;$col++)
{
if($ligne==1 || $col==1)
$cellule =th;
else
$cellule =td;
echo "<$cellule>";
if(($ligne!=1) and ($ligne==$col))
echo <strong>;
if($ligne!=1 || $col!=1)
echo $ligne *$col;
if(($ligne!=1) and ($ligne==$col))
echo </strong>;
echo "</$cellule>";
}
echo "</tr>\n";
}

?>
</table>

CSS :

1
2

table
{

3
4

border- collapse : collapse ;

5
6
7

th,td
{

8
9
10
11
12

border : 1px solid black;


width : 40px;
height : 40px;
text - align : center;

13
14
15

th
{

16
17

background-color : #D48030;

18
19
20

.impair
{

21
22

background-color : #BEA58E;

23
24
25

. pair
{
Introduction Web, 1re anne


79

Mathieu LACROIX

IUT de Villetaneuse

26
27

background-color : #EBD9C8;

Exercice 5 : Initiation aux tableaux

1
2
3

Crer un tableau ayant pour valeur les noms des douze mois de lanne. Quelles sont alors les
cls ? Parcourir ensuite le tableau pour acher les mois de lanne sous forme de liste ordonne.
Correction :

<?php
$mois = array(janvier,fvrier,mars,avril,mai,juin,
juillet,aot,septembre,octobre,novembre,dcembre);

4
5
6
7
8
9

echo <ol>;
foreach ($mois as $m)
echo <li> . $m . "</li>\n";
echo </ol>;
?>

Les cls sont les entiers 0,1,...,11. (Attention, les indices attribus automatiquement commencent 0 !)

1
2
3

Crer un tableau associant chaque mois de lanne le nombre de jours du mois. (On supposera
que lanne nest pas bissextile.) Quelles sont alors les cls ? Les valeurs ? Acher, sous forme de
tableau, le nombre de jours de chaque mois.
Correction :

$jourMois = array(janvier=>31, fvrier => 28, mars =>31, avril => 30, mai => 31,
juin => 30, juillet => 31, aot => 31, septembre => 30, octobre => 31,
novembre => 30, dcembre => 31);

4
5
6
7
8

echo <table> <tr> <th> Mois </th> <th> Nombre de jours </th> </tr>."\n";
foreach ($jourMois as $m => $nbJ)
echo <tr> <td> . $m . </td><td> . $nbJ . " </td> </tr>\n";
echo </table>;

Les cls sont les noms des mois de lanne et les valeurs les nombres de jours par mois.

Exercice 6 : Tableau deux dimensions

1
2
3
4
5
6
7
8

On dnit le tableau suivant :

$personnes = array(
mdupond=> array(prenom => Martin, nom => Dupond, age => 25, ville => Paris),
jm=> array(prenom => Jean, nom => Martin, age => 20, ville => Villetaneuse),
toto=> array(prenom => Tom, nom => Tonge, age => 18, ville => Epinay),
arn=> array (prenom => Arnaud, nom => Dupond, age => 33, ville => Paris),
email=> array(prenom=>Emilie, nom=>Ailta, age=>46, ville=>Villetaneuse),
dask => array(prenom=>Damien, nom=>Askier,age=>7,ville=>Villetaneuse)
);

Question 6.1 : Quelles sont les cls du tableau $personnes et leur type ? De quel type sont les
valeurs de ce tableau ? Quelle est la valeur associe toto ?

Question 6.2 : Comment accder la valeur 33 dans le tableau ? la valeur Epinay ? Au


tableau contenant les valeurs Damien, Askier, 7, Villetaneuse ?
Mathieu LACROIX


80

Introduction Web, 1re anne

Dpartement informatique

Question 6.3 : crire une fonction permettant dacher le tableau dans son ensemble. Ajouter
une premire ligne contenant les cls prenom, nom, age et ville. Ajouter ensuite un
chier CSS an dobtenir le tableau donn par la gure 3.4.

Figure 3.4 Tableau dinformations de personnes


Question 6.4 : crire une fonction permettant dacher sous forme de tableau (en utilisant
toujours le CSS), les informations des personnes habitant dans une ville donne en paramtre.
Par exemple, si la fonction est appele avec le tableau $personnes dni prcdemment et la ville
Epinay, le tableau ach doit alors contenir uniquement la ligne relative toto.
Correction :
Les cls sont de type chanes de caractres et les direntes valeurs de cls sont : mdupond, jm, toto, arn,
email et dask. Les valeurs du tableau sont de type tableau. La valeur associe toto est le tableau :
array(prenom => Tom, nom => Tonge, age => 18, ville => Epinay).
Pour accder la valeur 33, crire : $personnes[arn][age].
Pour accder Epinay, crire : $personnes[toto][ville].
Pour accder au tableau $personnes[dask].

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
26

function achageTableau ($personnes)


{
echo <table>."\n";
$ligne = 0;
foreach ($personnes as $pseudo => $info)
{
if($ligne==0)
{
echo <tr>."\n";
foreach ($info as $c => $v)
echo <th> . $c . </th> ;
echo </tr>."\n";
$ligne ++;
}
if($ligne%2==1)
$class = impair;
else
$class = pair;
echo <tr class=". $class .">."\n";
foreach ($info as $v)
echo <td> . $v . </td> ;
echo </tr>."\n";
$ligne ++;
}
echo </table>."\n";
}
function

achageHabitantsVille ($personnes, $ville )

Introduction Web, 1re anne


81

Mathieu LACROIX

IUT de Villetaneuse

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

echo <table>."\n";
$entete = true;
foreach ($personnes as $pseudo => $info)
{
if($entete)
{
echo <tr>."\n";
foreach ($info as $c => $v)
echo <th> . $c . </th> ;
echo </tr>."\n";
$entete = false ;
}
if($info[ville]==$ville)
{
echo <tr>."\n";
foreach ($info as $v)
echo <td> . $v . </td> ;
echo </tr>."\n";
}
}
echo </table>."\n";

La deuxime fonction peut tre modie pour ajouter les class pair et impair. Le code CSS associ au tableau est
quivalent celui donn pour la table de multiplication.
Pour les tudiants en avance, on peut galement leur demander de faire une fonction achant les informations
de la personne la plus ge (ou la plus jeune).

Exercice 7 : Paramtres dans lurl


Question 7.1 : Appeler une page PHP en passant dans lurl un paramtre de nom pseudo et
ayant pour valeur un des pseudonymes du tableau $personnes. Faire en sorte que la page ache
le pseudo et les informations associes contenues dans le tableau $personnes. Amliorer le script
pour que ce dernier ache Dsol, votre pseudonyme napparat pas dans la liste si le
pseudonyme nest pas une cl du tableau $personnes.
Correction :

Exemple dappel : http://aquanux/~001/TP2/exo7.php?pseudo=toto

1
2

<?php

$personnes = array(...);

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

$trouve= false ;
if( ( isset($_GET[pseudo]) ) and ( trim($_GET[pseudo]) !=) )
{
$pseudo = $_GET[pseudo];
foreach ($personnes as $p => $info)
if($p==$pseudo)
{
echo <p> Bonjour . $info[prenom] . . $info[nom] .
. Vous avez . $info[age] . et vous habitez .
$info [ville] . . </p>."\n";
$trouve=true;
}
}
if($trouve== false )
{
echo <p> Dsol, votre pseudo n\apparat pas dans la liste! </p>."\n";
Mathieu LACROIX


82

Introduction Web, 1re anne

Dpartement informatique

20
21

1
2
3
4
5
6

?>

Question 7.2 : Crer un formulaire permettant lutilisateur de saisir le pseudonyme rechercher


an de faciliter la saisie pour lutilisateur. Mettre ensuite directement le formulaire dans le script
PHP cr prcdemment an de pouvoir eectuer facilement plusieurs recherches. Faire en sorte
que le champ de saisie du pseudonyme contienne la dernire valeur saisie.
Correction :

<h1> Veuillez saisir un pseudonyme : </h1>


<form method="get" action="exo7.php">
<p> Pseudonyme : <input type="text" name="pseudo" value="<?php if(isset($_GET[pseudo]))
echo $_GET[pseudo];?>"/>
<input type="submit" value="Recherche" /> </p>
</form>

Question 7.3 : Crer un deuxime formulaire demandant un pseudonyme, un prnom, un nom,


un ge et une ville, et ajoutant dans le tableau $personnes une nouvelle personne dont les valeurs
sont celles donnes par le formulaire. Ajouter plusieurs personnes et expliquer alors le problme.
(Acher le tableau en entier pour mieux voir le problme.) Comment remdier ceci (rponse
sans code car les connaissances ncessaires la rponse dpassent le cadre de ce cours) ?
Correction :
Comme on cre deux formulaires sur une mme page, il vaut mieux ajouter chaque formulaire un champ cach
permettant de savoir de quel formulaire viennent les paramtres. La correction vrie, laide dune fonction, si les
dirents paramtres sont corrects pour lajout (sils existent et sils ne sont pas vides).

1
2
3
4
5
6
7
8
9
10

<?php
function testParametreFormulaireAjout ()
{
$ok = true;
$param = array(pseudo,nom,prenom,age,ville);
foreach ($param as $v)
if( !(isset($_GET[$v])) or (trim($_GET[$v])==) )
$ok= false ;
return $ok;
}

11
12
13
14
15
16
17
18
19
20

if( ( isset($_GET[formulaire]) ) and ( $_GET[formulaire]==ajouter) )


{
if(testParametreFormulaireAjout())
{
$personnes[$_GET[pseudo]] = array(prenom => $_GET[prenom],
nom => $_GET[nom], age => $_GET[age], ville => $_GET[ville]);
echo <p> La personne a bien t ajoute </p>;
}
}

21
22
23
24
25
26
27
28
29
30

?>
<h1> Ajout dune personne : </h1>
<form method="get" action="exo7.php">
<p> Pseudo : <input type="text" name="pseudo"/>
<input type="hidden" name="formulaire" value="ajouter"/> </p>
<p> Prnom : <input type="text" name="prenom"/> </p>
<p> Nom : <input type="text" name="nom"/> </p>
<p> Age : <input type="text" name="age"/> </p>
<p> Ville : <input type="text" name="ville"/> </p>
Introduction Web, 1re anne


83

Mathieu LACROIX

IUT de Villetaneuse

31
32

<p> <input type="submit" value="Ajouter une personne"/> </p>


</form>

Remarque : Pour les exercices suivants, des exemples sont fournis ladresse http://
www-lipn.univ-paris13.fr/~lacroix/Documents/TP/IntroWeb/ pour montrer prcisment
quoi doit ressembler chaque script.

Exercice 8 : Contenu XHTML protg par mot de passe 2

1
2
3
4
5
6
7
8
9

Le but de cet exercice est de crer un contenu protg par mot de passe. Pour cela, choisir
un mot de passe (par exemple : kangourou). Crer un formulaire permettant de saisir un mot de
passe. Le contenu protg doit alors sacher uniquement si le mot de passe est correct. Dans le
cas contraire, le formulaire doit de nouveau sacher.
Correction :

... <body>
<?php
//On teste si lutilisateur a saisi un mot de passe
if( isset($_POST[mdp]) and $_POST[mdp]==kangourou)
{
?>
<!-- Si l utilisateur a saisi le bon mot de passe -->
<p> Voici le contenu secret obtenu uniquement si vous avez le mot de passe...!!! </p>
<p> Code : VIVE LE PHP!!! </p>

10
11

<?php

12
13
14
15
16
17
18
19
20
21
22

} //Accolade fermante du if
else

{
?>
<!-- Si lutilisateur na pas saisi le bon mot de passe -->
<h1> Veuillez saisir le mot de passe pour accder au contenu priv </h1>
<form action="secret.php" method="post" >
<p> <input type="password" name="mdp" /> <input type="submit" value="Connexion"/> </p>
</form>
<?php }// Accolade fermante du else ?>
</body> ...

Exercice 9 : Calculatrice2

1
2
3
4
5
6
7
8

Le but de cet exercice est de crer une calculatrice simple. Lutilisateur doit saisir deux nombres
et choisir une opration parmi laddition, la soustraction, la multiplication ou la division. Le
rsultat de lopration doit alors sacher.
Correction :

...<body>
<?php
function calcul ($nb1, $op, $nb2)
{
if ($op=="ad")
return $nb1 . + . $nb2 . = . ($nb1 + $nb2);
elseif ($op=="so")
return $nb1 . - . $nb2 . = . ($nb1 - $nb2);
2. Exercice tir du site du zro

Mathieu LACROIX


84

Introduction Web, 1re anne

Dpartement informatique
elseif ($op=="mu")
return $nb1 . * . $nb2 . = . ($nb1 * $nb2);
elseif ($op=="di")
if($nb2!=0)
return $nb1 . / . $nb2 . = . ($nb1 / $nb2);
else
return NULL;
else
return NULL;

9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

if ( isset ($_GET[nb1]) and isset($_GET[nb2]) and isset($_GET[op]))


{
if (is_numeric($_GET[nb1]) and is_numeric($_GET[nb2]))
{
$a = (int)$_GET[nb1];
$b = (int)$_GET[nb2];
$v = calcul ($a,$_GET[op],$b);
if($v!=NULL)
echo <p> . $v . </p>;
}
}
?>
<h1> Calculatrice simple </h1>
<form action="calculatrice.php" method="get">

34

<p> Premier nombre : <input type="text" name="nb1" /> </p>


<p> Oprateur <select name="op">
<option value="ad"> addition </option>
<option value="so"> soustraction </option>
<option value="mu"> multiplication </option>
<option value="di"> division </option>
</ select > </p>
<p> Deuxime nombre : <input type="text" name="nb2" /> </p>
<p> <input type="submit" value="Calculer" /> </p>
</form>

35
36
37
38
39
40
41
42
43
44
45
46

</body> </html>

An de faciliter la saisie par lutilisateur, crer un formulaire contenant une seule balise input
de type text o lutilisateur saisit directement lopration (par exemple : 17.5 * 13.46). Vrier,
laide des expressions rgulires, que le texte saisi par lutilisateur correspond une opration.
Dans ce cas, acher le rsultat.
Correction :
Dans le code prcdent, mettre une seule balise input de type text dans le formulaire dont le name est operation.
Remplacer ensuite le test if (is_numeric...) par le code suivant :

1
2

3
4
5
6
7
8
9

if(preg_match(#^ *([0-9]+(?:\.[0-9]+)?) *([*+/-]) *([0-9]+(?:\.[0-9]+)?) *$#,


$_GET[operation],$res) )
{
$a = (double)$res[1];
$b = (double) $res[3];
$v = calcul ($a,$res[2],$b);
if($v!=NULL)
echo <p> . $v . </p>;
}

Introduction Web, 1re anne


85

Mathieu LACROIX

IUT de Villetaneuse

Exercice 10 : Formulaire de contact

Il est intressant quun utilisateur puisse laisser un message au webmaster ou ladministrateur


dun site Web. Lide consiste alors crer un formulaire o lutilisateur saisit ses coordonnes
ainsi quun message. Lors de la soumission du formulaire, un message est alors automatiquement
envoy la personne concerne. Le but de cet exercice est de crer un tel formulaire et le traitement
PHP associ.
Question 10.1 : Crer un formulaire permettant un utilisateur de saisir ses pseudo, numro
de tlphone et adresse e-mail. Vrier, laide des expressions rgulires, que la saisie vrie les
caractristiques suivantes :
le pseudo est constitu de 4 8 lettres,
le numro de tlphone est constitu de 10 chires, le premier tant un 0, le suivant un
nombre entre 1 et 6,
ladresse mail contient une seule arobase, se termine par ".fr", ".com" ou ".org", les autres
caractres tant des lettres, des chires ou le symbole underscore. De plus, ladresse doit
contenir au moins 3 caractres avant larobase et entre 4 et 10 caractres entre larobase et
la n de la chane.
Le script PHP doit alors indiquer si la saisie est correcte et dans ce cas, acher les informations
saisies.
Question 10.2 : Rajouter dans le formulaire une zone de texte permettant lutilisateur de
saisir le message quil souhaite laisser. An dviter lenvoi automatique de mails par des robots,
poser galement une question trs simple du style : "Quel animal aboie ?" et ajouter un champ
de texte pour que lutilisateur puisse rpondre la question. Dans le traitement des donnes,
vrier que la rponse donne par lutilisateur est correcte. (Attention, pour un confort dutilisation, les rponses "chien(s)", "le(s) chien(s)", "un chien" et "des chiens" doivent tre valides.)
Si les donnes saisies par lutilisateur sont valides, envoyer alors un mail sur son adresse de liut
contenant les informations relatives lutilisateur et le message saisi, grce la fonction PHP :
mail(email_destinataire, sujet, message);. Dans le cas o les informations ne sont
pas correctes, acher dans le formulaire les informations saisies par lutilisateur.
Question 10.3 : Amliorer le script de manire ce quun numro de tlphone puisse aussi
tre saisi avec un espace ou un tiret tous les deux chires an de permettre les numros suivants :
"0123456789", "01-23-45-67-89", "01 23 45 67 89".
Question 10.4 : Amliorer la prsentation de la page Web laide du CSS.
Correction :

Je ne donne pas la rponse aux deux dernires questions. Pour la troisime question, il sut de rajouter que lon peut
avoir, tous les deux chires, la partie [- ]?. La dernire question est du code CSS pour amliorer la prsentation.
Les tudiants peuvent reprendre le CSS du site dnigmes.

1
2
3
4

...
<body>
<h1> Contact </h1>
<p> Veuillez saisir vos infos ... </p>

5
6
7
8
9
10
11
12
13

<?php
function testParametres($tab)
{
foreach ($tab as $v)
if( ! isset ($_POST[$v]) or trim($_POST[$v])==)
return false;
return true;
}

14
15
16

function testP_er()
{
Mathieu LACROIX


86

Introduction Web, 1re anne

Dpartement informatique
$ok=true;
if (!preg_match(#^[a-zA-Z]{4,8}$#,$_POST[pseudo]) )
$ok= false ;
if (!preg_match(#^0[1-6][0-9]{8}$#,$_POST[tel]) )
$ok= false ;
if (!preg_match(#^[a-zA-Z_]{3,}@[a-zA-Z_]{4,10}\.(fr|com|org)$#,$_POST[mail]) )
$ok= false ;
if (!preg_match(#^ *([Uu]n|[Dd]es)? *[Cc]hiens? *$#,$_POST[rep]) )
$ok= false ;
return $ok;

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

}
$envoi= false ;
if(testParametres( array (pseudo,tel,mail,message,rep)) )
{
if(testP_er())
{
$mes = Pseudo : . $_POST[pseudo] . "\nTel : " . $_POST[tel] .
"\nE-mail :" . $_POST[mail]. "\nMessage :" . $_POST[message];
$test = mail(lacroix@iutv.univ-paris13.fr, [test] Contact,$mes);
if($test)
echo <p> Un e-mail a t envoy l\administrateur du site </p>;
$envoi=true;
}
echo <p> probleme dans la saisie </p>;
}
if(!$envoi)
{
?>
<form method="post" action="contact.php">
<p> Pseudo : <input type="text" name="pseudo" value="<?php echo $_POST[pseudo];?>"/> </p>
<p> Tlphone : <input type="text" name="tel" value="<?php echo $_POST[tel];?>"/> </p>
<p> E-mail : <input type="text" name="mail" value="<?php echo $_POST[mail];?>"/> </p>
<p> Message : <textarea rows="5" cols="50" name="message"><?php echo $_POST[message];?>
</ textarea > </p>
<p>Question: Quel animal aboie? <input type="text" name="rep"
value="<?php echo $_POST[rep];?>"/>
<input type="submit" value="Envoyer un message" /></p>
</form>
<?php
}
?>
</body>
</html>

Exercice 11 : Questionnaire choix multiples


Question 11.1 : Le but de cet exercice est de faire une premire page Web contenant des nigmes
ou questions avec plusieurs rponses possibles (une seule dentre elles tant correcte). Lutilisateur
doit alors rpondre aux direntes questions et le site ache alors le score obtenu par lutilisateur.
Question 11.2 : Ajouter sur la page daccueil un formulaire pour que lutilisateur puisse saisir
son nom. Cette donne sera utilise par la suite pour personnaliser lachage du site.
Question 11.3 : Stocker, laide dun cookie le meilleur score obtenu par lutilisateur. Dans la
page du score, acher ce meilleur score en plus du score obtenu linstant par lutilisateur.
Correction :

Fichier entete.html :

Introduction Web, 1re anne


87

Mathieu LACROIX

IUT de Villetaneuse

1
2
3
4
5
6
7
8
9
10
11
12
13

<?php session_start(); ?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
< title > Site dnigmes</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="style1.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="entete">
<h1> <span> Site dnigmes </span> </h1>
</div>

1
2
3
4
5
6
7
8

<div id="menu">
<ul>
< li > <a href="index.php"> Accueil </a> </li>
< li > <a href="questionnaire.php"> Questionnaire </a> </li>
< li > <a href="scores.php"> Score </a> </li>
</ul>
</div>
<div id="principal">

Fichier piedDePage.html :

1
2
3
4
5

</div>
<div id="piedDePage">
</div>
</body>
</html>

Fichier index.html :

1
2
3
4
5
6

<?php

include (entete.html);
include (menu.html);

?>
<!-- On est dans lid principal. Lentete et le menu ont dj t ajouts -->
<h1> <span> Bienvenue sur le site dnigmes </span> </h1>

7
8
9
10
11
12
13

<p class = "accueil">


Ce site permet de tester son aptitude la rsolution dnigmes.
Il a t labor pour le cours dIntroduction Web et correspond
au projet de fin de semestre mettre en place. Son laboration
reprend toutes les connaissances XHTML, CSS et PHP vues lors de ce semestre.
</p>

14
15
16
17
18

<?php
//Si l utilisateur a soumis son nom
if( isset ($_POST[nom]) and trim($_POST[nom])!= )
$_SESSION[nom] = $_POST[nom];

19
20

if( ! isset ($_SESSION[nom]) or trim($_SESSION[nom])== )

21
22
23
24
25

echo <h1> Veuillez entrer votre prnom </h1>


<form action="index.php" method="post">
<p> <input name="nom" type="text" /> <input type="submit"/></p>
</form>;
Mathieu LACROIX

Fichier menu.html :


88

Introduction Web, 1re anne

Dpartement informatique
else

26
27
28
29

echo <p> Bienvenue . $_SESSION[nom] . </p>;


?>
<?php include(piedDePage.html); ?>

Fichier questionnaire.php :

1
2

<?php

3
4
5
6

include (entete.html);
include (menu.html);

?>
<!-- On est dans lid principal. Lentete et le menu ont dj t ajouts -->
<p> <?php echo $_SESSION[nom]; ?>, Veuillez remplir le questionnaire </p>

7
8
9
10
11
12
13

<form method="post" action="scores.php">


<p> Question 1 : que vaut 1+2?</p>
<ul>
< li > <input type="radio" name="enigme1" value="vrai" /> 3 </li>
< li > <input type="radio" name="enigme1" value="faux" /> 4 </li>
</ul>

14
15

<p> Question 2 : que vaut 4+5?</p>

16
17
18
19

<ul>
< li > <input type="radio" name="enigme2" value="vrai" /> 9 </li>
< li > <input type="radio" name="enigme2" value="faux" /> -1 </li>

20
21

</ul>

22
23
24
25
26
27
28

<p> Question 3 : que vaut 11 <sup>2 </sup> + 12<sup>


<ul>
< li > <input type="radio" name="enigme3" value="faux"
< li > <input type="radio" name="enigme3" value="vrai"
< li > <input type="radio" name="enigme3" value="faux"
</ul>

2 </sup>?</p>
/> 23 </li>
/> 265 </li>
/> 255 </li>

29
30
31
32

<p> <input type="submit" name="valider" value="Calcul du rsultat" /> </p>


</form>
<?php include(piedDePage.html); ?>

Fichier fonctions.php :

1
2
3
4
5
6
7
8

<?php
//Tableau associant chaque name denigme un nom
//qui sera utilis par dans le tableau de score
$nomEnigme = array(
enigme1 => Somme de deux nombres,
enigme2 => Somme de deux nombres (suite),
enigme3 => Somme de carrs
);

9
10
11
12
13
14
15
16
17
18

//Fonction calculant le score obtenu


function calculScore($t)
{
$nb = 0;
foreach($t as $v)
{
if ($v==vrai)
$nb = $nb + 1;
}
Introduction Web, 1re anne


89

Mathieu LACROIX

IUT de Villetaneuse
return $nb;

19
20

21
22
23
24

//Fonction affichant le tableau


function afficheTableau($nomEnigme)
{

25

echo <table>
<tr class="impair">
<th> Question numro </th>
<th> Rsultat </th>
</tr>;
$i=0;
foreach($nomEnigme as $c=>$v)
{
if($i%2==0)
echo <tr><td>. $v .</td><td>;
else
echo <tr class="impair"><td>. $v .</td><td>;
if(isset($_POST[$c]))
if($_POST[$c]==vrai)
echo <img src="vrai.png" alt="juste" /> </td></tr>;
else
echo <img src="faux.png" alt="faux" /> </td></tr>;
else
echo <img src="nonRepondu.png" alt="sans rponse" /> </td></tr>;
$i++;
}
echo </table>;

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

}
?>

Fichier scores.php :

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

<?php
include_once(fonctions.php);
if( isset ($_POST[valider]))
$newScore = calculScore($_POST);
else
$newScore = -1;
if( isset ($_COOKIE[meilleurScore]) )
$meilleurScore =$_COOKIE[meilleurScore];
else
$meilleurScore = -1;
if($newScore > $meilleurScore)
{
setcookie (meilleurScore,$newScore, time() + 7 * 24 * 60 * 60, null, null, false, true);
$_COOKIE[meilleurScore] = $newScore;
}
?>
<?php
include (entete.html);
include (menu.html);
?>
<!-- On est dans lid principal. Lentete et le menu ont dj t ajouts -->
<h1> <span> Score obtenu </span> </h1>
<p> <?php echo $_SESSION[nom]; ?>, voici le score que vous avez obtenu
pour les direntes questions : </p>
<div class="tableauEtRes">
Mathieu LACROIX


90

Introduction Web, 1re anne

Dpartement informatique

26

<?php

27
28
29
30
31
32
33
34
35
36
37
38

if( isset ($_POST[valider]))


{
acheTableau ($nomEnigme);
echo <p class="valeurScore"> Score : . calculScore($_POST) . /.
count($nomEnigme). </p>;
}
else
echo <p> Il faut rpondre aux questions pour avoir un score! </p>;

?>
<p> Meilleur score obtenu ce jour <?php echo $_COOKIE[meilleurScore]; ?> </p>
</div>
<?php include(piedDePage.html); ?>

Pour les tudiants en avance, rajouter le code permettant de dire combien de fois la personne a eectu le
questionnaire (cookie contenant le nombre de fois que le joueur a rpondu au questionnaire).

Exercice 12 : Nombre de secondes coules depuis le premier janvier 2012

crire un script PHP permettant un utilisateur de saisir une date de lanne 2012 ainsi quune
heure et achant alors le nombre de secondes coules depuis le premier janvier de cette anne.
Sparer le code en deux chiers an de regrouper au maximum le code XHTML dune part et le
code PHP dautre part.
Correction :

Fichier nbS :

1
2
3
4
5
6
7
8
9
10
11

<?php require_once(codePHP.php); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
< title >Ceci est une page de test avec des balises PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1> Nombre de secondes passes depuis le premier janvier </h1>

12

<!-- Paragraphe donnant le nombre de secondes coules ou un message


derreur si les paramtres nont pas t saisis correctement -->
<p> <?php echo $message; ?> </p>

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

<h2> Veuillez saisir une date : </h2>


<form method="get" action="nbS.php">
<p> Date : <input type="text" name="jour" size="2" value="<?php echo $_GET[jour]; ?>"/> /
<input type="text" name="mois" size="2" value="<?php echo $_GET[mois]; ?>"/> /
2011
</p>
<p> Heure : <input type="text" name="heure" size="2" value="<?php echo $_GET[heure]; ?>"/> h
<input type="text" name="min" size="2" value="<?php echo $_GET[min]; ?>"/> min
<input type="text" name="sec" size="2" value="<?php echo $_GET[sec]; ?>"/> sec
</p>
<p> <input type="submit" value="Nombre de secondes coules depuis le 01/01/11 00h00:00" />
</p>
</form>
</body>
</html>

Introduction Web, 1re anne


91

Mathieu LACROIX

IUT de Villetaneuse

Fichier codePHP :

1
2

<?php

3
4
5
6
7
8
9
10
11
12

// teste que le tableau $_GET contient les cls contenues


//dans le tableau $tab pass en paramtre et que les
// valeurs associes ces cls ne sont pas composes
//uniquement despaces.
function testParametres($tab)
{
foreach($tab as $v)
if( !isset($_GET[$v]) or trim($_GET[$v])== )
return false;
return true;
}

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

//
//
//
//

//Vrifie que :
// - le mois est compris entre 1 et 12,
// - le jour entre 1 et le nombre de jours du mois,
// - lheure comprise entre 1 et 23,
// - les minutes entre 1 et 59,
// - les secondes entre 1 et 59.
function vericationParametre ()
{
$nbJoursMois = array(31,28,31,30,31,30,31,31,30,31,30,31);
Code retour :
- 0 : ok
- 1 : erreur date
- 2 : erreur heure
if (($_GET[mois] <= 0) or ($_GET[mois] > 12))
return 1;
if (($_GET[jour] <= 0)or($_GET[jour]>$nbJoursMois[$_GET[mois]-1]))
return 1;
if (($_GET[heure] < 0)or($_GET[heure] > 23) or ($_GET[min] < 0) or
($_GET[min] > 59) or ($_GET[sec]<0) or ($_GET[sec]>59))
return 2;
return 0;
}

36
37
38
39
40
41
42

// $message contient le message derreur sil y en a une ou la phrase :


//Le nombre de secondes coules depuis le ... est gal ... secondes
//sinon
$message = ;
// $nbSecondes contient le nombre de secondes coules
$nbSecondes = -1;

43
44
45
46
47
48
49
50
51
52
53

if(testParametres( array (jour,mois,heure,min,sec)) )


{
$ok = vericationParametre ();
if ($ok==0)
{
//Calcul du nombre de secondes coules
$nbJoursMois = array(31,28,31,30,31,30,31,31,30,31,30,31);
$nbJ = 0;
for ($i = 0; $i < $_GET[mois] - 1 ; $i++)
$nbJ += $nbJoursMois[$i];

54

$nbSecondes = $_GET[sec] + 60 * $_GET[min] +


3600 * $_GET[heure] + 3600 * 24 * ($_GET[jour] + $nbJ-1);
// Variable $date la date (forme jj/mm/2011 HHhMM:ss)

55
56
57

Mathieu LACROIX


92

Introduction Web, 1re anne

Dpartement informatique
$message = Le nombre de secondes coules depuis le .
$_GET[jour]./.$_GET[mois]./2011 .$_GET[heure].
h.$_GET[min] .:. $_GET[sec] . est gal .
$nbSecondes . secondes.;

58
59
60
61

}
elseif ($ok==1)
$message = Problme dans la date! Recommencez la saisie.;
else
$message = Problme dans l\heure! Recommencez la saisie.;

62
63
64
65
66

}
else

67
68
69
70

$message = Paramtres non saisis! Recommencez la saisie.;

?>

Exercice 13 : Jeu Devine Chire

Le jeu Devine chire se joue un seul joueur. Lordinateur choisit un nombre entier alatoire
compris entre 1 et 100 inclus. Le joueur a 7 tentatives pour trouver ce nombre. chaque tentative,
si le nombre entr par lutilisateur est dirent du nombre alatoire, le programme indique si le
nombre saisi est plus petit ou plus grand que le nombre alatoire.
Remarque : Le tirage dun nombre alatoire entre 1 et 100 se fait en PHP grce linstruction $nb = mt_rand(1,100);.

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
26
27

Question 13.1 : Programmer ce jeu en PHP. Pour cela, crer un formulaire permettant lutilisateur de choisir un nombre. Le nombre de tentatives restantes sera donn laide dune balise
input de type hidden. Le nombre alatoire sera stock dans la variable $_SESSION.
Correction :

<?php include(entete.html) ?>


<h1> Bienvenue sur le site du jeu devineChire </h1>
<?php
if( ! isset ($_POST[jeu]) )
{
$_SESSION[nbM] = mt_rand(0,100);
echo <form method="post" action="devineChiffre.php">
<p> <input type="submit" value="Commencer le jeu" />
<input type="hidden" name="jeu" value="7" />
</p>
</form>;
echo <p> Nombre magique : . $_SESSION[nbM] . </p>;
}
else
{
$gagne = false;
//Lutilisateur a saisi un nombre
if( isset($_POST[nb]) )
{
$nb = (int) $_POST[nb];
//var_dump($nb);
if($nb==$_SESSION[nbM])
{
echo <p> Vous avez gagn! <a href="devineChiffre"> Rejouer </a></p>;
$gagne = true;
}
elseif ($nb <$_SESSION[nbM])
Introduction Web, 1re anne


93

Mathieu LACROIX

IUT de Villetaneuse
echo <p> Le nombre trouver est plus grand </p>;

28

else

29

echo <p> Le nombre trouver est plus petit </p>;


}
if(!$gagne)
{
if( $_POST[jeu]!=0)
{
echo <p> Il vous reste . $_POST[jeu] . tentatives </p>;
echo <form method="post" action="devineChiffre.php">
<p> Nombre : <input type="text" name="nb" />
<input type="submit" value="Tenter" />
<input type="hidden" name="jeu" value=". ($_POST[jeu] - 1) . " />
</p>
</form>;
}
else
echo <p> Vous avez perdu! <a href="devineChiffre"> Rejouer </a> </p>;
}

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

}
?>
</body>
</html>

Le chier entete.html contient linstruction <?php session_start(); ?> ainsi que len-tte dun document XHTML.

Question 13.2 : Le PHP est-il adapt pour la programmation de ce jeu ?


Correction :
Non, car chaque coup jou correspond une requte. On a donc une surcharge inutile du serveur et un encombrement
du rseau. De plus, le jeu est plus lent. Ce jeu devrait tre programm avec un langage orient client plutt que
serveur (par exemple : javascript).

Mathieu LACROIX


94

Introduction Web, 1re anne

S-ar putea să vă placă și