Les Cookies, sessions et e-mails en php5 –TP et solution
Exercice 1:
Créer un formulaire de saisie des deux codes couleur préférés du visiteur
du site pour la couleur de fond et le texte de la page.
Les enregistrer dans
deux cookies valables deux mois. À l’ouverture de la page d’accueil, récupérer
ces valeurs et créer un style utilisant ces données.Solution
<?php
if(!isset($_COOKIE['fond'])
AND !isset($_COOKIE['texte']) )
{
$fond=$_POST['fond'];
$texte=$_POST['texte'];
$expir=time() + 2*30*24*3600;
setcookie("fond",$fond,$expir);
setcookie("texte",$texte,$expir);
}
else
{
$fond=$_COOKIE['fond'];
$texte=$_COOKIE['texte'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=iso-
8859-1"
/>
<title>Couleurs
du site</title>
<style type="text/css" >
<!--
body{background-color: <?php echo $fond
?> ; color: <?php echo
$texte
?> ;}
legend{font-weight:bold;font-family:cursive;}
label{font-weight:bold;font-style:italic;}
-->
</style>
</head>
<body>
<form method="post"
action="ch12exo1.php">
<fieldset>
<legend>Choisissez
vos couleurs</legend>
<label>Couleur
de fond
<input
type="text" name="fond" />
</label><br
/><br />
<label>Couleur
de texte
<input type="text" name="texte"
/>
</label><br />
<input type="submit"
value="Envoyer" />
<input type="reset"
value="Effacer" />
</fieldset>
</form>
</body>
</html>
Exercice 2:
Même question mais en stockant les deux informations dans un même
cookie.
Le cookie nommé couleur est un tableau qui a deux éléments : fond et
texte.
Solution
<?php
if(!isset($_COOKIE['couleur']['fond'])
AND
!isset($_COOKIE['couleur']['texte'])
)
{
$fond=$_POST['fond'];
$texte=$_POST['texte'];
$expir=time()
+ 10;
setcookie("couleur[fond]",$fond,$expir);
setcookie("couleur[texte]",$texte,$expir);
}
else
{
$fond=$_COOKIE['couleur']['fond'];
$texte=$_COOKIE['couleur']['texte'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=iso-
8859-1"
/>
<title>Couleurs
du site</title>
<style type="text/css" >
<!--
body{background-color: <?php echo $fond
?> ; color: <?php echo
$texte
?> ;}
legend{font-weight:bold;font-family:cursive;}
label{font-weight:bold;font-style:italic;}
-->
</style>
</head>
<body>
<form method="post"
action="ch12exo2.php">
<fieldset>
<legend>Choisissez
vos couleurs</legend>
<label>Couleur
de fond
<input
type="text" name="fond" />
</label><br
/><br />
<label>Couleur
de texte
<input type="text" name="texte"
/>
</label><br />
<input type="submit"
value="Envoyer" />
<input type="reset"
value="Effacer" />
</fieldset>
</form>
</body>
</html>Exercice 3:
Après avoir créé un formulaire de saisie du nom et du mot de passe
du visiteur ainsi que d’une durée de validité puis avoir autorisé l’accès au
site, enregistrer un cookie contenant ces informations. Lors de la connexion
suivante, le formulaire devra contenir ces informations dès l’affichage de la
page.
Le site comprend trois pages
• La page ch12exo3b.php qui a un contenu personnalisé en fonction
du visiteur. Son code PHP vérifie l’existence des cookies et redirige vers la
page de saisie s’ils n’existent pas ou s’il y a une erreur dans le nom ou le
mot de passe.
Solution
<?php
if(isset($_COOKIE['nom']) AND
isset($_COOKIE['pass']))
{
$login="machin";
$motpass="123456";
$nom=$_COOKIE['nom'];
$pass=$_COOKIE['pass'];
//Vérification
et création du contenu personnalisé
if($nom==$login AND $pass==$motpass)
{
$message=
"<h1>BONJOUR ".ucfirst($nom)."</h1>";
$contenu="<p>
Contenu personnalisé.............</p>";
}
else
{
echo "<script
type=\"text/javascript\">
window.location='ch12exo3a.php'
;</script>";
}
}
else
{
echo "<script
type=\"text/javascript\">
window.location='ch12exo3a.php' </script>";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-
8859-1"
/>
<title>Accès
réservé au site</title>
</head>
<body>
<?php
echo $message;
echo $contenu;
?>
</body>
</html>
• La
page de saisie du nom et du mot de passe nommée ch12exo3a.php.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-
8859-1"
/>
<title>Accès
réservé au site</title>
</head>
<body>
<form method="post"
action="ch12exo3.php">
<fieldset>
<legend>Saisissez
votre nom et mot de passe</legend>
<label>Nom :
<input type="text" name="nom"
/>
</label><br /><br />
<label>Pass :
<input type="text" name="pass"
/>
</label><br />
<input type="submit"
value="Envoyer" />
<input type="reset"
value="Effacer" />
</fieldset>
</form>
</body>
</html>
• La
page qui traite les données du formulaire de saisie et redirige vers la page à
accès réservé ou la page de saisie selon le cas.
<?php
//Nom et pass associé
autorisant l'accès au site
//En pratique
ils proviennent d'une base de données
$login="machin";
$motpass="123456";
//Récupération
des valeurs saisies
$nom=$_POST['nom'];
$pass=$_POST['pass'];
//Vérification
if($nom==$login AND $pass=$motpass)
{
$expir=time() +
20;
//Ecriture des
cookies
setcookie("nom",$nom,$expir);
setcookie("pass",$pass,$expir);
//Redirection
vers la page à accès réservé
echo "<script
type=\"text/javascript\">
window.location='ch12exo3b.php' </script>";
}
else
{
//Redirection
vers la page de saisie du code
echo "<script
type=\"text/javascript\">
window.location='ch12exo3a.php' </script>";
}
?>
Exercice 4:
Enregistrer le nom de la page du site préférée du visiteur dans un
cookie. Lors de sa connexion, il devra être redirigé automatiquement vers cette
page.
Solution
<?php
//Détection
du cookie et redirection éventuelle vers la page
préférée
if(isset($_COOKIE['mapage']))
{
$page=$_COOKIE['mapage'];
header("Location:$page");
}
//
if(isset($_POST['mapage']))
{
setcookie("mapage",$_POST['mapage'],time()+10);
header("Location:$page");
echo
"Vous avez choisi ",$_POST['mapage'],"<br />";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=iso-
8859-1"
/>
<title>Choisissez
votre page préférée</title>
</head>
<body>
<form method="post"
action="ch12exo4.php">
<fieldset>
<legend>Choisissez
votre page préférée</legend>
<select
name="mapage">
<option
value="ch12exo4.php">Accueil</option>
<option
value="ch12exo4a.php">Cinéma</option>
<option
value="ch12exo4b.php">Voyages</option>
</select>
<br />
<input type="submit"
value="Envoyer" />
<input type="reset"
value="Effacer" />
</fieldset>
</form>
</body>
</html>
Exercice 5:
Envoyer un ensemble d’e-mails ayant tous le même objet et le même
contenu à partir d’une liste d’adresses contenue dans un tableau.
Solution
<?php
$tabadresse=array("coco@asaumur.com","jean@asaumur.com","engels@asa
umur.com");
$objet="Message";
$message="Bonjour
de jean";
foreach($tabadresse
as $dest)
{
if(mail($dest,$objet,$message))
{
echo
"Mail envoyé à $dest";
}
}
?>
Exercice 6:
Même question, mais cette fois chaque objet et chaque contenu des
e-mails doit être différent et extrait d’un tableau multidimensionnel.
Solution
<?php
$tabmailA=array("coco@funhtml.com","PHP
5","Du nouveau dans le
langage
du Web");
$tabmailB=array("jan@funhtml.com","MySQL
5","La base de données
évolue");
$tabmailC=array("truc@funphp.com","AN
2005","Bonne année ");
$tabmail=array($tabmailA,$tabmailB,$tabmailC);
foreach($tabmail as $tab)
{
if(mail($tab[0],$tab[1],$tab[2]))
{
echo
"Mail envoyé à $tab[0]";
}
}
?>
Exercice 7:
Reprendre l’exercice 1 en enregistrant les préférences du visiteur
dans des variables de session pour afficher toutes les pages du site avec ses
couleurs préférées.
Solution
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=iso-
8859-1"
/>
<title>Couleurs
du site avec des sessions</title>
<style type="text/css" >
<!--
body{background-color: orange ; color:
purple ;}
legend{font-weight:bold;font-family:cursive;}
label{font-weight:bold;font-style:italic;}
-->
</style>
</head>
<body>
<div>
<form method="post"
action="ch12exo7.php">
<fieldset>
<legend>Choisissez
vos couleurs</legend>
<label>Couleur
de fond
<input
type="text" name="fond" />
</label><br
/><br />
<label>Couleur
de texte
<input type="text"
name="texte" />
</label><br />
<div><input
type="submit" value="Envoyer" />
<input type="reset"
value="Effacer" /></div>
</fieldset>
</form>
<p>Contenu
de la page
<a
href="ch12exo7b.php">Lien vers la page B</a>
</p>
</div>
</body>
</html>
Un exemple de page du site cible d’un lien de la page principale (fichier
ch12exo7b.php). Toutes les pages liées qui récupèrent les paramètres de
couleurs doivent contenir le même code PHP.
<?php
session_start();
$fond=$_SESSION['fond'];
$texte=$_SESSION['texte'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-
8859-1"
/>
<title>Couleurs
du site avec des sessions</title>
<style type="text/css" >
<!--
body{background-color: <?php echo $fond ?> ;
color: <?php echo
$texte ?> ;}
legend{font-weight:bold;font-family:cursive;}
label{font-weight:bold;font-style:italic;}
-->
</style>
</head>
<body>
<p>Contenu
de la page B
<a
href="ch12exo7.php">Lien vers la page principale</a>
</p>
</body>
</html>
Exercice 8:
Transformer le script de l’exemple 12-5 (commande en ligne) en permettant
les saisies à partir de pages différentes et en créant sur chacune un bouton
provoquant l’affichage de l’ensemble du panier
à chaque demande.
La modification est très simple à réaliser et peut permettre de
créer autant de page que l’on désire, chacune étant spécialisée dans une gamme
de produits. La première page dédiée à l’achat de livres (fichier ch12exo8.php)
reprend l’essentiel de l’exemple 12.5 en ajoutant simplement un lien vers la
deuxième page (repère ).
Solution
<?php
session_start();
//AJOUTER
if($_POST["envoi"]=="AJOUTER"
&& $_POST["code"]!="" &&
$_POST["article"]!=""
&& $_POST["prix"]!="")
{
$code=$_POST["code"];
$article=
$_POST["article"];
$prix=
$_POST["prix"];
$_SESSION['code'][]=
$code;
$_SESSION['article'][]=
$article;
$_SESSION['prix'][]=
$prix;
}
//VERIFIER
if($_POST["envoi"]=="VERIFIER")
{
echo
"<table border=\"1\" >";
echo
"<tr><td colspan=\"3\"><b>Récapitulatif de
votre
commande</b></td>";
echo
"<tr><th> code </th><th> article </
th><th> prix </th>";
for($i=0;$i<count($_SESSION["code"]);$i++)
{
echo "<tr>
<td>{$_SESSION['code'][$i]}</td>
<td>{$_SESSION['article'][$i]}
</td><td>{$_SESSION['prix'][$i]}</td>";
$prixtotal+=$_SESSION['prix'][$i];
}
echo "<tr> <td colspan=2> PRIX TOTAL
</td> <td>".
sprintf("%01.2f",
$prixtotal)."</td>";
echo "</table>";
}
//ENREGISTRER
if($_POST["envoi"]=="ENREGISTRER")
{
$idfile=fopen("commande.txt",w);
echo SID, $PHPSESSID;
for($i=0;$i<count($_SESSION["code"]);$i++)
{
fwrite($idfile, $_SESSION["code"][$i]."
;
".$_SESSION["article"][$i]." ;
".$_SESSION["prix"][$i]."; \n");
}
fclose($idfile);
}
//LOGOUT
if($_POST["envoi"]=="LOGOUT")
{
session_unset();
session_destroy();
echo
"<h3>La session est terminée</h3>";
}
$_POST["envoi"]="";
?>
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-
8859-1">
<title>Gestion de panier</title>
</head>
<body>
<div>
<a
href="ch12exo8b.php"><big>Page des
disques</big></a><br />
</div>
<form action="<?= $_SERVER['PHP_SELF']
?>" method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Commande de livres</b></legend>
<table>
<tbody>
<tr>
<th>code : </th>
<td> <input type="text"
name="code" /></td>
</tr>
<tr>
<th>article : </th>
<td><input type="text"
name="article" /></td>
</tr>
<tr>
<th>prix :</th>
<td><input type="text" name="prix"
/></td>
</tr>
<tr>
<td colspan="3">
<input type="submit"
name="envoi" value="AJOUTER" />
<input type="submit"
name="envoi" value="VERIFIER" />
<input type="submit"
name="envoi" value="ENREGISTRER" />
<input type="submit"
name="envoi" value="LOGOUT" />
</td>
</tr>
</tbody>
</table>
</fieldset>
</form>
</body>
</html>
La
deuxième page dédiée à l’achat de disques (fichier ch12exo8b.php) est
pratiquement identique, seuls les intitulés changent ainsi qu’un lien vers la
première page (repère ). Le code
PHP
commun aux deux pages permet l’affichage des articles commandés et le
récapitulatif de toute la commande à partir de n’importe quelle page. Comme
indiqué plus haut nous pourrions donc créer sans difficulté, autant de pages
que le site comporteraitde familles d’articles.
<?php
session_start();
//AJOUTER
if($_POST["envoi"]=="AJOUTER"
&& $_POST["code"]!="" &&
$_POST["article"]!=""
&& $_POST["prix"]!="")
{
$code=$_POST["code"];
$article=
$_POST["article"];
$prix=
$_POST["prix"];
$_SESSION['code'][]=
$code;
$_SESSION['article'][]=
$article;
$_SESSION['prix'][]=
$prix;
}
//VERIFIER
if($_POST["envoi"]=="VERIFIER")
{
echo
"<table border=\"1\" >";
echo
"<tr><td colspan=\"3\"><b>Récapitulatif de
votre
commande</b></td>";
echo
"<tr><th> code </th><th> article </
th><th> prix </th>";
for($i=0;$i<count($_SESSION["code"]);$i++)
{
echo "<tr>
<td>{$_SESSION['code'][$i]}</td>
<td>{$_SESSION['article'][$i]}
</td><td>{$_SESSION['prix'][$i]}</td>";
$prixtotal+=$_SESSION['prix'][$i];
}
echo "<tr> <td colspan=2> PRIX TOTAL
</td> <td>".
sprintf("%01.2f",
$prixtotal)."</td>";
echo "</table>";
}
//ENREGISTRER
if($_POST["envoi"]=="ENREGISTRER")
{
$idfile=fopen("commande.txt",w);
for($i=0;$i<count($_SESSION["code"]);$i++)
{
fwrite($idfile, $_SESSION["code"][$i]."
;
".$_SESSION["article"][$i]." ;
".$_SESSION["prix"][$i]."; \n");
}
fclose($idfile);
}
//LOGOUT
if($_POST["envoi"]=="LOGOUT")
{
session_unset();
session_destroy();
echo
"<h3>La session est terminée</h3>";
}
$_POST["envoi"]="";
?>
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-
8859-1">
<title>Gestion de panier</title>
</head>
<body>
<div>
<a href="ch12exo8.php"><big>Page
des livres</big></a><br />
</div>
<form action="<?= $_SERVER['PHP_SELF']
?>" method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Commande de disques</b></legend>
<table>
<tbody>
<tr>
<th>code : </th>
<td> <input type="text"
name="code" /></td>
</tr>
<tr>
<th>article : </th>
<td><input type="text"
name="article" /></td>
</tr>
<tr>
<th>prix :</th>
<td><input type="text"
name="prix" /></td>
</tr>
<tr>
<td colspan="3">
<input type="submit"
name="envoi" value="AJOUTER" />
<input type="submit"
name="envoi" value="VERIFIER" />
<input type="submit"
name="envoi" value="ENREGISTRER" />
<input type="submit"
name="envoi" value="LOGOUT" />
</td>
</tr>
</tbody>
</table>
</fieldset>
</form>
</body>
</html>
Aucun commentaire:
Enregistrer un commentaire