Vous êtes sur la page 1sur 43

COURS Développement web PHP

CHAP 1: Les bases - Introduction et


structure du site

1.0 Introduction
Nous allons lors de ce cours créer un site de gestion de livres.
Avant de commencer, nous allons installer un éditeur de code (je vous conseille
VSCODE) ensuite vous allez installer XAMPP et le configurer, vous pouvez
définir votre port si vous voulez.

Lors de ce cours nous allons proposer une structure d’un site complet en PHP
nous allons utiliser l’architecture MVC, de la méthode de programmation POO
associée à une base de donnée mysql.
➢ Structure du site: Créer une structure basique d’un site Web.
➢ Programmation orientée objet: Structurer les données et les traitements en
POO.
➢ Base de données MySQL: ajouter des bases de données gérées en PDO.
➢ Architecture MVC: modifier l’architecture pour être conforme au MVC.
➢ CRUD: réaliser les traitements, d’affichage, d’ajout, de modification, et
de suppression de livres présents dans une BD.

1.1 STRUCTURE GÉNÉRALE DU SITE

Nous allons définir la structure global du DOM en suite nous allons:


1. créer un dossier nommé bibliothèque dans le répertoire htdoc.
2. Créer le fichier index.php
1.2 IMPLÉMENTATION:

1.2.1 Page d’accueille:


objectifs:
Nous allons
1. Générer une structure html de base
2. Ajouter des thèmes de bootstrap
3. Ajouter un Menu pour le site de la bibliothèque.

Dans le fichier index.php nous avons le code suivant:

<?php ob_start()?>
Voici le contenu de ma page d accueill
<?php
$content = ob_get_clean();
$titre="page d acceuille";
require "template.php";
?>

les extensions dont vous avez besoin sont: phpdebeug et phpentelephense.

1.2.2 Template de base:


Objectif:
1. Uniformiser la structure générale du site (avoir pratiquement une
structure commune à toutes les pages du site )
2. Modifier le fichier index.php pour utiliser template grâce au buffer

Dans le fichier livres.php , nous avons le code suivant:


Objectif:

<?php ob_start() ?>

ici le contenu de ma page listant les livres

<?php
$content = ob_get_clean();
$titre = "Les livres de la bibliothèque";
require "template.php";
?>

➢ Dans le fichier templates.php , nous avons:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<link rel="stylesheet"
href="https://bootswatch.com/5/quartz/bootstrap.min.css">
<title>Document</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<button class="navbar-toggler" type="button"
data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse"
id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.php">Accueill</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="livres.php">Mes Livres</a>
</li>
</ul>

</div>
</nav>
<div class="container">
<h1 class="rounded border border-dark p-2 m-2 text-center
text-white bg-info"> <?php echo "$titre" ?> </h1>
<?php echo "$content" ?>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV
0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper
.min.js"
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3
UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstr
ap.min.js"
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uo
d8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

</body>
</html>

Et une aperçue de la page livre est la suivante:

<?php ob_start()?>
Contenu de la page des livres de la bibliotheque
<?php
$content = ob_get_clean();
$titre="Les livres de la bibliotheque";
require "template.php";
?>

1.2.3 Liste des livres :

Objectif:
1. Ajouter des images dans le dossier/public/images
2. Créer un tableau html listant les livres.
Dans le fichier livres.php, nous avons:

<?php ob_start()?>

<table class="table table-striped table-dark">


<thead>
<tr>
<th scope="col">Images</th>
<th scope="col">Titres</th>
<th scope="col">Nombres de pages</th>
<th scope="col">Actions</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"><img src="public/imagees/algo.jpeg"></th>
<td>Algorithmiques :Cours avec 957 exercices et 158 problemes</td>
<td>300</td>
<td><a type="button" class="btn btn-outline-success">Modifier</a></td>
<td><a type="button" class="btn btn-outline-danger" >Supprimer</a></td>

</tr>
<tr>
<th scope="row"><img src="public/imagees/download.jpeg"></th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
<td>@fat</td>

</tr>
<tr>
<th scope="row"><img src="public/imagees/langC.jpeg"></th>
<td>Larry</td>
<td>the Bird</td>
<td>@twitter</td>
<td>@twitter</td>

</tr>
</tbody>

</table>
<a type="button" class="btn btn-outline-success d-block">AJOUTER</a>

<?php
$content = ob_get_clean();
$titre="Les livres de la bibliotheque";
require "template.php";
?>

CHAP 2: LA PROGRAMMATION ORIENTÉE


OBJET (POO)

2.0 Introduction:

Dans cette partie nous allons voir les choses d’une autre manière. Nous allons modéliser les
livres sous forme de classes. Cette classe livre aura pour attribut: identifiant, titre, nombre de
pages, et le chemin pour accéder à l’emplacement de l’image. et pour méthode sont : les
getters et les setters. L’objectif est de modéliser les informations de la page livre sous forme
de classes:

2.1 IMPLÉMENTATION:

Alors nous avons la classe Livre

voici les étapes:


Créer un nouveau fichier dans le répertoire du projet du nom de ClasseLivres.php . Dans ce
fichier vous allez créer une classe pour représenter l’ensemble des livres et aussi nous
créerons un constructeur qui servira de créer les instances de livres ainsi que les getters et
setters pour avoir accès aux éléments de la classe.

Écrit la signature de la classe Livres de manière suivante:

ensuite vous mettez en place le constructeur de la classe Livres:

Et ensuite les getters et setters de la classe Livres:


Dans le fichier livres.php contenant la liste des livres, nous allons écrire les livres et nous
allons créer un tableau contenant les livres que nous venons de déclarer. et au final nous
allons utiliser un tableau pour afficher les livres en utilisant une boucle for.

–créer les livres et un tableau nomme listeLivres qui contiendra la liste des livres.

–ensuite nous allons nous servire du tableau et parcourire la liste des livres les afficher selon
le code suivant:

<table class="table table-striped table-dark">


<thead>
<tr>
<th scope="col">Images</th>
<th scope="col">Titres</th>
<th scope="col">Nombres de pages</th>
<th scope="col">Actions</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
</table>
<a type="button" class="btn btn-outline-success d-block">AJOUTER</a>

<!--
<tr>
<th scope="row"><img src="public/imagees/download.jpeg"></th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row"><img src="public/imagees/langC.jpeg"></th>
<td>Larry</td>
<td>the Bird</td>
<td>@twitter</td>
<td>@twitter</td>

</tr>
-->
<?php
$content = ob_get_clean();
$titre="Les livres de la bibliotheque";
require "template.php";
?>
Visitez alors le rendu du site pour constater les modifications:
● Manipulation des attributs et fonctions statiques.

Nous nous fixons pour objectif de créer une variable statique dans la
classe livre et qui sera disponible d'accès par les les fonctions
tierces créées à l'intérieure de notre classe. Cette variable sera
connue par la classe et non via les objets comme nous l’avons fait
précédemment dans le fichier livres.php.

Editons la classe Livres en ajoutant une variable statique qui contient


la liste des livres de la manière suivante:
en effet la variable $livres contiendra la liste des livres
precedemment cree dans le fichier livres.php.

Ensuite nous aurons quelques modifications à effectuer dans le


fichier livres.php:
–Nous allons enlever la table $listLivres des livres que nous
avons créé
Ensuite allez à l'adresse localhost/……/livres.php vous aurez le même
affichage après avoir actualisé la page.
il reste quelques modifications a faire dans livres.php de la manière
suivante:

Cette partie nous montre un exemple concret de l’utilisation de la


variable static.(Static nous a permis de créer une variable qui
contient la liste des livres de façon dynamique et de l'utiliser dans
le fichier livre.)

EXERCICE 1:

Créer une classe LivreManager qui aura pour but de gérer les livres
sans passer par les attributs static

LivreManager

livres

getLivres()
ajoutLivre(livre)
faites les modifications nécessaires pour permettre à LivresManager
d'implémenter ces fonctionnalités.

RÉPONSE À L’EXERCICE:

La classe LivreManager a pour attribut $livre, cette même attribut que


nous avions rendue statique dans la classe Livre{ .. } pour pouvoir
l’utiliser dans le fichier principale livre.php.

Alors voici les étapes pour avoire une classe LivreManager et qui
implémente les fonctions getLivres();

Dans un fichier LivreManager.php nous avons le code suivant:


Ensuite nous allons renoncer a la variable statique $livre que
nous manipulions dans le fichier livre. ensuite cette
expression:( self::$livres[]= $this;)

Une grande modification devra etre faite dans le fichier


livre.php.
Nous devrons crer des instances de la classe LivreManager et
leur donner en parametre les objets livres que nous avions
crees $l1, $l2, $l3, ……. Nous utiliserons la fonction
ajoutLivres() implementee par cette classe pour ajouterles 3
livres.

Au finale dans la boucle for appeler la fonction getLivres()


sur la classe LivreMager Pour afficher simplement les elements
carteristiques de chaque livre comme suit:
Et finalement dans la boucle for ….
actualisez finalement le lien :
http://localhost/bibliotheque/livres.php
pour voire le resultat:
CHAP 3: LA BASE DE DONNÉES

Introduction:

I. Création de la base de données.

Exercice:
Réalisez la base de données comme l’indique le schéma suivant.
ensuite vous insérez les informations des livres qui ont été codés en dur dans le fichier .php
comme suit.

II. Connexion à la base de données


grâce à pdo.
voici le code de connexion grâce à PDO pour manipuler les données de la base de données..
on créera une class abstraite Model pour pouvoir gérer la connexion a la base de donnée.

III. Récupération des livres.


La classe Manager va utiliser la classe <<Model>> pour aller récupérer les livres . alors cette
classe doit hériter de celle- ci pour utiliser la bd.

Nous créerons une fonction chargement qui va charger les livres de la BD dans le tableau de
livres du Manager. ( faite ceci en guise d’exercice.)

Réponse:
Après l'écriture qui permet d'assurer la connexion a la base de donnée, Nous écrirons une
fonction dans la classe LivreManager qui permet de charger les livres.

cette fonction, tout en utilisants les objets pdo, préparera une requête qu’elle fera exécutée
dans la base de donnée tout en spécifiant les paramètres de la classe délivre créé dans la base
de donnée:
Ne pas oublier de réaliser un héritage de la classe Model. à partir de la classe livre Manager.
Ne pas oublier de faire require_once() verse la classeLivre.php et ModelClasse.php

au finale appeler la fonction qui permet de charger les livre tout en se servant de livre
Manager:
NB: Effacer les livres coddes en dure dans le fichier php ainsi que les objets livres declarres:
CHAP3: ARCHITECTURE MVC
Introduction:

MVC, l'acronyme de Modèle Vue contrôleur, est une architecture la plus utilisée en
développement web php.
Elle sépare les parties du site en plusieurs morceaux (3 principalement) .
Le Modèle: Correspond à la partie des données.
La vue correspond à la partie d’affichage.
Le contrôleur: Correspond à la partie pilotage.

C’est une architecture qui permet une meilleure sécurisation du code, une
maintenabilité plus aisée et assure la cohérence globale du site.
Le principal inconvénient de cette architecture est la lourdeur de sa mise en place.
NB: Au final, le site n’aura qu’une seule page index.php

I. Architecture MVC.

LE MODÈLE: Permet de récupérer les données demandées par le contrôleur.

Le CONTRÔLEUR: Permet de piloter la demande du <<client>> pour aller chercher les


données nécessaires et les transmettre à la vue. Il coordonne ce qui doit être mis en place
pour renvoyer le résultat.
LA VUE: Permet d’afficher les pages demandées , en utilisant les données transmises
par le contrôleur.
NB: Il ne doit y avoir aucun lien entre le modèle et la vue.

Modèle
Élément qui contient les données ainsi que de la logique en rapport avec les
données : validation, lecture et enregistrement . Il peut, dans sa forme la plus
simple, contenir uniquement une simple valeur, ou une structure de données
plus complexe . Le modèle représente l'univers dans lequel s'inscrit
l'application. Par exemple pour une application de banque, le modèle
représente des comptes, des clients, ainsi que les opérations telles que dépôt
et retraits, et vérifie que les retraits ne dépassent pas la limite de crédit .
Vue
Partie visible d'une interface graphique . La vue se sert du modèle, et peut
être un diagramme, un formulaire, des boutons, etc. Une vue contient des
éléments visuels ainsi que la logique nécessaire pour afficher les données
provenant du modèle . Dans une application de bureau classique, la vue
obtient les données nécessaires à la présentation du modèle en posant des
questions. Elle peut également mettre à jour le modèle en envoyant des
messages appropriés. Dans une application web une vue contient des balises
HTML3.
Contrôleur
Module qui traite les actions de l'utilisateur, modifie les données du modèle
et de la vue
Dans le cas d’un site internet on a un aspect: L’aspect routeur:
Le fichier routeur permet de créer les routes vers les pages demandées par
l’utilisateur.

II. CRÉATION DE LA STRUCTURE DES DOSSIERS.

Nous devons créer trois dossiers:


Le dossier controllers, le dossier Models, et le dossier Views,
Le fichier index.php va jouer alors le rôle de routeur . c’est lui qui va diriger les demandes de
l’utilisateur vers le contrôleur.

II.a Modification du fichier index.php.

Nous allons créer la vue accueille.view.php dans le dossier views, contenant le code déjà
présent dans le fichier index.php.

Le fichier index.php doit router les demandes des utilisateurs vers les pages correspondantes:
pour cela le fichier va regarder les urls et et choisir le bon canal pour réaliser les actions.
Dans index.php nous avons:
<?php

if(empty($_GET['page'])){
require "views/accueil.views.php";
} else {
switch($_GET['page']){
case "accueil" : require "views/accueil.views.php";
break;
}
}

1. Dans accueil.view.php , coupez et coller tout le code qui est dans index.php
2. Dans lives.views.php , coupez et coller tout le code qui est dans livres.php
3. Dans template.view.php , coupez et coller tout le code qui est dans templates.php
Un dernier exercice est de savoire router les liens vers les fiers qui se trouve dans le
dossier views de la maniere suivante:
ainsi nous venons de mettre en place la VUE

III. LE CONTRÔLEUR

En effet dans le fichier livre.views.php il a certains bout de codes qui réalisent des actions
(fonctionnalités du contrôleur) Dans le model MVC chaque couche doit jouer son rôle en
priorité. S’il doit y avoir quelques traitements dans une page de vue , celui- ci doit être très
minimaliste. Ainsi la maintenabilité du site devient un travail facile pour tous développeurs.

Nous allons créer un fichier livreControleur.php dans ce fichier, nous allons créer une classe
LivreControlers de la manière suivante:
Quelques modifications reste à faire dans le fichier index.php

Le MVC SUITE ET FIN

Voici la structure generale des fichier lorsque l’architecture MVC est bien implementee:
voici les fichiers et les codes dans le model:
Dans le fichier Model il dois y avoire 3 fichier:

le fichier ClasseLivre.php, le fichier Livre Manager.php et le fichier Model.classe.php

dans le fichier ClasseLivre.php on a le code suivant:


<?php
class Livres{
private $id;
private $titre;
private $nbPages;
private $image;

// public static $livres; //sera la variablle representant le tableau de


livres

public function __construct($id,$titre,$nbPages,$image)


{$this->id=$id;
$this->titre=$titre;
$this->nbPages=$nbPages;
$this->image=$image;
// self::$livres[]= $this; // pour avoir acces

public function getId(){return $this->id;}


public function setId($id){$this->id=$id;}

public function getTitre(){return $this->titre;}


public function setTitre($titre){$this->titre=$titre;}

public function getnbPages(){return $this->nbPages;}


public function setnbPages($nbPages){$this->nbPages=$nbPages;}

public function getimage(){return $this->image;}


public function setimage($image){$this->image=$image;}

?>

Dans le fichier LivreManager.php on a:


<?php
require_once "models/Model.classe.php";
require_once "models/ClasseLivres.php";
class LivreManager extends Model{

private $livres;

public function ajoutLivre($livres){


$this->livres[]=$livres;

}
public function getLivres(){
return $this->livres;
}

//la suite dou programme ici

public function chargerLivres(){


$req=$this->getBdd()->prepare("SELECT * FROM livres");
$req->execute();
$mesLivres=$req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
// print $mesLivres;

foreach($mesLivres as $livre){
$l=new Livres($livre['id'],
$livre['titre'],$livre['nbPages'],$livre['images']);
$this->ajoutLivre($l);
}
}
}?>

Dans le fichier Model.class.php on a:

<?php
abstract class Model{
private static $pdo;

private static function setBdd(){


self::$pdo = new PDO("mysql:host=localhost; dbname=bibliotheque;
charset=utf8","root","");
self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

protected function getBdd(){


if(self::$pdo==null){
self::setBdd();
}
return self::$pdo;
}
}
?>

DAns le dossier view

On a le fichier accueil.views.php
<?php ob_start()?>
Voici le contenu de ma page d accueill
<?php
$content = ob_get_clean();
$titre="page d acceuille";
require "views/template.view.php";
?>
Dans le fichier Livre.view.php on a le code suivant:

<?php
require_once "models/ClasseLivres.php";
//$l1=new livres(1,"Algorithme et structures de donnees",300, "algo.jpeg");
//$l2=new livres(2,"Language C",200,"langC.jpeg");
//$l3=new livres(3,"Nom du livre 3",100,"download.jpeg");
//$listLivres=[$l1,$l2,$l3];

//require_once "LivreManager.php";
//$livreManager=new LivreManager;
//$livreManager->chargerLivres();

//$livreManager->ajoutLivre($l1);
//$livreManager->ajoutLivre($l2);
//$livreManager->ajoutLivre($l4);

ob_start()?>

<table class="table table-striped table-dark">


<thead>
<tr>
<th scope="col">Images</th>
<th scope="col">Titres</th>
<th scope="col">Nombres de pages</th>
<th scope="col">Actions</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
<?php
//$livres=$livreManager->getLivres();
for($i=0; $i<count($livres); $i++): ?>
<tr>
<th scope="row"><img src="public/imagees/<?php echo
$livres[$i]->getimage(); ?>"></th>
<td><?php echo $livres[$i]-> getTitre();?></td>
<td><?php echo $livres[$i]-> getnbPages() ;?></td>
<td><a type="button" class="btn btn-outline-success">Modifier</a></td>
<td><a type="button" class="btn btn-outline-danger" >Supprimer</a></td>
</tr>
<?php endfor; ?>
</tbody>
</table>
<a type="button" class="btn btn-outline-success d-block">AJOUTER</a>
<?php
$content = ob_get_clean();
$titre="Les livres de la bibliotheque";
require "views/template.view.php";
?>

Don a le fichier template.view.php

—-

Dans le dossier controllers on a le fichier Livrecontroler.php:


<?php
require_once "models/LivreManager.php";
class LivresController{
private $livreManager;

public function __construct()


{
$this->livreManager = new LivreManager;
$this->livreManager->chargerLivres();

public function afficherLivres(){


$livres=$this->livreManager->getLivres();
require "views/livres.view.php";
}
}
?>

CHAP 4 LE CRUD (Create Read, Update and Delete)


Introduction:

Dans ce chapitre nous allons traiter sur les manipulations


importantes des livres enregistrés ou qui seront enregistrés
dans la base de données. Nous allons traiter sur les
fonctions de modifications de suppressions et d’ajout de
livres dans la base de données.

0. Création des routes pour le CRUD.

Objectif:
Nous devons créer des routes pour atteindre les liens suivantes:

bibliotheque/accueil/xxxx/
bibliotheque/livres/l/ (lire ou afficher un livre)
bibliotheque/livres/a/ (Ajouter un livre)
bibliotheque/livres/m/ (Modifier un livre)
bibliotheque/livres/s/ (Supprimer un livre)

1. Implementation:

I. Affichage d’un livres:

Pour procéder à l’affichage d’un livre, nous allons procéder de cette façon:
Nous allons respecter quelques règles:
1. La forme de l’url doit être de la forme localhost/bibliotheque/livres/l/2
2. Nous devons écrire une fonction afficheLivres($id) dans le contrôleur.
3. Création d’une fonction getLivreById($id) qui prend

voici les fonctions qui doivent etre ecrites:

Dans Controller/LivreController.php , on a:

Dans models/LivresManager.php , on a 👍
II. Ajout d’un livre:

1. il faut ajouter la fonction ajoutLivre() dans le contrôleur qui va permettre de lancer le


formulaire d’ajout d’un livre dans la BD.
2. Ajouter du chemin dans le fichier livres.view.php
3. Créer un formulaire d’ajout.

Dans views/ajoutlivres.php , on a le code suivant:


4. Validation de l’ajout d’un Livre:

Création de la route livres/av dans index.php.


Dans Controllers/LivresController.phph,
on a:

<?php
require_once "models/LivreManager.class.php";

class LivresController{
private $livreManager;

public function __construct(){


$this->livreManager = new LivreManager;
$this->livreManager->chargementLivres();
}

public function afficherLivres(){


$livres = $this->livreManager->getLivres();
require "views/livres.view.php";
}

public function afficherLivre($id){


$livre = $this->livreManager->getLivreById($id);
require "views/afficherLivre.view.php";
}

public function ajoutLivre(){


require "views/ajoutLivre.view.php";
}

public function ajoutLivreValidation(){


$file = $_FILES['image'];
$repertoire = "public/images/";
$nomImageAjoute = $this->ajoutImage($file,$repertoire);

$this->livreManager->ajoutLivreBd($_POST['titre'],$_POST['nbPages'],$nomImageAjoute);
header('Location: '. URL . "livres");
}

private function ajoutImage($file, $dir){


if(!isset($file['name']) || empty($file['name']))
throw new Exception("Vous devez indiquer une image");

if(!file_exists($dir)) mkdir($dir,0777);

$extension = strtolower(pathinfo($file['name'],PATHINFO_EXTENSION));
$random = rand(0,99999);
$target_file = $dir.$random."_".$file['name'];

if(!getimagesize($file["tmp_name"]))
throw new Exception("Le fichier n'est pas une image");
if($extension !== "jpg" && $extension !== "jpeg" && $extension !== "png" &&
$extension !== "gif")
throw new Exception("L'extension du fichier n'est pas reconnu");
if(file_exists($target_file))
throw new Exception("Le fichier existe déjà");
if($file['size'] > 500000)
throw new Exception("Le fichier est trop gros");
if(!move_uploaded_file($file['tmp_name'], $target_file))
throw new Exception("l'ajout de l'image n'a pas fonctionné");
else return ($random."_".$file['name']);
}
}

Dans Model/LivreManager, Nous allons ecrire la fonction permettant d’ajouter les livre:
Exercice:

Faites de même pour la modification et la suppression des livres:

Vous aimerez peut-être aussi