Académique Documents
Professionnel Documents
Culture Documents
Rudy LECLERCQ
Plan du cours
• Introduction
• Du statique au dynamique
• Premiers pas
• Inclusions
• Les bases
• Transmettre des paramètres de pages en pages
• Les variables super globales
• Les fichiers
• POO
• Pour aller plus loin
2
PHP
Partie 1 : du statique au dynamique
Sites statiques Vs sites dynamiques
HTML, CSS, …
Sites statiques
(sites vitrine)
+
PHP, MySQL, …
Sites dynamiques
(mises à jour automatiques, back office, …)
4
Communications client/serveur
Site statique
Site dynamique
5
Les langages
• Et le Javascript ?
➢Attention à ne pas confondre langages clients et langages serveurs
6
Le PHP
<?php echo "Vous êtes le visiteur n°" . $nbre_visiteurs; ?>
• Dérivé du C
7
Les principaux concurrents de PHP
• ASP .NET
• JSP
• Ruby
• Python
• Node.JS
•…
8
La place de PHP dans le web
• PHP langage serveur unique ?
• PSR
9
PHP
Partie 2 : premiers pas
Installer un environnement de
développement
• En local sur son propre système
• Les « tout-intégrés » (non recommandé)
• EasyPHP https://www.easyphp.org/
• L’essentiel (recommandé)
• PHP https://php.net
• En local sur un système « virtualisé »
• VM
• Docker
11
Installer PHP sur sa machine
• Installer Git pour obtenir un interpréteur de commande
• https://gitforwindows.org/
12
Installer PHP sur sa machine
• Télécharger PHP sur https://php.net/download
• Version Windows
• Préférez la version VC15 x64 Non Thread Safe (non debug)
• Dézipper PHP dans le dossier
• C:\php\php-7.3.0-nts-Win32-VC15-x64\
• « php.exe » doit se situer à la racine du dossier
• Ajout du dossier contenant PHP dans le « Path » de la machine
• Variable d’environnement
• OU alias php73 -> php.exe
• Vérifier le bon fonctionnement en lançant Git Bash, puis la
commande « php --version » : la version doit s’afficher
13
Installer PHP sur sa machine
• Créer le premier fichier de configuration « php.ini »
• À partir du fichier « php.ini-development »
14
Editer du PHP
• Le bloc notes !
• Jetbrains PHPStorm
15
Premiers pas avec PHP
• Les balises PHP
<?php /* Le code PHP se met ici */ ?>
<?php
/* Le code
PHP se met
ici */
// un autre commentaire sur une seule ligne
?>
• Des « balises courtes » existent (short tag) mais sont dépréciées
<? ?>
16
Intégration du PHP dans la page (1/2)
17
Intégration du PHP dans la page (2/2)
18
Afficher du texte
• Instruction echo
<?php echo "Hello World !"; ?>
<?php echo 'Hello World !'; ?>
• Echappement
<?php echo "Cette ligne est écrite \"uniquement\" en PHP"; ?>
<?php echo 'C\'est l\'automne !'; ?>
19
Exercice : votre première page en PHP
20
Rappel : le PHP est exécuté sur le serveur
21
PHP
Partie 3 : inclusions
Rappel : structure d’un site (1/2)
En-tête
• Jusqu’à maintenant nous
devions copier-coller le menu,
l’entête et le pied de page sur
toutes les pages
Menu Corps
Pied de page
23
Rappel : structure d’un site (2/2)
En-tête
Menu
Corps
Pied de page
24
La fonction include (1/6)
• Jusqu’à maintenant nous
devions copier-coller le En-tête
menu, l’entête et le pied header.php
25
La fonction include (2/6)
• menu.php
26
La fonction include (3/6)
• Rappel sur les chemins
• Relatif ou absolu ?
• Image.jpg → relatif
• dossier/icone.ico → relatif
• ../../footer.html → relatif
• C:\Site\index.html → absolu
• /var/www/site/index.html → absolu
• / → ???
• Relatif : dépend du contexte
• Absolu : précise le chemin complet
• Attention : différence entre url (pour les liens) et le chemin (« path ») sur le
serveur
27
La fonction include (4/6)
28
La fonction include (5/6)
• Page finale reçue par le visiteur identique
• Avantages
• Lisibilité
• Flexibilité
29
La fonction include (6/6)
• D’autres méthodes d’inclusions
• Passage de paramètres
• Modèle MVC
•…
31
PHP
Partie 4 : les bases
Les variables (1/2)
• $nom = 'John';
• echo $nom;
➢John
33
Les variables (2/2)
• Concaténer
• echo "Bonjour " . $nom . " !";
• echo 'Bonjour ' . $nom . ' !';
• Les opérations
• +, -, *, /, %
34
Les structures de base (1/3)
• if … elseif … else …
• ==, >, <, >=, <=, !=, !, &&, ||, and, or
• Comme en C, tester les égalités avec le ==
• On pourra également trouver des ===
35
Les structures de base (2/3)
• Rappel : on peut mettre des balises PHP dans du code HTML…
36
Les structures de base (3/3)
• Écriture ternaire condensée
$majeur = ($age >= 18) ? true : false;
• switch … case
• Boucles while, do … while
➢Attention aux boucles infinies !
(Selon les configs, PHP s’exécute maximum 30 sec)
• Boucles for
• Boucles foreach
37
Les fonctions (1/2)
• Écrire une fonction
38
Les fonctions (2/2)
• Les fonctions de PHP
• Traitement des chaines de caractères
(strlen, str_replace, strtolower, …)
• Date
(date('Y'), date('d-m-Y') …)
➔ cf. http://php.net/manual/en/function.date.php
• Traitement sur les tableaux
•…
39
Les tableaux (1/4)
• Mot clé array
40
Les tableaux (2/4)
• Les tableaux associatifs
41
Les tableaux (3/4)
• Boucle for
• Boucle foreach
• Permet de parcourir les tableaux associatifs
• Pas besoin de connaitre les clés du tableau
42
Les tableaux (4/4)
• Afficher rapidement un array avec print_r
• Utile pour le débogage
43
PHP
Partie 5 : transmettre des paramètres
de pages en pages
Format d’une URL
• URL = Uniform Resource Locator
• http://www.google.fr/search?q=ectei
• En théorie, pas de limite de paramètres, mais attention aux nombre maximum de caractères que peuvent gérer les navigateurs
(256 maxi conseillé)
45
Créer un lien avec des paramètres
?message=bonjour&date= 10/01/2019
index.php liste.php
• Pour que ce code soit valide W3C, remplacer le & par &
<a href="liste.php?message=bonjour&date=10/01/2019">Dire bonjour !</a>
➢Envoi 2 paramètres :
• Message : « bonjour »
• Date : 10/01/2019
46
Récupérer les paramètres en PHP (1/2)
• Page liste.php
• Utilisation du tableau $_GET
• Créé automatiquement
• Tableau associatif
• Les correspondent aux paramètres envoyés en URL
$_GET['message']
$_GET['date']
47
Récupérer les paramètres en PHP (2/2)
48
Tester la présence d'un paramètre (1/2)
• Si un paramètre n’existe pas dans l’URL nous risquons d’avoir une Notice :
Notice: Undefined index: date in C:\wamp\www\tests\liste.php on line 9
➢Fonction isset
<?php
if(isset($_GET['date']) and isset($_GET['message'])) {
?>
<p>Voici mon message (écrit le <?php echo $_GET['date']; ?>) :
<?php echo $_GET['message']; ?></p>
<?php
}else {
echo 'Vous devez renseigner un message et une date';
}
?>
➢OUI ! Rappelez vous qu’il ne faut jamais faire confiance aux données reçues !
50
Transmettre des données avec un formulaire
51
Sécurité des formulaires (1/3)
• Un pirate ne peut pas modifier les scripts qui sont sur le serveur MAIS
il peut modifier le formulaire pour envoyer des données malveillantes
• Fonctionnement normal :
53
Sécurité des formulaires (2/3)
• Attaque à partir d’un formulaire modifié
54
Sécurité des formulaires (3/3)
• Encore une fois …
55
XSS
• Cross-Site Scripting
• Exécution d’un code (Javascript) sur votre site
• Vol de cookies, …
56
PHP
Partie 6 : les variables super globales
Les variables super globales
• Variables générées automatiquement par PHP
• Leur nom est en majuscules et commencent par un underscore
• De type array
58
Les sessions (1/2)
• Permet de conserver des variables durant toute la visite du site
• Différent de GET et POST qui ne transmettent les données que vers la
page suivante
• Fonctionnement
1. Un visiteur arrive sur le site. Génération d’un numéro de session
(PHPSESSID). Exemple : a02bbffc6198e6e0cc2715047bc3766f
2. On peut créer une infinité de variables de session.
Exemple : $_SESSION['nom']
3. Lorsque le visiteur se déconnecte, la session est fermé et les variables
détruites. (action de déconnexion ou timeout)
59
Les sessions (2/2)
• session_start()
• Initialise le système de gestion des sessions
• session_destroy()
• Permet de « détruire » une session, vide toutes les données contenues dans la
variable $_SESSION
session_start();
$_SESSION['nom'] = $nom;
60
Les cookies
• Fichier texte enregistré sur l’ordinateur du visiteur
• Enregistrer un cookie
setcookie(<nom>, <valeur>, <expiration>, <disponibilité>);
• Afficher un cookie
<?php echo $_COOKIE['pseudo']; ?>
• Modifier un cookie
setcookie('membre_pseudo', $nouveau_pseudo, $timestamp_expire, "/");
61
62
PHP
Partie 7 : les fichiers
Envoyer un fichier (1/3)
66
Envoyer un fichier (2/3)
• Le tableau $_FILE
$_FILES['monfichier']['name'] Nom du fichier envoyé par le visiteur.
68
70
Lire et écrire dans un fichier
• Convient si on doit stocker un petit volume d’informations
Exemple : compteur de visites
• Bien régler les droits sur notre fichier
• Sinon : Warning: fopen(compteur.txt): failed to open stream: Permission denied
• chmod 777 compteur.txt
71
Lire un fichier
• 2 possibilités
• Caractère par caractère : fgetc
• Ligne par ligne : fgets
• Notion de curseur
72
Ecrire dans un fichier
• Ecrire 1 ligne : fputs
73
Lire et écrire dans un fichier
74
PHP
Partie 8 : POO
Les classes et les objets
• Une classe
• Représente un concept (exemple : une voiture)
• Contient des attributs et des méthodes qui lui sont propres
• Un objet
• Est une instanciation d’une classe (exemple : la voiture de John)
• Initialise les variables de sa classes avec des valeurs
• On peut dire qu’une classe est un « type » d’objet
Objet 1
• « $maVoiture est de type Voiture »
Classe
Objet 2
76
Exemple de classe (1/2)
<?php
class Voiture {
protected $nomProprietaire;
protected $couleur;
switch ($this->getCouleur()) {
case 'rouge':
$prix = $prix * 1.5;
break ;
case 'bleu':
$prix = $prix * 0.75;
break;
default:
break;
}
return $prix;
}
}
78
Instancier une classe
<?php
include_once('classes/Voiture.php');
$maVoiture = new Voiture(); // créé un objet vide de type "voiture"
$maVoiture->setNomProprietaire('Nicolas');
$maVoiture->setCouleur('rouge');
echo $maVoiture->calculerPrix();
79
Les méthodes automatiques
• Constructeurs et destructeurs
• __construct
public function __construct($couleur) {
$this->setCouleur($couleur);
}
// ...
// ...
$maVoiture = new Voiture('bleue');
80
Exercice : créer une classe
• Créez une classe Utilisateur
1. Créez un dossier classes dans votre projet
2. Ajoutez y un fichier Utilisateur.php qui contiendra votre classe
3. Ecrivez la classe (attributs et méthodes nécessaires)
• Attributs : login, mot de passe, …
• Méthodes : getters, setters, compareTo
81
L’héritage
• On créé une classe fille qui va préciser la classe mère
Voiture
Break Coupé
82
Exemple d’héritage (1/2)
<?php
include_once('classes/Voiture.php');
class Coupe extends Voiture {
protected $aileron;
83
Exemple d’héritage (2/2)
<?php
class Coupe extends Voiture {
// ...
public function calculerPrix() {
$prix = parent::calculerPrix();
return $prix + 500;
}
}
84
Instancier une classe fille
<?php
$maVoiture = new Coupe(); // créé un objet coupé vide
$maVoiture->setNomProprietaire('Nicolas');
$maVoiture->setCouleur('rouge');
echo $maVoiture->calculerPrix();
85
Mot clés
• parent : accéder aux méthodes / attributs de la classe parente
parent::calculerPrix();
86
Le polymorphisme (1/2)
<?php
class Voiture {
protected $plaqueImmatriculation;
// ...
public function getImmatriculation() {
return 'Voiture N° ' . $this->getPlaqueImmatriculation();
}
// ...
}
<?php
class Coupe extends Voiture {
// ...
public function getImmatriculation() {
return 'Modèle coupé N° ' . $this->getPlaqueImmatriculation();
}
// ...
}
87
Le polymorphisme (2/2)
<?php
$maVoiture = new Coupe(); // créé un objet coupé vide
$maVoiture->setNomProprietaire('Nicolas');
$maVoiture->setCouleur('rouge');
echo $maVoiture->calculerPrix();
88
Les méthodes de classe
• N’est pas propre à une instance, méthode générale à la classe
• Repérée par le mot clé « static »
class Voiture {
// ...
// ...
}
$marques = Voiture::getListeMarques();
89
Les interfaces
• Une interface permet de décrire un comportement d’un objet, de savoir quels
services va rendre la classe qui l’implémente
• Attention : interface ≠ héritage
interface Vendable {
public function calculerPrix();
}
90
Les classes abstraites (1/3)
• Une classe abstraite
• Ne peut être instanciée ➔ n’existe que pour être dérivée
• Possède des attributs et des méthodes, comme une classe concrète
• Possède une ou plusieurs méthodes abstraites
• Attention : une classe abstraite est différente d’une interface car elle
permet d’implémenter des attributs et des méthodes
➢ donc de définir un comportement par défaut.
91
Les classes abstraites (2/3)
<?php
abstract class Voiture {
protected $nomProprietaire;
protected $couleur;
// ...
// ...
// méthode abstraite 92
abstract public function charger($cargaison);
Les classes abstraites (3/3)
<?php
class Coupe extends Voiture {
// ...
// ...
}
Pas de mot clé « abstract » car la méthode est ici bien concrète
93
L’objet DateTime
• Permet de gérer facilement les dates
<?php
$date = new DateTime('2000-01-01');
echo $date->format('d-m-Y');
97
PHP
Partie 9 : pour aller plus loin
Les Exceptions (1/2)
• Jusqu’à maintenant nous avions des "fatal error", "notice", …
• "Exception"
• Permet de définir nos propres types d’erreurs
• Nous allons pouvoir "attraper" ces erreurs pour les
traiter sans planter le script
<?php
function additionner ($a, $b) {
if (!is_numeric ($a) OR !is_numeric ($b))
// On lance une nouvelle exception grâce à throw et on
instancie directement un objet de la classe Exception
throw new Exception ('Les 2 paramètres doivent être des nombres');
return $a + $b;
}
echo additionner ('azerty', 54), '<br />';
➢ Fatal error: Uncaught exception 'Exception' with message 'Les deux paramètres doivent être des nombres' in 99
C:\wamp\www\Tests\pdo.php:5 Stack trace: #0 C:\wamp\www\Tests\exceptions.php(11): additionner('azerty', 54)
Les Exceptions (2/2)
• Attraper une Exception
try {
echo additionner ('azerty', 54), '<br />';
}
catch (Exception $e) {
// traitement
echo "Une exception a été lancée. Message d'erreur : ". $e->getMessage();
}
100
Exemple de gestion d’Exception
try {
$date = new DateTime('2000-01-01');
echo $date->format('d-m-Y');
101
• Mots clés continue, break
• serialize, unserialize
• unset()
• clone et passages par référence (&)
• Front controller
• Class abstraite : exemple classe de paiement
• simpleXML, GD
• Exceptions: catch multiple, héritage, exceptions personnalisées
• PHPDOC
• func_num_args
• @, or die() // ne plus utiliser
• Expressions régulières
• …
103