TP PHP
TP PHP
TP PHP
43 heures
01 - INTRODUIRE LA NOTION CLIENT/SERVEUR
Approfondir la notion client/serveur
02 - PROGRAMMER EN PHP
Maitriser le langage PHP
Traiter les données en PHP
Utiliser l’orientée objet en PHP
1 2 3 4 5
LE GUIDE DE LA VERSION PDF DES CONTENUS DU CONTENU DES RESSOURCES
SOUTIEN Une version PDF TÉLÉCHARGEABLES INTERACTIF EN LIGNES
Il contient le est mise en ligne Les fiches de Vous disposez de Les ressources sont
résumé théorique sur l’espace résumés ou des contenus consultables en
et le manuel des apprenant et exercices sont interactifs sous synchrone et en
travaux pratiques formateur de la téléchargeables forme d’exercices asynchrone pour
plateforme sur WebForce Life et de cours à s’adapter au
WebForce Life utiliser sur rythme de
WebForce Life l’apprentissage
QR CODE
03 heures
Activité n°1
INTRODUIRE LA NOTION CLIENT/SERVEUR
Compétences visées :
Recommandations clés :
03 heures
CONSIGNES
1. Pour le formateur :
• Demander aux apprenants de suivre les étapes décrites dans le résumé théorique
du cours et d'appliquer les procédures
• Demander aux apprenants de réaliser le travail de synthèse
2. Pour l’apprenant :
• Installer Apache, PHP et VS Code et y ajouter les extensions recommandées
• Créer un dossier de travail dans VS Code et y créer les fichiers des réalisations
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Installer et configurer les éléments pour créer une page web dynamique
Manipuler les éléments PHP de base
Activité 1
Apache
Configurer Apache
• Étape 1 : Accéder au « Panneau de configuration > Système et sécurité > Système > Paramètres avancés du système » pour modifier les variables d’environnement
système. Cliquer sur le bouton « Variables d’environnement », dans les variables système sélectionner « Path » et ajouter « C:\Apache24\bin »
• Étape 2 : Accéder au fichier « httpd.conf » depuis « C:\Apache24\conf » et modifier les commandes « #Listen 12.34.56.78:80 » et « Listen 80 » par « #Listen
127.0.0.1:122 » et « Listen 122 » par exemple
• Étape 3 : Ouvrir l’invite de commande avec les privilèges administrateur et écrire la commande suivante « httpd –k install »
• Étape 4 : Pour lancer Apache il y a deux façons :
• Ouvrir « Gestionnaire des tâches > Services » click droit et démarrer
• Ouvrir l’invite de commande avec les privilèges administrateur et écrire la commande suivante « httpd –k start »
• Étape 5 : Lancer Apache dans un navigateur, mettre dans l’URL « 127.0.0.1:122 » ou « http://localhost:122/ »
• Étape 6 : Vous pouvez modifier le texte dans « index.html » présent dans « C:\Apache24\htdocs »
PARTIE 1
Configurer PHP
• Étape 1 : Accéder au « Panneau de configuration > Système et sécurité > Système > Paramètres avancés du système » pour modifier les variables d’environnement
système. Cliquer sur le bouton « Variables d’environnement », dans les variables système sélectionner « Path » et ajouter « C:\php »
• Étape 2 : Copier le fichier « php.ini-development » et coller le dans le même emplacement en lui attribuant le nom « php.ini »
• Étape 3 : Ouvrir l’invite de commande avec les privilèges administrateur et écrire la commande suivante « php –v »
• Étape 4 : Accéder au fichier « httpd.conf » depuis « C:\Apache24\conf » et ajouter « index.php » dans « DirectoryIndex »
PARTIE 1
QR CODE
20 heures
Activité 1
Traiter les données
Compétences visées :
Recommandations clés :
06 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur la création des formulaires
• Rappeler les variables d’environnement
2. Pour l’apprenant :
• Mettre en place les différents composants d'un formulaire
• Définir les variables d’environnement
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Mettre en place les éléments d'un formulaire
Utiliser les variables prédéfinis
Activité 1
Manipuler les données en PHP
Réponses
1. Créez une page php qui affiche simplement la chaîne de caractères « Salut PHP, nous sommes le " suivie de la date du jour sur le serveur
<html>
<body>
Salut PHP, nous sommes le <?php echo Date("j/m/Y"); ?>
</body>
</html>
2. Créez une page php permettant d’afficher à la suite de la date, le message « C’est le matin" ou « C’est l’après-midi » en fonction de l’heure sur le serveur.
<html>
<body>
Salut PHP, nous sommes le <?php echo Date("j/m/Y"); ?>,
<?php
echo "il est ".Date("H:i:s")."<br>";
if ( Date("H") < 12 ) {
echo "C’est le matin";
PARTIE 2
} else {
echo "C’est l’après-midi";
}
?>
</body>
</html>
Réponses
3. Afficher dans un tableau la signification et la valeur des variables
<html>
d’environnement suivante
<body>
• $SERVER_ADDR <table border="1">
<caption align="top">Quelques variables d'environnement</caption>
• $HTTP_HOST
<tr><th align="center">Variable</th><th align="center">Valeur</th></tr>
• $REMOTE_ADDR <tr><td>Adresse IP du serveur web</td>
<td><?php echo $_SERVER['SERVER_ADDR'] ?></td></tr>
• gethostbyAddr($REMOTE_ADDR)
<tr><td>Nom du serveur web</td>
• $HTTP_USER_AGENT <td><?php echo $_SERVER['HTTP_HOST'] ?></td></tr>
<tr><td>Adresse IP du client</td>
<td><?php echo $_SERVER['REMOTE_ADDR'] ?></td></tr>
<tr><td>Nom de la machine cliente</td>
<td><?php echo gethostbyAddr($_SERVER['REMOTE_ADDR']) ?></td></tr>
<tr><td>Navigateur du client</td>
<td><?php echo $_SERVER['HTTP_USER_AGENT'] ?></td></tr>
</table>
</body>
PARTIE 2
</html>
Créer un formulaire
Créez un formulaire index.html comportant 2 champs de texte nom, prénom, un menu d’options sexe (M ou F), et un menu de choix multiples cours (simple, moyen,
difficile). Vous ferez appel à un script index.php pour traiter les données du formulaire. Elles seront envoyées par la méthode GET.
PARTIE 2
Réponses
4. Créez un formulaire index.html comportant 2 champs de texte nom, prénom, un menu d’options sexe (M ou F), et un menu de choix multiples cours (simple, moyen,
difficile). Vous ferez appel à un script index.php pour traiter les données du formulaire. Elles seront envoyées par la méthode GET.
<html> <html>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <body>
<body> <h1>Affichage des données saisies</h1>
<form action="index.php" method="get"> <ul>
Nom: <input type="text" name="nom"><br> <li>Nom: <?php print $_REQUEST['nom'] ?></li>
Prénom: <input type="text" name="prenom"><br> <li>Prénom: <?php print $_REQUEST['prenom'] ?></li>
Sexe: <select name="sexe"> <li>Sexe: <?php print $_REQUEST['sexe'] ?></li>
<option> <li>Cours:
<option>F <ul>
<option>M <?php
</select><br> if (isset($_REQUEST['cour']))
Cours: <br> foreach($_REQUEST['cour'] as $v) print "<li>$v</li>";
<select multiple name="cour[]"> ?>
<option value="simple">Simple</option> </ul>
<option value="moyen">Moyen</option> </ul>
PARTIE 2
Gérer un formulaire
1. Créer un formulaire comprenant un groupe de champs ayant pour titre "Adresse client". Le groupe doit permettre la saisie du nom, du prénom, de l’adresse, de la ville
et du code postal.
2. Les données sont ensuite traitées par un fichier PHP séparé récupérant les données et les affichant dans un tableau HTML.
3. Le résultat obtenu doit ressembler à la capture suivante :
Réponses
Fichier index.html
<tr>
<html> <td>Adresse : </td>
<head> <td><input type="text" name="adresse" /></td>
<meta http-equiv="Content-Type" content="text/html; </tr>
charset=iso-8859-1" /> <tr>
<title>TP</title> <td>Ville :</td>
</head> <td><input type="text" name="ville" /></td>
<body> </tr>
<form action= "index.php" method="post"> <tr>
<fieldset> <td>Code postal :</td>
<legend><b>Saisissez vos coordonnées </b></legend> <td><input type="text" name="code" maxlength="5"/></td>
<table border="0" > </tr>
<tr> <tr>
<td>Nom : </td> <td>CONFIRMER</td>
<td><input type="text" name="nom" /></td> <td><input type="submit" value="ENVOI" /></td>
</tr> </tr>
<tr>
PARTIE 2
</table>
<td>Prénom : </td> </fieldset>
<td> <input type="text" name="prenom" /></td> </form>
</tr> </body>
</html>
Fichier : index.html (Partie1)
Fichier : index.html (Partie2)
Réponses
Fichier index.php
<?php
echo "<table border=\"1\" >";
echo "<caption><b>Confirmation de vos
coordonnées</b></caption>";
foreach($_POST as $cle=>$val)
{
echo "<tr> <td> $cle : </td> <td>".stripslashes($val)
."</td></tr>";
}
echo "</table>";
?>
Fichier : index.php
PARTIE 2
Compétences visées :
Recommandations clés :
06 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur la création des formulaires
• Rappeler les bases théoriques sur la gestion des fichiers
2. Pour l’apprenant :
• Mettre en place les différents composants d'un formulaire
• Manipuler les fichiers
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Définir la structure d'un formulaire
Mettre en place les éléments d’un fichier
Déterminer les valeurs des propriétés des composants
Activité 2
Envoi d’un fichier
<html>
Réponses <head>
<?php <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
if(isset($_FILES['fich'])) <title>TP</title>
{ </head>
if($_POST["MAX_FILE_SIZE"] <$_FILES["fich"]["size"]) <body>
{ <form action="<?= $_SERVER['PHP_SELF'] ?>" method="post"
echo "<b>Taille trop grande </b><hr />"; enctype="multipart/form-data">
echo "Taille maximale autorisée :",$_POST["MAX_FILE_SIZE"],"octets<hr / >"; <fieldset>
echo "Taille du fichier transféré :",$_FILES["fich"]["size"],"octets<hr / >"; <legend><b>Transférez un fichier ZIP </b></legend>
} <table border="0" >
else <tr>
{ <td>Choisissez un fichier </td>
//Enregistrement et renommage du fichier <td><input type="file" name="fich" /></td>
$result=move_uploaded_file($_FILES["fich"]["tmp_name"],"monfichier.zip"); <td><input type="hidden" name="MAX_FILE_SIZE" accept="application/zip"
if($result==TRUE) value="1000000"/></td>
{ </tr>
echo "<b>Vous avez bien transféré le fichier</b><hr />"; <tr>
echo "Le nom du fichier est : ",$_FILES["fich"]["name"],"<hr/>"; <td> </td>
echo "Votre fichier a une taille de ",$_FILES["fich"]["size"],"<hr />"; <td><input type="submit" value="ENVOI" /></td>
PARTIE 2
} </tr>
else {echo "<hr /> Erreur de transfert n°",$_FILES["fich"]["error"];} </table>
} </fieldset>
} </form>
?> </body>
</html>
Fichier : index.php (Partie2)
Fichier : index.php (Partie1)
Exercices
1. Créer un livre d’or qui n’affiche que les cinq derniers avis donnés par les visiteurs du site.
2. Le résultat obtenu doit ressembler à la capture suivante :
PARTIE 2
Réponses
Fichier index.html
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Le livre est d'or </title>
</head>
<body style="background-color: #ffcc00;">
<form action="<?= $_SERVER['PHP_SELF']?>" method="post" >
<fieldset>
<legend><b>Donnez votre avis sur PHP 8 ! </b></legend>
<b>Nom : <input type="text" name="nom" width="60" /> <br>
Mail : <input type="text" name="mail" width="60" /> <br>
Vos commentaires sur le site</b><br>
<textarea name="comment" rows="10" cols="50"></textarea> <br>
<input type="submit" value="Envoyer " name="envoi" />
PARTIE 2
Réponses
<?php
Fichier index.html $date= time();
//ENREGISTREMENT
if(isset($_POST['envoi'])) {
if(isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['comment'])) {
echo "<h2>",$_POST['nom']," merci de votre avis </h2> ";
if(file_exists("livre2.txt") ) {
if($id_file=fopen("livre2.txt","a")) {
flock($id_file,2);
fwrite($id_file,$_POST['nom'].":".$_POST['mail'].":".$date.":".$_POST['comment']."\n");
flock($id_file,3);
fclose($id_file);
}
else{
echo "fichier inaccessible";
}
}
else {
$id_file=fopen("livre2.txt","w");
PARTIE 2
fwrite($id_file,$$_POST['nom'].":".$$_POST['mail'].":".$date.":".$$_POST['comment']."\n");
fclose($id_file);
}
}
}
Fichier : index.html (Partie2)
else {
echo "<h2>Donnez votre avis puis cliquez sur 'envoyer' !</h2> ";
}
?>
</body>
</html>
Fichier : index.html (Partie3)
Compétences visées :
Recommandations clés :
08 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur la programmation orientée objet
• Rappeler les méthodes magiques en PHP
2. Pour l’apprenant :
• Appliquer les concepts de programmation orientée objet
• Instancier un objet et une classe
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Créer un objet
Créer une classe
Manipuler les objets
Activité 3
Fonctions et classes
Fonctions et classes
1. Définir une classe Compte représentant un compte bancaire.
2. Cette classe contiendra deux attributs privés, montant et intérêt (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.
3. Créer deux comptes, un d’un montant de 200 dirhams à 20% et l’autre d’un montant de 1000 dirhams à 2%.
4. Afficher le montant de chaque compte au bout de 10 ans.
PARTIE 2
Réponses
<?php
class Compte{
private $montant;
private $interet;//En pourcentage
public function __construct($interet, $montantInitial) {
$this->montant = $montantInitial;
$this->interet = $interet;
}
public function un_an() {
$this->montant *= 1+ $this->interet / 100;
}
public function get_montant() {
return $this->montant;
}
}
$c1 = new Compte(20,200);
$c2 = new Compte(2,1000);
for($i = 1 ; $i <= 10 ; $i++) {
$c1->un_an();
PARTIE 2
$c2->un_an();
}
echo'<p> Valeur du compte = ' . $c1->get_montant() . ' dirhams </p>';
echo'<p> Valeur du compte = ' . $c2->get_montant() . ' dirhams </p>';
?>
Fichier : index.php
Fonctions et classes
1. Définir une classe Personne possédant les propriétés nom, prénom, et une méthode presenter() qui renvoie la chaîne de caractères "je m’appelle " suivie du nom et
prénom.
2. Créer un programme de test qui instancie 2 personnes, puis affiche leurs descriptions.
3. Ajoutez dans la classe Personne une propriété date de naissance et une méthode age() renvoyant l'âge
4. Tester la classe Personne
PARTIE 2
Réponses
1. Définir une classe Personne possédant les propriétés nom, prénom, et une méthode presenter() qui renvoie la chaîne de caractères « je suis » suivie du nom et
prénom.
<?php
class Personne {
// proprietes
var $nom;
var $prenom;
// constructeur
function __construct($nom, $prenom) {
$this->nom = $nom ;
$this->prenom = $prenom ;
}
// methodes
function presenter() {
return "je suis $this->nom $this->prenom" ;
PARTIE 2
}
}
?>
Fichier : Personne.php
Réponses
2. Créer un programme de test qui instancie 2 personnes, puis affiche leurs descriptions.
<html>
<body>
<?php
include "./personne.php";
// instanciation de Personne
$p1 = new Personne("nom1", "prénom1");
$p2 = new Personne("nom2", "prénom2");
// affichage
echo $p1->presenter()."<br>" ;
echo $p2->presenter()."<br>" ;
?>
</body>
</html>
PARTIE 2
Fichier : index.php
<?php
Réponses class Personne {
// proprietes
3. Ajoutez dans la classe Personne une propriété date de naissance et une
var $nom ;
méthode age() renvoyant l'âge (voir Personne.php) var $prenom ;
4. Tester la classe Personne (voir index.php) var $date_naiss ; //sous la forme jj/mm/aa
// constructeur
function __construct($nom, $prenom, $date_naiss) {
$this->nom = $nom ;
<html> $this->prenom = $prenom ;
<body> $this->date_naiss = $date_naiss ;
<?php }
include "./personne.php"; // methodes
// instanciation de Personne function presenter() {
$p1 = new Personne("nom1", "prénom1","31/12/1952"); $ch = "je m'appelle ".$this->nom." ".$this->prenom.", " ;
$p2 = new Personne("nom2", "prénom2","31/12/2006"); $age = $this->age();
// affichage $ch = $ch."j'ai ".$age." ans" ;
echo $p1->presenter()."<br>" ; return $ch ;
echo $p2->presenter()."<br>" ; }
?> function age() {
PARTIE 2
QR CODE
12 heures
Activité 1
Utilisation des cookies
Compétences visées :
Recommandations clés :
01 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur les cookies
2. Pour l’apprenant :
• Utiliser le résumé théorique
• Alimenter un cookie avec une donnée précise
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Récupérer les données d’un cookie
Alimenter un cookie par la donnée souhaitée
Mettre à jour les cookies
Activité 1
Utilisation des cookies
Exercice
Ecrire un script php qui permet de sauvegarder les heures de visites dans un cookie , et affiche les détails de visites comme suit :
Réponses
• Fichier index.php
<?php
// On vérifie si le cookie a été reçu dans la superglobale $_COOKIE.
if(isset($_COOKIE["dates_visites"])){
$liste_visites =$_COOKIE["dates_visites"];
$dates=unserialize($_COOKIE["dates_visites"]);
$dates[]=time();
setcookie("dates_visites",serialize($dates));
echo " Vous avez consulté cette page ".count($dates)." fois , voici les détails:";
echo "<ul>";
foreach ($dates as $key => $value) {
echo "<li>".date("d-m-Y H:i:s",$value)."</li>";
}
echo "</ul>";
}
else{ //Le cookie n’a pas été reçu
$dates[]=time();
PARTIE 3
setcookie("dates_visites",serialize($dates));
echo "C'est votre première visite :".date("d-m-Y H:i:s",time());
}
?>
Fichier : index.php
Compétences visées :
Recommandations clés :
03 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur les sessions
2. Pour l’apprenant :
• Utiliser le résumé théorique
• Maitriser les notions de sessions
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
4. Critères de réussite :
• Le stagiaire est-il capable de :
Définir les sessions
Alimenter la session par les données souhaitées
Authentification nécessaire pour accéder à la session
Activité 2
Utilisation des sessions
Exercice 1
Nous allons simuler un site marchant avec des pommes des poires et des bananes à acheter, on pourra les acheter une à une et supprimer toutes les pommes, toutes les
poires ou toutes les bananes. Il sera également possible de vider complètement son panier.
Dans cet exercice il faut stocker les tableaux dans des variables de sessions.
Réponses
• Fichier index.php
die();
Fichier : index.php (Partie1)
}
Réponses
• Fichier index.php
if (isset($_GET["achat"])) {
if (isset($_GET["raz"])) { // On a demandé à incrémenter une valeur
// On a demandé à reinitialiser une valeur switch ($_GET["achat"]) {
switch ($_GET["raz"]) { case "pomme":
case "pomme": $caddie["pommes"]++;
$caddie["pommes"] = 0; break;
break; case "poire":
case "poire": $caddie["poires"]++;
$caddie["poires"]=0; break;
break; case "banane":
case "banane": $caddie["bananes"]++;
$caddie["bananes"]=0; break;
break; }
} // "sauvegarde" des modifications
$_SESSION["caddie"] = $caddie;
// "sauvegarde" des modifications header("Location: ".$_SERVER["PHP_SELF"]);
$_SESSION["caddie"] = $caddie; die();
PARTIE 3
header("Location: ".$_SERVER["PHP_SELF"]); }
die();
}
Fichier : index.php (Partie4)
Réponses
• Fichier index.php
?>
Nb Pommes:<?php echo $caddie["pommes"];?><br />
<a href="<?php echo $_SERVER["PHP_SELF"];?>?achat=pomme">Acheter une pomme</a>
<a href="<?php echo $_SERVER["PHP_SELF"];?>?raz=pomme">RAZ</a><br />
<br />
Nb Poires:<?php echo $caddie["poires"];?><br />
<a href="<?php echo $_SERVER["PHP_SELF"];?>?achat=poire">Acheter une poire</a>
<a href="<?php echo $_SERVER["PHP_SELF"];?>?raz=poire">RAZ</a><br />
<br />
Nb Bananes:<?php echo $caddie["bananes"];?><br />
<a href="<?php echo $_SERVER["PHP_SELF"];?>?achat=banane">Acheter une banane</a>
<a href="<?php echo $_SERVER["PHP_SELF"];?>?raz=banane">RAZ</a><br />
PARTIE 3
<br/>
<a href="<?php echo $_SERVER["PHP_SELF"];?>?action=destroy">Détruire la session</a><br/>
Exercice 2 :
L'objectif et de créer trois pages PHP:
• login.php : qui authentifie l'utilisateur. Elle contient un formulaire renfermant une zone de texte, une zone de mot de passe et un bouton d'envoi.
• session.php : qui représente la page à accès limité. Aucun visiteur n'a le droit de voir son contenu s'il n a pas été authentifié par la page login.php.
• deconnexion.php : est la page qui permet de déconnecter le client (détruire la session) et rediriger le navigateur vers la page login.php.
Si le client tente d'accéder directement à la page session.php alors qu'il n'est pas authentifié, il sera aussitôt redirigé vers la page login.php. S'il fournit un bon login et un
bon mot de passe alors il sera redirigé vers la page session.php qu'il a désormais le droit de consulter.
Pour simplifier, nous allons définir statiquement le bon login qui est "user" et le bon mot de passe qui est "1234".
PARTIE 3
Réponses
• Fichier login.php
Réponses
• Fichier deconnexion.php
<?php
session_start();
session_destroy();
header("location:login.php");
?>
Fichier : deconnexion.php
PARTIE 3
Compétences visées :
Recommandations clés :
08 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur la manipulation des données
2. Pour l’apprenant :
• Utiliser le résumé théorique
• Maitriser les notions de CRUD
3. Conditions de réalisation :
• Support de résumé théorique accompagnant
• Base de donnée MySQL
• L'extension PHP Data Objects (PDO)
4. Critères de réussite :
• Le stagiaire est-il capable de :
Appeler différent pages PHP
Établir une connexion avec MySQL
Écrire, lire et supprimer les données de la base de données
Activité 3
Gestion des données avec MySQL
Exercice
L'objectif et de créer, lire, mettre à jour et supprimer (CRUD) en php les données d’une table mysql en utilisant Php Data Object (pdo) :
• La Base de donnée « mydb » contient une table « etudiant »
• La table « etudiant » contient trois colonnes « id », « nom » et « email ».
• create.php : permet la création d’un nouveau étudiant dans la base de données.
• edit.php : permet la mise à jour d’un étudiant dans la base de données.
• delete.php : permet la suppression d’un étudiant dans la base de données (Il faut avoir un message de confirmation).
• db.php : permet la connexion à la base de données.
• index.php : permet de traiter les données.
• header.php : permet d’afficher 2 lien:
• Accueil : Affiche un tableau avec toute la liste des étudiants présent dans la base de données.
• Créer un étudiant : permet la création d’un étudiant dans la base de données (Il faut avoir un message de confirmation).
PARTIE 3
Exercice (suite)
Réponses
Base de données : CREATE TABLE `mydb`.`etudiant` (id int(11) auto_increment primary key,nom varchar(30) not null,email varchar(30) not null);
Fichier : db.php
<?php
$dsn = 'mysql:host=localhost;dbname=mydb';
$username = 'root';
$password = 'root';
$options = [];
try {
$connection = new PDO($dsn, $username, $password, $options);
}
catch(PDOException $e) {
}
PARTIE 3
Fichier : db.php
Fichier : header.php
Copyright - Tout droit réservé - OFPPT 68
Activité 3
Gestion des données avec MySQL
Réponses
<?php
require 'db.php';
$message = '';
if (isset ($_POST['nom']) && isset($_POST['email']) ) {
$nom = $_POST['nom'];
$email = $_POST['email'];
$sql = 'INSERT INTO etudiant(nom, email) VALUES(:nom, :email)';
$statement = $connection->prepare($sql);
if ($statement->execute([':nom' => $nom, ':email' => $email])) {
$message = 'Donnée créée avec succès';
}
}
PARTIE 3
?>
Fichier : create.php (Partie 1)
<div class="form-group">
<button type="submit" class="btn btn-info">Créer un étudiant</button>
</div>
</form>
</div>
</div>
</div>
Réponses
<?php
require 'db.php';
$id = $_GET['id'];
$sql = 'SELECT * FROM etudiant WHERE id=:id';
$statement = $connection->prepare($sql);
$statement->execute([':id' => $id ]);
$person = $statement->fetch(PDO::FETCH_OBJ);
if (isset ($_POST['nom']) && isset($_POST['email']) ) {
$nom = $_POST['nom'];
$email = $_POST['email'];
$sql = 'UPDATE etudiant SET nom=:nom, email=:email WHERE id=:id';
$statement = $connection->prepare($sql);
if ($statement->execute([':nom' => $nom, ':email' => $email, ':id' => $id])) {
header("Location: /");
}
PARTIE 3
}
?>
<div class="form-group">
<button type="submit" class="btn btn-info">Mise à jour d'un étudiant</button>
</div>
</form>
</div>
</div>
</div>
Réponses
<?php
require 'db.php';
$id = $_GET['id'];
$sql = 'DELETE FROM etudiant WHERE id=:id';
$statement = $connection->prepare($sql);
if ($statement->execute([':id' => $id])) {
header("Location: /");
}
PARTIE 3
Fichier : delete.php
Réponses
<?php
require 'db.php';
$sql = 'SELECT * FROM etudiant';
$statement = $connection->prepare($sql);
$statement->execute();
$etudiant = $statement->fetchAll(PDO::FETCH_OBJ);
?>
PARTIE 3
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
</div>
</div>
QR CODE
08 heures
Activité 1
Vers une architecture MVC
Compétences visées :
Recommandations clés :
08 heures
CONSIGNES
1. Pour le formateur :
• Rappeler les bases théoriques sur l’architecture MVC
2. Pour l’apprenant :
• Utiliser le résumé théorique
• Maitriser les notions de MVC
• Utiliser un paramètre comme jeton d’authentification
3. Conditions de réalisation :
• Base de donnée MySQL
• L'extension PHP Data Objects (PDO)
• Structure de base de MVC
4. Critères de réussite :
• Le stagiaire est-il capable de :
Établir une connexion avec MySQL
Écrire, lire et supprimer les données de la base de données
Utiliser les notions MVC
Créer une API RESTful
Activité 1
Vers une architecture MVC
Exercice
1. Créer une base de données qui se compose de deux tables, l'une stockant les billets (articles) du blog et l'autre les commentaires associés aux articles.
mydb.t_billet mydb.t_commentaire
Réponses
drop table if exists T_COMMENTAIRE;
drop table if exists T_BILLET;
create table T_BILLET (
BIL_ID integer primary key auto_increment,
BIL_DATE datetime not null,
BIL_TITRE varchar(100) not null,
BIL_CONTENU varchar(400) not null
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
create table T_COMMENTAIRE (
COM_ID integer primary key auto_increment,
COM_DATE datetime not null,
COM_AUTEUR varchar(100) not null,
PARTIE 4
Exercice
2. Insérer des données pour avoir le résultat suivant:
Réponses
Exercice
3. Créer un répertoire Modele qui contient le code d'accès aux données :
• Modele.php : Classe abstraite Modèle. Centralise les services d'accès à une base de données et utilise l'API PDO.
• Billet.php : Permet d'afficher les informations demandées de la table t_billet. Contient deux fonctions:
• getBillets() : Renvoie la liste des billets du blog.
• getBillet($idBillet) : Renvoie les informations sur un billet.
• Commentaire.php : Une classe sur le même modèle que la classe Billet. Contient deux fonctions:
• getCommentaires($idBillet) : Renvoie la liste des commentaires associés à un billet.
• ajouterCommentaire($auteur, $contenu, $idBillet) : Ajoute un commentaire dans la base de données.
PARTIE 4
Réponses
<?php
abstract class Modele {
private $bdd;
protected function executerRequete($sql, $params = null) {
if ($params == null) {
$resultat = $this->getBdd()->query($sql);
}
else {
$resultat = $this->getBdd()->prepare($sql);
$resultat->execute($params);
}
return $resultat;
}
private function getBdd() {
if ($this->bdd == null) {
$this->bdd = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8',
'root', 'root',
PARTIE 4
Réponses
<?php
require_once 'Modele/Modele.php';
class Billet extends Modele {
public function getBillets() {
$sql = 'select BIL_ID as id, BIL_DATE as date,'
. ' BIL_TITRE as titre, BIL_CONTENU as contenu from T_BILLET'
. ' order by BIL_ID desc';
$billets = $this->executerRequete($sql);
return $billets;
}
public function getBillet($idBillet) {
$sql = 'select BIL_ID as id, BIL_DATE as date,'
. ' BIL_TITRE as titre, BIL_CONTENU as contenu from T_BILLET'
. ' where BIL_ID=?';
$billet = $this->executerRequete($sql, array($idBillet));
if ($billet->rowCount() > 0)
PARTIE 4
Fig. : Billet.php
Réponses
<?php
require_once 'Modele/Modele.php';
class Commentaire extends Modele {
public function getCommentaires($idBillet) {
$sql = 'select COM_ID as id, COM_DATE as date,'
. ' COM_AUTEUR as auteur, COM_CONTENU as contenu from T_COMMENTAIRE'
. ' where BIL_ID=?';
$commentaires = $this->executerRequete($sql, array($idBillet));
return $commentaires;
}
Fig. : Commentaire.php
Exercice
4. Créer un répertoire Vue regroupant le code d'affichage :
• gabarit.php : (template en anglais) Ce modèle contiendra tous les éléments communs et permettra d'ajouter les éléments spécifiques à chaque vue.
• vueAccueil.php : Permet d’afficher la l’ensemble des titres billets (lien qui renvoie à la vueBillet.php) avec leurs date.
• vueBillet.php : Permet d’afficher l’ensemble des commentaires du Billet sélectionné. Permet d’ajouter un nouveau commentaire pour ce billet.
• vueErreur.php : Permet d’afficher un message d’erreur. Exemples :
• http://localhost:122/index.php?action=billet&id=UIF => Affiche : Identifiant de billet non valide (toujours avec l’entête et le pied de la page)
• http://localhost:122/index.php?action=billet => Affiche : Paramètre 'id' absent (toujours avec l’entête et le pied de la page)
• Vue.php : La classe Vue dont le rôle sera de gérer la génération des vues.
PARTIE 4
Réponses
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="Contenu/style.css" />
<title><?= $titre ?></title>
</head>
<body>
<div id="global">
<header>
<a href="index.php"><h1 id="titreBlog">TP Blog</h1></a>
<p>Je vous souhaite la bienvenue sur ce blog.</p>
</header>
<div id="contenu">
<?= $contenu ?>
</div>
<footer id="piedBlog">
PARTIE 4
Réponses
Fig. : vueAccueil.php
Réponses
<?php $this->titre = "Mon Blog - " . $billet['titre']; ?>
<article>
<header>
<h1 class="titreBillet"><?= $billet['titre'] ?></h1>
<time><?= $billet['date'] ?></time>
</header>
<p><?= $billet['contenu'] ?></p>
</article>
<hr />
<header>
<h1 id="titreReponses">Réponses à <?= $billet['titre'] ?></h1>
</header>
<?php foreach ($commentaires as $commentaire): ?>
<p><?= $commentaire['auteur'] ?> dit :</p>
<p><?= $commentaire['contenu'] ?></p>
<?php endforeach; ?>
<hr />
<form method="post" action="index.php?action=commenter">
PARTIE 4
Réponses
Fig. : vueErreur.php
Réponses
<?php
class Vue {
private $fichier;
private $titre;
public function __construct($action) {
$this->fichier = "Vue/vue" . $action . ".php";
}
public function generer($donnees) {
$contenu = $this->genererFichier($this->fichier, $donnees);
$vue = $this->genererFichier('Vue/gabarit.php’, array('titre' => $this->titre, 'contenu' => $contenu));
echo $vue;
}
private function genererFichier($fichier, $donnees) {
if (file_exists($fichier)) {
extract($donnees);
ob_start();
require $fichier;
return ob_get_clean();
PARTIE 4
}
else {
throw new Exception("Fichier '$fichier' introuvable");
}
}
}
Fig. : Vue.php
Copyright - Tout droit réservé - OFPPT 92
Activité 1
Vers une architecture MVC
Exercice
5. Créer un répertoire Controleur regroupant le code d'affichage :
• ControleurAccueil.php : Est une classe qui permet de gérer l'accueil. Contient deux fonctions:
• __construct() : Crée un nouveau objet Billet
• accueil() : Affiche la liste de tous les billets du blog
• ControleurBillet.php : Permet de gérer l'affichage d'un billet. Contient deux fonctions:
• __construct() : Crée deux nouveau objets Billet et Commentaire.
• billet($idBillet) : Affiche les détails sur un billet
• commenter($auteur, $contenu, $idBillet) : Ajoute un commentaire à un billet
• Routeur.php : le routeur dont la méthode principale est d’analyser la requête entrante pour déterminer l'action à entreprendre. Contient 4 fonctions:
• __construct() : Crée deux nouveau objets ControleurAccueil et ControleurBillet.
• routerRequete() : Route une requête entrante : exécution l'action associée
• erreur($msgErreur) : Affiche une erreur
PARTIE 4
Réponses
<?php
require_once 'Modele/Billet.php';
require_once 'Vue/Vue.php';
class ControleurAccueil {
private $billet;
public function __construct() {
$this->billet = new Billet();
}
public function accueil() {
$billets = $this->billet->getBillets();
$vue = new Vue("Accueil");
$vue->generer(array('billets' => $billets));
}
PARTIE 4
Fig. : ControleurAccueil.php
Réponses
<?php
require_once 'Modele/Billet.php';
require_once 'Modele/Commentaire.php';
require_once 'Vue/Vue.php';
class ControleurBillet {
private $billet;
private $commentaire;
public function __construct() {
$this->billet = new Billet();
$this->commentaire = new Commentaire();
}
public function billet($idBillet) {
$billet = $this->billet->getBillet($idBillet);
$commentaires = $this->commentaire->getCommentaires($idBillet);
$vue = new Vue("Billet");
$vue->generer(array('billet' => $billet, 'commentaires' => $commentaires));
}
PARTIE 4
Réponses
<?php
public function routerRequete() { require_once 'Controleur/ControleurAccueil.php';
try { require_once 'Controleur/ControleurBillet.php';
if (isset($_GET['action'])) { require_once 'Vue/Vue.php';
if ($_GET['action'] == 'billet') { class Routeur {
$idBillet = intval($this->getParametre($_GET, 'id')); private $ctrlAccueil;
if ($idBillet != 0) { $this->ctrlBillet->billet($idBillet); } private $ctrlBillet;
else throw new Exception("Identifiant de billet non valide"); public function __construct() {
} $this->ctrlAccueil = new ControleurAccueil();
else if ($_GET['action'] == 'commenter') { $this->ctrlBillet = new ControleurBillet();
$auteur = $this->getParametre($_POST, 'auteur'); }
$contenu = $this->getParametre($_POST, 'contenu'); //public function routerRequete() { ... }
$idBillet = $this->getParametre($_POST, 'id'); private function erreur($msgErreur) {
$this->ctrlBillet->commenter($auteur, $contenu, $idBillet); $vue = new Vue("Erreur");
} $vue->generer(array('msgErreur' => $msgErreur));
else throw new Exception("Action non valide"); }
PARTIE 4
Exercice
6. Créer un répertoire Contenu regroupant le style:
• Style.css : Une feuille de style CSS est utilisée afin d'améliorer le rendu HTML
PARTIE 4
Réponses
#global {
min-height: 100%;
background: #333534;
width: 70%;
html, body { margin: auto;
height: 100%; text-align: justify;
} padding: 5px 20px;
body { }
color: #bfbfbf; #contenu {
background: black; margin-bottom : 30px;
font-family: 'Futura-Medium', 'Futura', 'Trebuchet MS', sans-serif; }
} #titreBlog, #piedBlog {
h1 { text-align: center;
color: white; }
} #titreReponses {
.titreBillet { font-size : 100%;
PARTIE 4
margin-bottom : 0px; }
} #txtCommentaire {
width: 50%;
}