0% ont trouvé ce document utile (0 vote)
217 vues94 pages

Introduction au Développement Web

Ce document présente les bases du développement web dynamique avec PHP. Il introduit les concepts clés d'architecture client-serveur, les communications entre serveur et client, et les langages serveurs comme PHP.

Transféré par

periane
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
217 vues94 pages

Introduction au Développement Web

Ce document présente les bases du développement web dynamique avec PHP. Il introduit les concepts clés d'architecture client-serveur, les communications entre serveur et client, et les langages serveurs comme PHP.

Transféré par

periane
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Module

HTML / CSS / PHP / MySQL


Comprendre l’architecture client / serveur
avec les langages phares du
développement Web

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; ?>

• Langage libre (créé en 1994)


• Gratuit
• Largement utilisé

• 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/

• Utiliser Git Bash pour avoir la meilleure expérience sur Windows

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 »

• Instructions à modifier / vérifier


•…

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)

• On peut placer des balises PHP n’importe où dans le code :

18
Afficher du texte
• Instruction echo
<?php echo "Hello World !"; ?>
<?php echo 'Hello World !'; ?>

• Ecrire du HTML avec du PHP


<?php echo "Hello <strong>World !</strong>"; ?>

• 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

de page sur toutes les


pages
Menu Accueil
menu.php index.php
➢La solution :
la fonction « include » !
Pied de page
footer.php

25
La fonction include (2/6)
• menu.php

• Inclusion dans index.php

• Si menu.php est dans le dossier include

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
•…

• Nous les aborderons plus tard dans le programme

31
PHP
Partie 4 : les bases
Les variables (1/2)
• $nom = 'John';

• string, int, float, bool (true/false), null

• Pas de typage fort !


• Contrairement à Java, string est un type de base

• echo $nom;
➢John

33
Les variables (2/2)
• Concaténer
• echo "Bonjour " . $nom . " !";
• echo 'Bonjour ' . $nom . ' !';

• echo "Bonjour $nom !";


• echo 'Bonjour $nom !'; ➔ne fonctionne pas !

➢Attention aux guillemets que vous utilisez !

• 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

function maFonction($param1, $param2, $param3 = 15) {


// …
return $result;
}

$r1 = maFonction('John', true);


$r2 = maFonction('Janne', 'ok', 28);

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
•…

• http://www.php.net/ OU recherche sur Google (ex : php strpos)

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

• Rechercher dans un tableau


• array_key_exists, in_array, array_search

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

<a href="liste.php?message=bonjour&date=10/01/2019">Dire bonjour !</a>

• Pour que ce code soit valide W3C, remplacer le & par &amp;
<a href="liste.php?message=bonjour&amp;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']

• Il suffit d’appeler la clé souhaitée


<p>Voici mon message (écrit le <?php echo $_GET['date']; ?>) :
<?php echo $_GET['message']; ?></p>

47
Récupérer les paramètres en PHP (2/2)

• ATTENTION : Ne faites jamais confiance aux données reçues !

• N’importe qui peut modifier un paramètre


➢Injection de code malveillant
➢XSS, exécution d’un script distant
➢Si utilisation d’une base de données, récupération par le pirate de l’ensemble
des données
➢Effacement des données de la base
➢…

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';
}
?>

➢Caster un entier : (int)


49
Tester la présence d'un paramètre (2/2)

• Doit-on gérer tous les cas ?

➢OUI ! Rappelez vous qu’il ne faut jamais faire confiance aux données reçues !

50
Transmettre des données avec un formulaire

• Rappels sur les balises form :

• Eléments : text, textarea, submit, hidden, radio, checkbox, …

• Envoie les données via le tableau $_POST

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 …

Ne faites JAMAIS confiance aux données reçues !

55
XSS
• Cross-Site Scripting
• Exécution d’un code (Javascript) sur votre site
• Vol de cookies, …

➢Solution : htmlspecialchars, strip_tags

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

• $_GET, $_POST, $_FILE, $_SERVER, $_SESSION, $_COOKIE …

• Exemple : $_SERVER['REMOTE_ADDR'] donne IP du client

• Documentées sur le site de PHP :


http://php.net/manual/fr/language.variables.superglobals.php
(sur Google : « php superglobales »)

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;

• Attention : ces instructions doivent être écrites avant tout affichage (y


compris les balises d’entête HTML)

60
Les cookies
• Fichier texte enregistré sur l’ordinateur du visiteur
• Enregistrer un cookie
setcookie(<nom>, <valeur>, <expiration>, <disponibilité>);

➔Attention, setcookie doit s’exécuter avant tout affichage

$timestamp_expire = time() + 365*24*3600; // Le cookie expirera dans un an


setcookie('membre_pseudo', $pseudo, $timestamp_expire, "/");
setcookie('membre_mot_de_passe', sha1($mot_de_passe), $timestamp_expire, "/");

• Afficher un cookie
<?php echo $_COOKIE['pseudo']; ?>

• Modifier un cookie
setcookie('membre_pseudo', $nouveau_pseudo, $timestamp_expire, "/");

• Attention : le cookie vient de l’utilisateur !

61
62
PHP
Partie 7 : les fichiers
Envoyer un fichier (1/3)

Le fichier est stocké dans un dossier temporaire

66
Envoyer un fichier (2/3)
• Le tableau $_FILE
$_FILES['monfichier']['name'] Nom du fichier envoyé par le visiteur.

$_FILES['monfichier']['type'] Type du fichier envoyé. Exemple : image/gif.

Taille (en octet) du fichier envoyé.


Attention, la taille de l'envoi est limitée par PHP. Par
$_FILES['monfichier']['size']
défaut, il est impossible d'uploader des fichiers de
plus de 8 Mo.

$_FILES['monfichier']['tmp_name' Emplacement temporaire du fichier (attribué par


] PHP).

Code d'erreur permettant de savoir si l'envoi s'est


bien effectué ou s'il y a eu un problème, et si oui
$_FILES['monfichier']['error']
lequel.
La variable vaut 0 s'il n'y a pas eu d'erreur.
67
Envoyer un fichier (3/3)
• Traitement de la réception du fichier

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

• Ouvrir et fermer un fichier

• fopen : r (lecture), r+ (lecture/écriture), a(lecture, créé le fichier si n’existe pas), a+


(lecture/écriture)

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

• fputs écrit à l’emplacement du curseur

• Si on veut revenir au début du fichier (ne fonctionne pas en mode a et


a+) :
fseek($monfichier, 0);
• Attention : écrire par-dessus une ligne va l’écraser

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;

public function getNomProprietaire() {


return $this->nomProprietaire;
}

public function getCouleur() {


return $this->couleur;
}

public function setNomProprietaire($nom) {


$this->nomProprietaire = $nom;
}

public function setCouleur($couleur) {


$this->couleur = $couleur;
}
}
77
Exemple de classe (2/2)
<?php
class Voiture {
// ...
public function calculerPrix() {
$prix = 5000;

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();

• $maVoiture est un objet


• On peut créer autant d’objets que l’on veut
$laVoitureDeJohn = new Voiture();
$laVoitureDeJohn->setNomProprietaire('John');
$laVoitureDeJohn->setCouleur('vert');
echo $laVoitureDeJohn->calculerPrix();

79
Les méthodes automatiques
• Constructeurs et destructeurs
• __construct
public function __construct($couleur) {
$this->setCouleur($couleur);
}
// ...
// ...
$maVoiture = new Voiture('bleue');

• __destruct : appelé suite à l’instruction unset();


public function __destruct() {
echo "L'objet va être détruit";
}

• D’autres méthodes existent


• __get, __set, __toString, __call, __sleep, __wakeup …

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é

• La classe « Coupé » hérite de la classe « Voiture »


• La classe fille hérite de tous les attributs et de toutes les méthodes de la classe
mère
• Une classe fille a UNE SEULE classe mère

82
Exemple d’héritage (1/2)
<?php
include_once('classes/Voiture.php');
class Coupe extends Voiture {
protected $aileron;

public function getAileron() {


return $this->aileron;
}

public function setAileron($aileron) {


$this->aileron = $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();

• instanceof : tester la classe d’un objet


if($maVoiture instanceof Voiture)
echo 'maVoiture est une Voiture';

if($maVoiture instanceof Coupe)


echo 'maVoiture est un Coupé';

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();

$laVoitureDeJohn = new Voiture();


$laVoitureDeJohn->setNomProprietaire('John');
$laVoitureDeJohn->setCouleur('vert');
echo $laVoitureDeJohn->calculerPrix();

echo $maVoiture->getImmatriculation(); // utilise la méthode dans Coupe


echo $laVoitureDeJohn->getImmatriculation(); // utilise la méthode dans Voiture

$garage = array($maVoiture, $laVoitureDeJohn);


foreach ($garage as $vehicule) {
echo $vehicule->getImmatriculation(); // utilise la méthode la plus précise
}

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 {
// ...

public static function getListeMarques() {


return array('Renault', 'Peugeot', 'Mercedes');
}

// ...
}

$marques = Voiture::getListeMarques();

• Remarque : on ne peut donc pas accéder à des valeurs d’attributs


• Mot clé self

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();
}

class Voiture implements Vendable {


// ...
public function calculerPrix() {
// ...
}
}

• Une classe peut implémenter plusieurs interfaces (exemple : Vendable,


Deplacable…)
• Avantage : communication entre développeurs, description des besoins et des
comportements attendus …

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;
// ...

public function getNomProprietaire() {


return $this->nomProprietaire;
}
public function getCouleur() {
return $this->couleur;
}
public function setNomProprietaire($nom) {
$this->nomProprietaire = $nom;
}
public function setCouleur($couleur) {
$this->couleur = $couleur;
}

// ...

// méthode abstraite 92
abstract public function charger($cargaison);
Les classes abstraites (3/3)
<?php
class Coupe extends Voiture {
// ...

// implémentation de la méthode abstraite


public function charger($cargaison) {
// ...
}

// ...
}

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();
}

• Permet de mieux contrôler le comportement de l’application


• Affichage d’un message explicite
• Envoi d’un mail automatique au webmaster
• Correction automatique de l’erreur
•…

100
Exemple de gestion d’Exception
try {
$date = new DateTime('2000-01-01');
echo $date->format('d-m-Y');

} catch (Exception $e) {


echo $e->getMessage();
}

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

Vous aimerez peut-être aussi