Вы находитесь на странице: 1из 195

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


● https://bthouverez.fr/iut_php

● Des questions? N’hésitez pas!


● bastien.thouverez@univ-lyon1.fr

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:

https://bthouverez.fr/blog/article1.html
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:

https://bthouverez.fr/blog/article1.html
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:

https://bthouverez.fr/blog/article1.html
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:

https://bthouverez.fr/blog/article1.html
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 article1.html:
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/article1.html HTTP/1.1


Host: 213.186.33.16: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/article1.html HTTP/1.1


Host: 213.186.33.16: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/article1.html HTTP/1.1


Host: 213.186.33.16: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/article1.html HTTP/1.1


Host: 213.186.33.16: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/article1.html HTTP/1.1


Host: 213.186.33.16: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/article1.html HTTP/1.1


Host: 213.186.33.16: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 213.186.33.16


sur le port 80 (par défaut) et cherche la ressource
/blog/article1.html
● A cette localisation, le serveur trouve notre fichier article1.html
● 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 12:51:37 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 12:51:37 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 12:51:37 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 12:51:37 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 12:51:37 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)
● https://www.w3schools.com/browsers/

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 127.0.0.1/
● 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 http://bthouverez.fr

Serveur
Le DNS permet d’obtenir
l’adresse IP: 213.186.33.16: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 :

http://iutdoua-web.univ-lyon1.fr/~pXXXXXXX

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

● http://php.net/manual/fr/
● 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

https://site.fr/fichier.php?param1=valeur1&param2=valeur2
● ? 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 fichier.php, on récupère ces informations dans le
tableau $_GET
Transmettre avec GET

● Prenons un exemple, on accède à l’URL:

127.0.0.1/bWeb/index.php?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: index.php, inbox.php et settings.php

● index.php contient un formulaire de connexion qui pointe sur


inbox.php

● inbox.php est la page d’accueil du site contenant les mails de


l’utilisateur

● settings.php permet de gérer les options de la boîte mail


Développons le nouveau gmail

index.php

inbox.php settings.php
Développons le nouveau gmail

Point d’entrée du site L’utilisateur arrive sur un


formulaire de connexion
index.php

inbox.php settings.php
Développons le nouveau gmail

Point d’entrée du site Il saisit ses informations et est


redirigé vers inbox.php. C’est
index.php dans ce dernier fichier que l’on
vérifie l’exactitude des
connexion informations saisies et que l’on
affiche ou non le contenu.

inbox.php settings.php

Vérif données
Développons le nouveau gmail

Point d’entrée du site Il peut alors naviguer entre les


pages inbox.php et settings.php
index.php grâce à des liens

connexion

navigation libre
inbox.php settings.php

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
index.php redirigé vers le formulaire de
connexion dans index.php
connexion

déconnexion
Je vous montre comment coder
ceci avec ce que nous avons vu
jusqu’à présent

navigation libre
inbox.php settings.php

Vérif données
Contourner l’identification

Si un utilisateur tente d’accéder


directement à inbox.php sans
index.php passer par le formulaire de
connexion, que se passe-t-il?
connexion

déconnexion

Entrée visiteur
navigation libre
inbox.php settings.php

Vérif données
Contourner l’identification

Si un utilisateur tente d’accéder


directement à inbox.php sans
index.php passer par le formulaire de
connexion, que se passe-t-il?
connexion

déconnexion
La vérification des données
étant effectuée dans inbox.php,
tout devrait bien se passer ici et
Entrée visiteur l’utilisateur ne devrait avoir
navigation libre accès à aucun contenu
inbox.php settings.php

Vérif données
Contourner l’identification

Si l’utilisateur tente cette fois-ci


d’accéder directement à
index.php settings.php, que se passe-t-il?

connexion

déconnexion

Entrée visiteur
navigation libre
inbox.php settings.php

Vérif données
Contourner l’identification

Si l’utilisateur tente cette fois-ci


d’accéder directement à
index.php settings.php, 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
inbox.php settings.php

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 inbox.php
index.php

connexion

déconnexion

navigation libre
inbox.php settings.php

Vérif données
Solution à notre problème

Maintenant, si les données


transmises lors de la connexion
index.php sont bonnes, on retient en plus
les informations de l’utilisateur
connexion dans la session
déconnexion

navigation libre
inbox.php settings.php

Vérif données

Remplir session
Solution à notre problème

On fait aussi une vérification au


niveau de la page settings.php.
index.php
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
inbox.php settings.php

Vérif données Vérif données

Remplir session
Solution à notre problème

La déconnexion doit vider la


session
index.php
Ainsi le tout est sécurisé, un
connexion utilisateur ne peut accéder
directement à inbox.php. Il sera
déconnexion
automatiquement redirigé vers
le formulaire

navigation libre
inbox.php settings.php

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)
http://fr.php.net/manual/fr/function.setcookie.php
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

http://iutdoua-web.univ-lyon1.fr/phpMyAdmin/
● 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 …


https://www.w3schools.com/sql/sql_datatypes.asp
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 data.sql et struct.sql
○ struct.sql contient la structure
○ data.sql 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 08:00:00 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