PHP
Développement
web dynamique
IUT Lyon1 Année spéciale
2018-19
Bastien THOUVEREZ
Le module
● Continuité du programme de développement web
● Suit le module de HTML/CSS
● Précède le module de Javascript
● 11 séances de 2h
Évaluation
● 2 rendus de TP + 1 examen final
● Date examen : Vendredi 15 Février 2019 de 10h à 12h
Le module
● Toutes les informations sur mon site
● [Link]
● Des questions? N’hésitez pas!
● [Link]@[Link]
Ce cours est basé principalement sur le cours de référence du module
PHP de l’IUT Lyon1 et sur la documentation PHP officielle
Pré-requis
Concepts de base de la programmation
● condition, boucle, switch (syntaxe très proche du C)
● tableaux, tableaux associatifs (plus facile qu’en C !)
● procédures, fonctions et paramètres
● programmation orientée objet (constructeurs, accesseurs…)
Concepts de base des bases de données
● tables, champs, types, jointures, clés primaires/étrangères
● langage SQL, SELECT, INSERT, ALTER, CREATE
Séance 1
● Rappels du web
● Pourquoi PHP ?
● Mise en place d’un environnement
● Bases de la programmation PHP
● TP Introductif
Rappels du Web
Le Web, c’est quoi ?
● De son vrai nom: World Wide Web
● Inventé par Tim Berners-Lee dans les années 90
● Né d’un besoin de regroupement et de partage de documents
● Architecture client-serveur
○ Des ressources (page web, document, image, vidéo ...)
○ Stockées sur un serveur
○ Le client accède à ces ressources en envoyant des
requêtes au serveur via un navigateur
● Trois grandes technologies découlent du WWW
Les technologies - URL
● Une ressource du web est accessible via une adresse appelée URL
● Uniform Resource Locator
● La structure d’une URL est divisée en trois blocs:
[Link]
Les technologies - URL
● Une ressource du web est accessible via une adresse appelée URL
● Uniform Resource Locator
● La structure d’une URL est divisée en trois blocs:
[Link]
Le protocole
Les technologies - URL
● Une ressource du web est accessible via une adresse appelée URL
● Uniform Resource Locator
● La structure d’une URL est divisée en trois blocs:
[Link]
Le nom du serveur
Les technologies - URL
● Une ressource du web est accessible via une adresse appelée URL
● Uniform Resource Locator
● La structure d’une URL est divisée en trois blocs:
[Link]
La ressource
Les technologies - HTML
● HyperText Markup Language
● Langage standard de description des ressources sur le Web
● Langage statique décrivant la structure des pages
● Un langage du web parmis d’autres (CSS, JavaScript, PHP, XML …)
Prenons un exemple
de code HTML pour un
fichier [Link]:
Les technologies - HTTP
● HyperText Transfer Protocol
● Protocole d’échange de données entre machines
● Utilisé par les clients pour communiquer avec les serveurs
● Le client envoie des requêtes HTTP au serveur qui répond
Les requêtes HTTP
● Lors d’un accès à une URL via un navigateur, ce dernier
envoie une requête au serveur
● Le serveur traite la requête et répond par une requête
● La réponse de la requête contient le contenu demandé (le
code HTML à afficher)
● Le navigateur affiche finalement la réponse reçue
● Requêtes visibles via votre navigateur dans la console de
développement (F12)
Requête HTTP - l’entête
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - le mot
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - la cible
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - le protocole
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - adresse du serveur
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - le navigateur client
GET /blog/[Link] HTTP/1.1
Host: [Link]:80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=kamkcte5cr8m4in349fscjehd0
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Requête HTTP - traitement serveur
● Le navigateur demande à accéder au serveur [Link]
sur le port 80 (par défaut) et cherche la ressource
/blog/[Link]
● A cette localisation, le serveur trouve notre fichier [Link]
● Il renvoie donc le contenu de ce fichier dans le corps de sa
requête de réponse
Requête HTTP - entête de réponse
Date: Wed, 22 Aug 2018 [Link] GMT
Server: Apache/2.4.23 (Win64) PHP/7.0.10
X-Powered-By: PHP/7.0.10
Content-Length: 130
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Requête HTTP - la date
Date: Wed, 22 Aug 2018 [Link] GMT
Server: Apache/2.4.23 (Win64) PHP/7.0.10
X-Powered-By: PHP/7.0.10
Content-Length: 130
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Requête HTTP - serveur et version PHP
Date: Wed, 22 Aug 2018 [Link] GMT
Server: Apache/2.4.23 (Win64) PHP/7.0.10
X-Powered-By: PHP/7.0.10
Content-Length: 130
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Requête HTTP - longueur de la réponse
Date: Wed, 22 Aug 2018 [Link] GMT
Server: Apache/2.4.23 (Win64) PHP/7.0.10
X-Powered-By: PHP/7.0.10
Content-Length: 130
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Requête HTTP - le type de retour
Date: Wed, 22 Aug 2018 [Link] GMT
Server: Apache/2.4.23 (Win64) PHP/7.0.10
X-Powered-By: PHP/7.0.10
Content-Length: 130
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Requête HTTP - contenu de la requête réponse
<!DOCTYPE html>
<html>
<head>
<title>Mon blog</title>
</head>
<body>
<h1>Article 1</h1>
<p>Bla bla bla</p>
</body>
</html>
Requête HTTP - affichage du navigateur
PHP Hypertext Processor *
* acronyme récursif, historiquement Personnal Home Page
Pourquoi utiliser du PHP ?
Pour dynamiser un site web
● HTML permet seulement de faire du balisage
● HTML et CSS permettent de faire des sites “vitrine”
● Le site est dit statique, toujours le même pour chaque
visiteur
PHP génère du HTML
C’est un langage de programmation (variables, conditions,
bibliothèques externes, base de données …)
Pourquoi utiliser du PHP ?
HTML/CSS, site statique
Toujours la même page
PHP, génère du HTML
Adaptable en fonction des
utilisateurs
Généralement couplé à une
base de données Source: OpenClassRoom
Pourquoi utiliser du PHP ?
Un site vitrine n’a plus beaucoup d’intérêt aujourd’hui
Avec PHP, on peut ajouter a un site
● une gestion des utilisateurs (compte, espace membre …)
● commentaires
● dépôt de fichiers ...
Pré-requis pour développer en PHP
Pour développer en PHP, il faut :
● un éditeur de texte ou IDE
● un serveur web : Apache
● le langage PHP
● un SGBD : MySQL
Sous Windows, les trois derniers sont regroupés au sein du
logiciel Wamp (pour travailler en local).
Pré-requis pour développer en PHP
En local, un site web a peu d’intérêts, pour le mettre en ligne il
faut un serveur en ligne (généralement un hébergeur) sur
lequel seront installés:
● Apache
● PHP
● un SGBD
Attention à la version de PHP installée qui diffère souvent
entre le serveur local et le serveur en ligne
Comment développer en PHP
● En local, au maximum (plus rapide)
● Tests sur un maximum de navigateurs (IE est capricieux
mais heureusement beaucoup moins utilisé aujourd’hui)
● [Link]
Pour mettre en ligne, il faut transférer vers le serveur
● FTP ou SSH (avec Filezilla)
● du code change (connexion base de données)
● il peut y avoir des surprises de rendu entre local et online
Comment développer en PHP
● Vous travaillez en local sur votre machine
● localhost/ ou [Link]/
● Vos fichiers et vos données en local
● Seul vous pouvez le voir
● Peu d’intérêt pour un site web !
● Mais plus pratique pour développer
Comment développer en PHP
● Pour le mettre en ligne, il faut
un serveur
Serveur
● Une autre copie des fichiers
et des données en ligne
● Vous envoyez et récupérez
les fichiers sur le serveur
Comment développer en PHP
Le serveur est accessible via
une URL [Link]
Serveur
Le DNS permet d’obtenir
l’adresse IP: [Link]:80
La base de données est aussi en
ligne (pour moi chez OVH)
Utiliser Filezilla pour
communiquer en FTP ou SSH
Comment développer en PHP
INTERNET Serveur
Filezilla
1. Informations de
connexion
2. Arborescence locale
3. Contenu du dossier
local
4. Arborescence
distante
5. Contenu du dossier
distant
6. Informations de
partage de fichiers
Développer en PHP sur les machines de l’IUT
Vous disposez d’un répertoire public_html (sinon créez-le)
Toutes les pages Web qui s’y trouvent sont visibles à
l’adresse :
[Link]
Et le PHP est exécuté par un serveur web
De chez vous, vous pouvez vous connecter au serveur de
l’IUT via FileZilla : Cf Accès FTP au serveur de l'IUT
Avant d’entrer dans le vif du sujet
La documentation PHP
● [Link]
● En français, très bien faite
● Description des fonctions
● Exemples d’utilisation
● Encore une fois, attention à la version utilisée phpversion()
Programmation PHP
La programmation PHP
● Le PHP s’insère entre les balises <?php et ?>
● Peut être inséré dans du code HTML, ou script simple
● Dans un fichier ne contenant que du PHP, on ne ferme pas
● Affichage avec la fonction echo (PHP génère du HTML)
● Balises d’affichage rapide <?= et ?>
<?php echo ‘Hello world’; ?>
<?= ‘Hello world’ ?>
● Commentaires comme en C ( // et /* */ ) avec en plus #
Les variables
● Débutent par le symbole $
● Pas de déclaration, le typage se fait à l’affectation
● Possibilité de changer le type
Affiche:
integer
string
Les types de variable
4 types scalaires: 2 types composés:
● boolean ● array
● integer ● object
● float
● string 2 types spéciaux:
● resource
● NULL
Les types scalaires
boolean float
integer string
Affichage des chaînes de caractère
PHP interprète les valeurs des variables contenues entre les “ ”
La concaténation se fait avec le .
Beaucoup de fonctions de manipulation des chaînes de
caractères (Cf la doc: PHP manual for strings)
Le retour à la ligne
Dans un script exécuté en ligne de commande, le saut de ligne se
fait avec:
● \n si contenu dans une chaîne de caractères entre les “ ”
● Utiliser \n entre les ‘ ’ ne fonctionnera pas
● En concaténant la constante prédéfinie PHP_EOL
Le retour à la ligne
Pour une page web:
● PHP génère du HTML
● \n et PHP_EOL n’auront aucun effet
● Il faut générer un retour à la ligne HTML
Les tableaux numérotés
Fonction var_dump() à
utiliser sans modération
Les tableaux associatifs
Les opérateurs de comparaison
$a == $b TRUE si $a est égal à $b après le transtypage.
$a === $b TRUE si $a est égal à $b et qu'ils sont de même type.
$a != $b TRUE si $a est différent de $b après le transtypage.
$a > $b TRUE si $a est strictement plus grand que $b.
$a < $b TRUE si $a est strictement plus petit que $b.
$a >= $b TRUE si $a est plus grand ou égal à $b
$a <= $b TRUE si $a est plus petit ou égal à $b.
Source: Doc PHP officielle
Les opérateurs logiques
$a AND $b TRUE si $a ET $b valent TRUE.
$a && $b Idem
$a OR $b TRUE si $a OU $b est TRUE.
$a || $b Idem
$a XOR $b TRUE si $a OU $b est TRUE, mais pas les deux en même temps.
$a ^ $b Idem
! $a TRUE si $a n'est pas TRUE.
Source: Doc PHP officielle
Les opérateurs d'incrémentation et de
décrémentation
$a++ Ajoute 1 à $a
++$a Idem
$a-- Retire 1 à $a
--$a Idem
Que va afficher
ce code ?
Les opérateurs d'incrémentation et de
décrémentation
$a++ Ajoute 1 à $a
++$a Idem
$a-- Retire 1 à $a
--$a Idem
Que va afficher Réponse:
ce code ?
Les structures de contrôle classiques
condition boucle while
boucle for
la ternaire
Parcourir un tableau
Reprenons notre tableau numéroté :
Comment le parcourir ?
Affiche Kile, Eric, Kenny, puis une erreur car il n’y a rien dans la
case à l’indice 3. On utilise la boucle foreach pour les tableaux.
La boucle foreach
ou la forme rétrécie:
La boucle foreach
La boucle foreach
Les opérateurs arithmétiques
-$a Négation Opposé de $a.
$a + $b Addition Somme de $a et $b.
$a - $b Soustraction Différence de $a et $b.
$a * $b Multiplication Produit de $a et $b.
$a / $b Division Quotient de $a et $b.
$a % $b Modulo Reste de la division euclidienne de $a par $b.
$a ** $b Exponentielle $a élevé à la puissance $b.
Possibilité de combiner ces opérateurs avec l’affectation Source: Doc PHP officielle
● $a += $b ↔ $a = $a + $b
● $a .= $b ↔ $a = $a . $b
Les fonctions
● Mot clé function
● Pas besoin de spécifier le type des paramètres
● Mot clé return optionnel, retourne NULL si absent
Les fonctions - paramètre par défaut
● Possibilité de donner une valeur par défaut à un paramètre
● Ces paramètres doivent apparaître en dernier
Les fonctions - passage des paramètre
Par valeur par défaut, par référence avec le &
En pratique !
Dans un premier temps testons si le serveur fonctionne:
→ afficher un “Hello World!” en PHP
Puis TP d’introduction à PHP, sujet sur ma page
Fin séance 1
● Rappels du web
● Pourquoi PHP ?
● Mise en place d’un environnement
● Bases de la programmation PHP
● TP Introductif
Séance 2
● Transmission de données
● Méthodes GET et POST
● Méfiez-vous des utilisateurs
● TP introductif, fin
Transmettre des données
GET et POST
Transmettre des données d’une page à l’autre
→ tout l’intérêt de PHP, apporte le dynamisme au HTML
Deux méthodes:
● GET
● POST
Transmettre avec GET
● Utilise l’URL pour passer des paramètres
[Link]
● ? marque le début des paramètres
● Chaque paramètre a un nom et une valeur optionnelle
● & permet de séparer les paramètres
Dans le [Link], on récupère ces informations dans le
tableau $_GET
Transmettre avec GET
● Prenons un exemple, on accède à l’URL:
[Link]/bWeb/[Link]?coucou&user=bthouverez
● 2 paramètres:
○ coucou : n’a pas de valeur
○ user : qui a la valeur bthouverez
Transmettre avec GET
Transmettre avec GET - les formulaires
● Un formulaire dont la method est get utilisera aussi l’URL
● Chaque input correspondra à une entrée dans $_GET
● La valeur de l’attribut name sera la clé dans $_GET
● La valeur de l’attribut value sera la valeur dans $_GET
● Possibilité d’ajouter des attributs cachés: type hidden
Généralement, pour vérifier si un formulaire a été validé, on
vérifie si la case portant le nom du bouton existe
Transmettre avec GET - les formulaires
Transmettre avec GET - les formulaires
GET : récapitulatif
● Méthode facile à utiliser, directement via l’URL
● Dans un lien
● Mais limitée (255 caractères), on ne peut pas envoyer de
fichier en GET
● Non sécurisé, en clair dans l’URL
Transmettre avec POST
● Même principe que la méthode GET
● Seulement via les formulaires, method post
● Les données n’apparaissent pas dans l’URL
● Récupération des données dans le tableau $_POST
● Possibilité de passer beaucoup plus de données
● Un peu plus sécurisé ...
Sécurisez vos données
Sécurisez vos données
● Partez du principe que tous les utilisateurs de votre site
sont bêtes ou cherchent à le casser
● C’est souvent le cas…
● Sécurisez au maximum vos données
● Bridez l’utilisateur pour qu’il ne puisse vous transmettre
que ce que vous voulez
L’utilisateur pressé, frustré ou peu attentif
Demandez à un utilisateur d’entrer, dans un simple champs de
texte, son numéro de téléphone sous la forme 01-23-45-67-89
L’utilisateur pressé, frustré ou peu attentif
Demandez à un utilisateur d’entrer, dans un simple champs de
texte, son numéro de téléphone sous la forme 01-23-45-67-89
Vous aurez:
● 0452682234
● 06/26/98/11/36
● 04 78 98 36 49
● 00 33 7 42 45 12 08
● +33 3 40 79 67 12
L’utilisateur pressé, frustré ou peu attentif
Demandez à un utilisateur d’entrer, dans un simple champs de
texte, son numéro de téléphone sous la forme 01-23-45-67-89
Vous aurez:
● 0452682234 ● 03-25-47-63-52-87-10
● 06/26/98/11/36 ● 69008 Lyon
● 04 78 98 36 49 ●
● 00 33 7 42 45 12 08 ● 0452367
● +33 3 40 79 67 12 ● g pa de tel!!!!!
L’utilisateur pressé, frustré, y remédier
● Brider l’utilisateur
● Protéger les données en amont
○ Vérifier à la volée la saisie de l’utilisateur
○ Javascript, plus tard au programme
● Protéger les données en aval
○ Vérifier la taille des données, le type
○ Redemander à l’utilisateur tant qu’il n’a pas saisi ce
que vous voulez réellement
L’utilisateur vicieux
Demandez à un utilisateur d’entrer son nom.
L’utilisateur vicieux - Faille XSS
→
L’utilisateur vicieux - Faille XSS
L’utilisateur vicieux, y remédier
● Faire très attention dès que l’on affiche des données utilisateur
● Utiliser la méthode htmlspecialchars()
Ici rien de grave mais il est facile de copier/vider une base de
données ou supprimer des fichiers par exemple
Fin séance 2
● Transmission de données
● Méthodes GET et POST
● Méfiez-vous des utilisateurs
● TP introductif, fin
Séance 3/4
● Le système de sessions
● Les cookies
● TP Roulette 1
● TP Roulette 2
Développons le nouveau gmail
Exemple suivi lors de cette séance:
● trois fichiers: [Link], [Link] et [Link]
● [Link] contient un formulaire de connexion qui pointe sur
[Link]
● [Link] est la page d’accueil du site contenant les mails de
l’utilisateur
● [Link] permet de gérer les options de la boîte mail
Développons le nouveau gmail
[Link]
[Link] [Link]
Développons le nouveau gmail
Point d’entrée du site L’utilisateur arrive sur un
formulaire de connexion
[Link]
[Link] [Link]
Développons le nouveau gmail
Point d’entrée du site Il saisit ses informations et est
redirigé vers [Link]. C’est
[Link] dans ce dernier fichier que l’on
vérifie l’exactitude des
connexion informations saisies et que l’on
affiche ou non le contenu.
[Link] [Link]
Vérif données
Développons le nouveau gmail
Point d’entrée du site Il peut alors naviguer entre les
pages [Link] et [Link]
[Link] grâce à des liens
connexion
navigation libre
[Link] [Link]
Vérif données
Développons le nouveau gmail
Point d’entrée du site Et se déconnecter sur chacune
de ces pages. Il est alors
[Link] redirigé vers le formulaire de
connexion dans [Link]
connexion
déconnexion
Je vous montre comment coder
ceci avec ce que nous avons vu
jusqu’à présent
navigation libre
[Link] [Link]
Vérif données
Contourner l’identification
Si un utilisateur tente d’accéder
directement à [Link] sans
[Link] passer par le formulaire de
connexion, que se passe-t-il?
connexion
déconnexion
Entrée visiteur
navigation libre
[Link] [Link]
Vérif données
Contourner l’identification
Si un utilisateur tente d’accéder
directement à [Link] sans
[Link] passer par le formulaire de
connexion, que se passe-t-il?
connexion
déconnexion
La vérification des données
étant effectuée dans [Link],
tout devrait bien se passer ici et
Entrée visiteur l’utilisateur ne devrait avoir
navigation libre accès à aucun contenu
[Link] [Link]
Vérif données
Contourner l’identification
Si l’utilisateur tente cette fois-ci
d’accéder directement à
[Link] [Link], que se passe-t-il?
connexion
déconnexion
Entrée visiteur
navigation libre
[Link] [Link]
Vérif données
Contourner l’identification
Si l’utilisateur tente cette fois-ci
d’accéder directement à
[Link] [Link], que se passe-t-il?
connexion
déconnexion Problème! Aucune vérification
faite dans ce fichier! Comment
résoudre ce problème?
Entrée visiteur
navigation libre
[Link] [Link]
Vérif données
Retenir des données
On pourrait s’en sortir avec GET et POST en transmettant des
données tout au long de la navigation:
● faire des formulaires sur chaque page
● ou utiliser GET via l’URL pour chaque lien
→ pas très pratique
On voudrait retenir des informations automatiquement pour pouvoir
les utiliser partout: le système de session PHP est fait pour ça!
Une session PHP
● Moyen simple de stocker des données individuelles pour chaque
utilisateur
● Peuvent être utilisées pour faire persister des informations entre
plusieurs pages
● Consiste en un simple tableau (similaire à $_GET ou $_POST)
● Nécessaire de spécifier que l’on va utiliser le système de sessions
Aparté sur les superglobales
Variables prédéfinies ● $_SERVER : regroupe les
toujours disponibles informations du serveur
● $GLOBALS ● $_FILES : utilisé lors de l’envoi de
fichiers par formulaire
● $_GET
● $_POST ● $_ENV : variables
d’environnement
● $_SESSION
● $_COOKIE ● $_REQUEST : contient par défaut
le contenu des variables $_GET,
$_POST et $_COOKIE ...
Utiliser une session PHP
Solution à notre problème
Jusqu’à maintenant on ne faisait
qu’un traitement dans [Link]
[Link]
connexion
déconnexion
navigation libre
[Link] [Link]
Vérif données
Solution à notre problème
Maintenant, si les données
transmises lors de la connexion
[Link] sont bonnes, on retient en plus
les informations de l’utilisateur
connexion dans la session
déconnexion
navigation libre
[Link] [Link]
Vérif données
Remplir session
Solution à notre problème
On fait aussi une vérification au
niveau de la page [Link].
[Link]
Les vérifications consisteront à
connexion regarder si la session est bien
remplie, si elle ne l’est pas, on
déconnexion
redirige l’utilisateur vers la page
de connexion
navigation libre
[Link] [Link]
Vérif données Vérif données
Remplir session
Solution à notre problème
La déconnexion doit vider la
session
[Link]
Ainsi le tout est sécurisé, un
connexion utilisateur ne peut accéder
directement à [Link]. Il sera
déconnexion
automatiquement redirigé vers
le formulaire
navigation libre
[Link] [Link]
Vérif données Vérif données
Remplir session
Sessions et cookies
● A l’appel de session_start() PHP crée un id de session et le
transmet à toutes les pages, permettant l’accès à $_SESSION
● La session se ferme automatiquement au bout d’un moment
(timeout, quelques minutes)
● Pour sauvegarder des données sur le long terme, il faut utiliser
les cookies
Les cookies
● Les cookies fonctionnement à peu près comme les sessions
● Ils sont des fichiers enregistrés sur le disque dur
● Un cookie sauvegarde une seule donnée
● Création avec setcookie(), à écrire avant tout code HTML
● Quelques paramètres (cf la doc)
[Link]
Récap sessions, cookies
Session Cookie
Durée de vie Court Long
Initialisation session_start(); fonction setcookie
(avant tout un cookie par donnée
code HTML)
setcookie(‘id’, 42,
time() + 365*24*3600);
Utilisation tableau $_SESSION tableau $_COOKIE
une case par donnée seulement en lecture
echo $_COOKIE[‘id’];
$_SESSION[‘id’] = 42;
echo $_SESSION[‘id’];
Projet
Roulette
La roulette
● Vous allez développer une simulation simple du jeu de la
roulette en PHP
● Regroupe les grandes notions à connaître en PHP
○ Sessions
○ Formulaires, transmission de données
○ Sécurisation
○ Traitement et gestion de bases de données
○ Architecture MVC
● Développement en plusieurs parties
La roulette
1. Architecture HTML
2. Transmission de données, sessions
3. Gestion de bases de données
4. Modèle MVC
5. Espace membre
6. Se passer d’une BDD
Fin séance 3/4
● Le système de sessions
● Les cookies
● TP Roulette 1
● TP Roulette 2
Séance 5
● Bases de données
● phpmyadmin
● TP Roulette 3
Les bases de données
● Essentielles pour un site web
● Permet de retenir toutes les informations relatives au site
● Long terme
● Sécurisé
Exemples autour d’un arbre généalogique
Une base de données
● Un ensemble de tables
● Une table regroupe plusieurs champs
● Chaque champs à un type
Système de Gestion de Base de Données
● Logiciel permettant de gérer ces BDD
● Nous utiliserons MySQL, il y en a d’autres
○ PostGreSQL
○ SQLite
○ Oracle
● Nous utiliserons le PHP pour communiquer avec MySQL
Source: OpenClassRoom
Rappels SQL
Création de table
Et d’éventuels attributs optionnels pour chaque champs
Insertion dans une table
● Obligation de spécifier tous les champs (première méthode)
● Possibilité de spécifier quels champs on va remplir (seconde
méthode, préférée)
Modification/suppression de données
phpMyAdmin
phpMyAdmin
● Application web pour MySQL
● Fournit une interface graphique pour gérer des bdd
● Implémentée en PHP, communique avec MySQL
[Link]
● Login : pxxxxxxx
● Mot de passe : Numéro BIP
Interface de phpMyAdmin
Interpréteur SQL
Créer une base
● Certaines bases sont déjà présentes dans
phpMyAdmin, n’y touchez pas!
● Possibilité de créer autant de BDD que
vous voulez en local
● En ligne (sur un hébergeur), vous payez
généralement pour rajouter des bases de
données
Pour des raisons pratiques de correction du projet, merci d’appeler
votre base “roulette” (que tout le monde ai le même nom)
Créer une table
● Le premier champs sert à identifier chaque ligne de la table
○ PRIMARY
○ AUTO_INCREMENT
● Les VARCHAR prennent une valeur/taille (visez large)
● Des champs peuvent être NULL
Les principaux types de données
● INT : entier
● VARCHAR : chaîne de caractère “courte” (un nom d’utilisateur)
● TEXT : chaîne de caractère “longue” (un chapitre d’un roman)
● DATE : date
Beaucoup d’autre types: FLOAT, BIGINT, BIT, CHAR, TINYTEXT …
[Link]
Insertion de données dans une table
Pareil avec l’interpréteur
Très pratique, notamment pour tester rapidement des requêtes
Parfois plus rapide que l’interface graphique...
Retour sur les types de données
Dans mon arbre généalogique, une personne peut avoir plusieurs
enfants, comment gérer ça?
MEMBRE( id , nom , sexe , date_naiss )
Retour sur les types de données
Avec une autre table qui retiendra les liens
PARENT( #id_parent , #id_enfant )
id_parent id_enfant
1 3
1 4
Import/export
phpMyAdmin permet d’importer/exporter des scripts SQL
Aller plus loin
Conseil personnel qui à mon goût simplifie les choses
● Créez deux fichiers [Link] et [Link]
○ [Link] contient la structure
○ [Link] contient les données (ajouter un TRUNCATE)
Traiter les données en PHP
Utiliser les bases de données
Pour utiliser notre base de données en PHP, il va falloir:
● se connecter à la base (à MySQL)
● envoyer des requêtes SQL à la base
● éventuellement récupérer et traiter les données (SELECT)
● pour les afficher en HTML
Utiliser les bases de données en PHP
Pour utiliser notre base de données en PHP, plusieurs possibilités:
● API MySQL : fonctions type mysql_*
● API MySQLi : fonctions type mysqli_*
● Classe PDO
Nous utiliserons PDO, plus récent, plus à jour, orienté objet
Vérifier qu’il est activé sur Wamp: clic gauche sur l’icône
PHP / Extensions PHP / cocher php_pdo_mysql
Se connecter à la base de données
Pour se connecter à la base de données, il faut:
● le nom de l’hôte : localhost si vous travaillez en local, l’adresse
distante de MySQL sinon
● le nom de la base de données : celui que vous avez donné
● le nom d’utilisateur: pXXXXXXX
● le mot de passe: numéro BIP
Il ne reste plus qu’à créer l’objet PDO
Vérifier la connexion - les exceptions
Important de vérifier si la connexion a bien été faite
Faire une requête
Pour une modification, on utilisera exec() au lieu de query()
$reponse est un objet PHP contenant le résultat de la requête
Il est inutilisable comme tel, on utilise la fonction fetch()
$reponse->fetch() renvoie une ligne de la réponse dans un tableau
Il faut appeler la fonction fetch() autant de fois qu’il y a de lignes
Parcourir la réponse
Parcourir la réponse
Faire une requête avec variables
Requêtes concaténant des variables PHP
Mauvaise pratique!
● Assemblage brouillon des “” et ‘’, ou besoin de les échapper \”
● Faille de sécurité, un utilisateur vicieux pourrait injecter du code
SQL en changeant ses informations ...
On va préparer les requêtes puis les exécuter
Faire une requête avec variables sécurisée
Remplacement des variables par des ?
Préparation de la requête
Exécution de la requête avec envoi des paramètres via un tableau
Attention à l’ordre
Faire une requête avec variables sécurisée
Possibilité d’utiliser des identifiants explicites au lieu des ?
Il faudra envoyer un tableau associatif lors de l’exécution
L’objet $req contient aussi la méthode fetch()
TP Roulette 3
Gestion de bases
de données
Fin séance 5
● Bases de données
● phpmyadmin
● TP Roulette 3
Séance 6
● Intro POO
● POO PHP
● TP Roulette 4
La POO en PHP
La programmation orientée objet
Grand concept de la programmation
Utilisé massivement, partout, tout le temps
● classe ● constructeurs
● objet ● accesseurs
● instance ● héritage
● encapsulation ● abstraction
● visibilité ● polymorphisme
● attribut statique
Cf Intro POO
Classe PHP
Classe PHP
Héritage PHP, variable de classe et abstraction
TP Roulette 4
POO PHP
A me rendre par mail avant le prochain cours:
2018-03-01 [Link] UTC+1, cachet du mail faisant foi
En binôme, -1 point/heure de retard, je réponds toujours aux mails ;)
Fin séance 6
● POO
● POO PHP
● TP Roulette 4
Séance 7/8
● MVC
● TP Roulette 5
MVC
Model View Controller
MVC, kézako?
● Un design pattern (pratique de programmation)
● Trois modules: contrôleur, modèle, vue
● Séparation de la logique du code
● Né pour la gestion d’interfaces graphique
● Omniprésent en web aujourd’hui
Les design pattern
MVC est un design pattern parmi beaucoup d’autres:
● Design pattern Observer
○ un objet notifie un autre objet s’il change d’état
○ (interfaces graphiques, mise à jour de bdd à la volée…)
● Design pattern Singleton
○ un classe dont on n’autorise qu’une seule et unique instance
Lecture conseillée: Openclassroom, design pattern PHP
Model
Pattern MVC
MVC: le Modèle
● Gère les données du site
● Contient la logique métier
● Et tout ce qui concerne la base de données
On retrouve:
● Les classes
● Les requêtes SQL
Entre autres, il y aura les classes représentant les tables SQL
On parle parle d’ORM (Object-Relational Mapping)
Le Modèle : ORM
Le mapping objet-relationnel consiste à mapper les tables SQL avec
des classes de deux types:
● DTO : Data Transfer Object
○ Une classe pour chaque table
○ Les colonnes des tables deviennent des attributs d’objets
○ Objets très simples (uniquement les colonnes de la table, et
des accesseurs)
● DAO : Data Access Object (ou Repository)
Le Modèle : ORM, DAO
● Une classe par table également
● Objets faisant les requêtes SQL
● Contiennent une référence vers la BDD (PDO)
● Une méthode getById($id) qui:
○ fait une requête SQL
○ crée un objet DTO et l’initialise avec les données de la requête
○ retourne cet objet (on appelle ça “hydrater” le DTO)
● Une méthode par cas d’utilisation (par requête)
● Ces méthodes retournent une collection de DTO hydratés
Le Modèle : ORM, résumé
Pour une table SQL, nous aurons deux classes PHP, le DTO et le DAO
DTO DAO
Rôle Être utilisée par le contrôleur Accéder à la base de données
Attributs Les champs de la table Un objet de gestion de BDD (PDO)
Méthodes Un constructeur et les - Une fonction par requête SQL
accesseurs - Une fonction getById($id) qui
renvoie l’objet DTO correspondant
Model
View
Pattern MVC
MVC: la Vue
● Gère l’affichage du site
● Met en forme les données obtenues du modèle
● Génère le code HTML et affiche le résultat
● C’est le seul endroit où l’on retrouve du code HTML!
● Et quasiment que du HTML, n’utiliser que les balises d’affichage
courtes de PHP
● <?= /* PHP */ ?> et pas <?php /* PHP */ ?>
MVC: vues et squelette
● Il est conseillé de séparer au maximum les vues (header, menu …)
● Notion de squelette ou layout:
○ plusieurs vues (menu, entête, pied de page …)
○ une vue principale squelette de la page HTML
○ qui inclut les autres vues
On utilise la fonction PHP include, cette fonction copie le code du
fichier passé en paramètre à l’endroit où elle est appelée
Controller
Model
View
Pattern MVC
MVC: le Contrôleur
● Articule la vue et le modèle
● Point d’entrée du site
● Toutes les requêtes passent par là
○ Traite la requête reçue
○ Demande et reçoit les données du modèle
○ Fournit ces données à la vue
● Généralement un contrôleur principal FrontController
● qui dispatche vers des sous contrôleurs (un par module de l’app)
Controller
Navigateur client
Model
View
Pattern MVC
Requête
HTTP
Controller
Navigateur client
Model
View
Pattern MVC
Requête
HTTP
Controller
Navigateur client
Demande
données
Model
View
Pattern MVC
Requête
HTTP
Controller
Navigateur client Fournit
données
Demande
données
Model
View
Pattern MVC
Requête
HTTP
Controller
Navigateur client Fournit
données
Demande
données
Transfère
données
Model
View
Pattern MVC
Requête
HTTP
Controller
Navigateur client Fournit
données
Demande
données
Transfère
données
Met en forme
le résultat
Model
View
Pattern MVC
Avantages de MVC
● Séparation des préoccupations:
○ le visuel d’un côté
○ le fonctionnement de l’autre
→ Dans un projet, le graphiste ne travaillera que sur les vues et
l’administrateur de BDD n’aura à se soucier que du modèle
● Arborescence claire, divisée en petits fichiers, réutilisable
● MVC : grand standard, facile de rentrer dans le code d’un projet
MVC : grand standard des framework PHP
● Utilisé à foison dans le domaine du web
● La plupart des framework utilisent cette architecture
Un framework:
● Ensemble de fonctions servant à créer les fondations d’un site web
● “Cadre de travail” , plus qu’une simple bibliothèque
● Nécessité de respecter l’architecture du framework
● Il faut connaître PHP, puis connaître le framework
● Mais gain de temps considérable quand on sait le manier
Ne pas confondre: framework et CMS
framework CMS (Content Managing System)
Présentation Ensemble de fonctions Solution clé en main
Fonctionnalité première Aider au développement Gérer du contenu
Vision après installation Une page blanche Un site internet prêt à l’emploi
Public visé Développeur web Non informaticien
Compétences Programmer en PHP Savoir utiliser un clavier et une
nécessaires Connaître le framework souris
Exemples populaires Symfony, Laravel, Zend... Drupal, Wordpress, Prestashop...
MVC concrètement en PHP
Un design pattern fournit des idées, des façons de faire, des bonnes
pratiques mais pas de façon d’implémenter concrète.
Cependant, pour MVC en PHP :
● Diviser les trois modules dans trois dossiers
● Découper pour avoir le maximum de vues
● Aucun code HTML en dehors du dossier des vues
● Toutes les requêtes traitées par le contrôleur
MVC en pratique
● Voyons cela au travers d’un exemple
● Un module de connexion
● Pour l’instant contenu dans un seul fichier
● Que nous allons transformer en MVC
● Essayez de suivre pour comprendre le fonctionnement, vous
aurez tout le temps de coder cela ;-)
Fin séance 7/8
● MVC
● TP Roulette 5
Séance 9/10
● Se passer d’une BDD avec XML
● Fin modèle MVC
● TP Roulette 6
XML
● EXtensible Markup Language
● Langage de balisage générique
● Né pour l’échange de données
● Permet de stocker/ranger des données en texte
● Visant à être lu par une machine et par un humain
● Proche du HTML syntaxiquement
● Pas de balises prédéfinies, vous créez vos propres balises
Pourquoi utiliser XML?
● Grand classique des langages de description
● Permet de stocker des données rapidement
● Modification facile des données (édition d’un fichier texte)
● Offre une grande liberté dans l’organisation
XML
XML: les éléments du langage
Les balises:
● Vous choisissez le nom
● Écrites entre chevrons
● Peuvent être par paires <balise></balise> ou uniques <balise />
● Peuvent contenir:
○ une valeur (chaîne de caractère)
○ une autre balise (arborescence), pas de chevauchement
XML: règles de nommage des balises
Un nom de balise:
● peut contenir des lettres et des chiffres
● ainsi que des caractères spéciaux (on préfère tout de même éviter)
● ne peut pas débuter par un chiffre ou un caractère de ponctuation
● ne peut pas commencer par les lettres XML
● ne peut pas contenir d'espaces
XML: les éléments du langage
Les attributs:
● Conformes aux mêmes règles de nommage
● Information secondaire/cachée apportée à la balise
● Optionnels, peuvent être multiples
Bien former son fichier XML
Un fichier XML est bien formé si:
● Le prologue est renseigné
● Il possède une et une seule balise racine
● Les balises et attributs respectent les règles de nommage
● Toutes les balises en paires sont correctement fermées
● Les valeurs des attributs sont entre guillemets simples ou doubles
XML
XML: les Document Type Definition
● XML langage générique, grande liberté… trop grande?
● Possibilité d’ajouter des règles strictes sur la structure
● Les Document Type Definition, DTD
● Ajoute une notion de document “valide” en plus de “bien formé”
● Consistent en d’autres fichiers décrivant la structure XML à adopter
● CF OpenClassrooms : Structurez vos données avec XML, les DTD
● Encore plus loin: XPATH, langage de requête sur document XML
XML: se passer d’une base de données
● Utiliser XML pourrait permettre de se passer de la BDD:
○ les données stockées dans un fichier
○ plus besoin de MySql (serveur, connexion, PDO … etc)
○ utilisation de PHP pour accéder/modifier le fichier XML
ATTENTION
Avec ce choix, les données sont stockées en clair dans un fichier texte
On évite, par exemple, de stocker des mots de passe en clair ...
SimpleXML: gestion de XML en PHP
● Extension PHP: ensemble de classes et de fonctions
● Transforme les données d’un fichier XML en objets PHP
● Permet la lecture/écriture dans le fichier XML
● Facile à mettre en place dans un MVC !
● CF Manuel PHP: SimpleXML
Fin séance 9/10
● Se passer d’une BDD avec XML
● Fin modèle MVC
● TP Roulette 6
DS final la semaine prochaine Jeudi 29 Mars 8h00
Projet final à rendre avant Dimanche 1er Avril 23h59