56
BDW1 - Programmation web - PHP avancé Fabien Duchateau fabien.duchateau [at] univ-lyon1.fr Université Claude Bernard Lyon 1 2019 - 2020 http://liris.cnrs.fr/fabien.duchateau/BDW1/

BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

BDW1 - Programmation web - PHP avancé

Fabien Duchateau

fabien.duchateau [at] univ-lyon1.fr

Université Claude Bernard Lyon 1

2019 - 2020

http://liris.cnrs.fr/fabien.duchateau/BDW1/

Page 2: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Positionnement dans BDW1

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 2 / 56

Page 3: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Rappels

I Séparation du code HTML et PHP

I Affectation de variables (typage faible)

I Structures conditionnelles et boucles

I Définition de fonctions

Dans ce cours, fonctionnalités plus spécifiques à l’utilisation dePHP en programmation web

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 3 / 56

Page 4: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Extensions PHP

PHP fournit des extensions, classées en dif-férentes catégories :I Extensions noyau (e.g., Arrays,

Date/Time, FileSystem)I Extensions intégrées (e.g., FTP,

PostgreSQL, Zip)I Extensions externes (e.g., MySQL,

GeoIP)

Pour la programmation web, extensionsliées à l’inclusion de fichiers, aux sessions,aux bases de données et à la manipulationde fichiers

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 4 / 56

Page 5: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Connaitre les extensions PHPI phpinfo(), qui fournit de nombreuses informations sur PHP

(version, extensions, environnement, etc.)I get_loaded_extensions(), qui retourne un tableau avec les

extensions chargées

fabien@laptop:-$ php -aInteractive shell

php > print_r(get_loaded_extensions());Array(

[0] => Core[1] => date[2] => libxml…

)php >

http://php.net/manual/en/function.phpinfo.phphttp://php.net/manual/en/function.get-loaded-extensions.php

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 5 / 56

Page 6: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Plan

Superglobales

Sessions

Bases de données

Système de fichiers

Modèle Vue Contrôleur

Page 7: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Variables superglobales

PHP définit un certain nombre de variables superglobales :I Accessibles de n’importe oùI Représentées par des tableaux associatifs

Une dizaine de superglobales dont :I Variables d’environnement, du système d’exploitation ($_ENV)I Variables de session ($_SESSION)I Variables de serveur ($_SERVER)I Variables de paramètres ($_REQUEST, $_GET, $_POST,

$_COOKIE)I Fichiers envoyés par formulaire ($_FILE)

http://www.php.net/manual/en/language.variables.superglobals.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 7 / 56

Page 8: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Superglobale $_GET

La variable $_GET :I Tableau associatif qui contient les paramètres d’un formulaire

soumisI Ces paramètres ont été transmis via la méthode get

Syntaxe de l’utilisation de $_GET :I Retourne la valeur pour le paramètre nomParam

$_GET['nomParam']

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 8 / 56

Page 9: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Un exemple de superglobale $_GET

Exemple : vérifier si un formulaire ”get” est soumis<?phpif(isset($_GET['bValider'])) // formulaire soumis

echo ”Le formulaire a bien été soumis !”;else { // formulaire non soumis, affichage du formulaire?><form action=”#” method=”get”>

<input type=”text” name=”nom”><input type=”submit” name=”bValider” value=”Soumettre”>

</form><?php}?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 9 / 56

Page 10: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Superglobale $_POST

La variable $_POST :I Tableau associatif qui contient les paramètres d’un formulaire

soumisI Ces paramètres ont été transmis via la méthode post

Syntaxe de l’utilisation de $_POST :I Retourne la valeur pour le paramètre nomParam

$_POST['nomParam']

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 10 / 56

Page 11: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Un exemple de superglobale $_POSTExemple : afficher le paramètre nom soumis par ”post”<?phpif(isset($_POST['bValider'])) // formulaire soumis

if(isset($_POST['nom']) && !empty($_POST['nom']))echo ”Merci d’avoir soumis le formulaire, ”.$_POST['nom'];

else // formulaire soumis mais sans valeur pour le nomecho ”Le formulaire a bien été soumis, mais sans nom !”;

else { // formulaire non soumis, affichage du formulaire?><form action=”#” method=”post”>

<input type=”text” name=”nom”><input type=”submit” name=”bValider” value=”Soumettre”>

</form><?php}?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 11 / 56

Page 12: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Un mot sur la sécurité

Les variables superglobales peuvent potentiellement être modifiéespar l’utilisatrice (e.g., modifier la valeur d’un paramètre passé enget dans l’URL)

https://duckduckgo.com/?q=chocolathttps://duckduckgo.com/?q='%3B%20DROP%20TABLE%20uneTable%3B%20--

Votre code doit donc vérifier et valider ces variables :I Côté client (HTML, Javascript)I Côté serveur (PHP), avec des fonctions prédéfinies

(échappement de caractères spéciaux, encodage d’URL, etc.)

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 12 / 56

Page 13: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

En résumé

I Variables superglobables définies par PHPI $_GET et $_POST pour récupérer les paramètres d’un

formulaire soumisI Effectuer des vérifications lors de la récupération des données

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 13 / 56

Page 14: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Plan

Superglobales

Sessions

Bases de données

Système de fichiers

Modèle Vue Contrôleur

Page 15: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Généralités

Il peut être utile de conserver des informations d’une page surl’autre :I Se souvenir du login de l’utilisatrice pour les sites avec

authentificationI Se souvenir des références indiquant à quoi l’utilisatrice

s’intéresseI Se souvenir des dernières pages visitées par l’utilisatriceI …

Jusqu’ici, un seul moyen : utiliser des paramètres et penser à lesremettre à chaque lien et dans chaque formulaire⇒ Programmation fastidieuse et source de problèmes

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 15 / 56

Page 16: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Sessions en PHP

Une session peut être vue comme un ensemble d’informationsconcernant une utilisatrice d’un site :I Par utilisatrice, on entend un navigateur sur une machineI Les informations sont conservées entre deux pagesI Une page PHP peut ajouter ou modifier les informations de la

session

En PHP, la session est vue comme une variable superglobaleappelée $_SESSION:I C’est donc un tableau associatif

http://www.php.net/manual/fr/book.session.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 16 / 56

Page 17: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Utilisation des sessions

Une page PHP utilisant une session doit obligatoirement, avantmême d’afficher quoi que ce soit, commencer par l’instruction :

session_start(); // pas d’espace ou ligne vide avant !

Cette instruction crée la variable $_SESSION et la remplit avec lesvaleurs qu’elle avait dans la page PHP précédenteI La variable $_SESSION se manipule ensuite comme un tableau

associatif classique

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 17 / 56

Page 18: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Exemple de session

1 <?php // session2 session_start();3 $_SESSION["dateConn"] = date("r");4 echo "Identifiant de session : " . session_id();5 echo "Date de dernière connexion : " . $_SESSION['

dateConn'];6 ?>

Identifiant de session : 1d98975cf0e5695e2275c6bbc054078Date de dernière connexion : 14 Oct 2019 10:50:58 +0000

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 18 / 56

Page 19: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Déconnexion

Lorsque l’utilisatrice se déconnecte, il est important de détruire sasession (e.g., éviter qu’une seconde personne utilisant le mêmeordinateur ne se fasse passer pour la première personne)

Deux étapes : réinitialiser $_SESSION pour effacer toutes lesvariables de la session courante, et détruire la sessionI Destruction du cookie de session pour plus de sécurité

$_SESSION = array(); // réinitialisationsession_destroy(); // destruction

http://www.php.net/manual/fr/function.session-destroy.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 19 / 56

Page 20: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

En résumé

I Une session PHP est vue comme une variable superglobale, etdonc gérée comme un tableau associatif

I Instruction session_start() avant tout affichage !I Déconnexion en deux étapes (initialisation et destruction de la

session)

Démo avec demo-serie (code source en ligne)BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 20 / 56

Page 21: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Plan

Superglobales

Sessions

Bases de données

Système de fichiers

Modèle Vue Contrôleur

Page 22: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Généralités

Pour manipuler les bases de données, PHP possède plus d’unevingtaine d’extensions et des couches d’abstraction

Pour les SGBD MySQL / MariaDB, trois API différentes :

I mysql : API d’origine, aujourd’hui obsolète

I mysqli : mysql improved, avec de nouvelles fonctionnalités

I PDO_MySQL : couche d’abstraction d’accès aux données àtravers des PHP Data Objects

http://php.net/manual/fr/refs.database.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 22 / 56

Page 23: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Généralités (2)

Utilisation de l’API mysqli :I Support des paradigmes de programmation procédurale et

orientée objetI Support des requêtes multiples et des requêtes préparéesI Support des transactionsI …

http://www.php.net/manual/fr/book.mysqli.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 23 / 56

Page 24: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Manipulation d’une base de données

Quatre étapes pour manipuler une base de données :1. Connexion au SGBD et sélection d’une base2. Exécution d’une requête (préparée ou non)3. Récupération et utilisation du résultat4. Fermeture de la connexion

On peut itérer les étapes 2 à 3 autant de fois que l’on veut avantde fermer la connexion à l’étape 4

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 24 / 56

Page 25: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape de connexion

Tentative de connexion avec mysqli_connect :I Paramètres : machine, utilisatrice, mot de passe et base de

donnéesI Retourne une ressource $connexion, qui représente le lien de

connexion vers la base de données sélectionnée

$server = ”127.0.0.1”; // serveur sur lequel tourne le SGBD$user = ”un_nom”; // utilisatrice du SGBD$mdp = ”un_mdp”; // mot de passe de l’utilisatrice$bd = ”une_bd”; // base de données à laquelle se connecter$connexion = mysqli_connect($server,$user,$mdp, $bd);

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 25 / 56

Page 26: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape de connexion - statut

mysqli_connect_errno() // erreur si > 0

I mysqli_connect_errno() retourne le statut de la dernièretentative de connexion, soit un code d’erreur, soit 0 en cas desuccès

1 <?php // connexion à MariaDB2 function connectBD() {3 $connexion = mysqli_connect($serveur , $user, $mdp, $bd);4 if (mysqli_connect_errno()) {5 printf("Échec de la connexion : %s\n", mysqli_connect_error

());6 exit();7 }8 return $connexion;9 }10 $connexion = connectBD();11 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 26 / 56

Page 27: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape d’exécution d’une requête non préparée

// on possède un lien de connexion $connexion$req = ”une_requete_sql”;$resultat = mysqli_query($connexion, $req);

I mysqli_query exécute une requête non préparéeI Un lien de connexion est requis en paramètreI La requête $req (select, insert, etc.) est un paramètre :

I Si la requête est construite avec les données d’un formulaire, ilfaut échapper ces données avec la fonctionmysqli_real_escape_string

I La fonction retourne un booléen ou un objet

http://www.php.net/manual/fr/mysqli.real-escape-string.phphttp://www.php.net/manual/fr/class.mysqli-result.phphttp://kunststube.net/escapism/

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 27 / 56

Page 28: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape d’exécution d’une requête non préparée - remarques

I Précisions sur la valeur de retour de mysqli_query :I false en cas d’erreurI true pour des requêtes insert, update, et deleteI un objet $resultat de type mysqli_result, qui contient les

n-uplets du résultat pour des requêtes select

I Pendant le développement, il peut être utile d’afficher larequête ($req) avant son exécution

I Une seule requête avec la fonction mysqli_query (voirmysqli_multi_query pour exécuter plusieurs requêtes)

I Nombreuses autres fonctions dans l’API (e.g., le nombre den-uplets dans le résultat)

http://php.net/manual/fr/mysqli.multi-query.phphttp://php.net/manual/fr/book.mysqli.php

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 28 / 56

Page 29: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape d’exécution d’une requête non préparée - exemple

1 <?php // exécution requête2 $nomSerie = "The wire";3 $requete = 'INSERT INTO Serie VALUES(\''.$nomSerie

.'\');';4 echo $requete;5 $resultat = mysqli_query($connexion , $requete);6 if($resultat == FALSE) {7 echo "<p>Erreur lors de l'insertion de la série

!</p>";8 exit();9 }10 echo "<p>La série (".$nomSerie.") a été ajoutée

avec succès !</p>";11 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 29 / 56

Page 30: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape de récupération et utilisation du résultat

// on possède un objet résultat $resultatwhile ($ligne = mysqli_fetch_assoc($resultat)) {

// utilisation des valeurs $ligne['champ1'], …}

I Récupérer et stocker un n-uplet (ligne) du résultat dans untableau numérique (mysqli_fetch_row) ou associatif(mysqli_fetch_assoc)

I Besoin d’une boucle pour récupérer tous les n-upletsI Accès aux valeurs par $ligne[0] ou $ligne['champ']I Retourne null quand il n’y a plus de n-upletI mysqli_fetch_array retourne un tableau à la fois associatif

et numérique (si possible)

http://php.net/manual/fr/mysqli-result.fetch-row.phphttp://php.net/manual/fr/mysqli-result.fetch-assoc.php

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 30 / 56

Page 31: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape de récupération et utilisation du résultat - exemple

1 <?php // traitement résultat requête2 $resultat = mysqli_query($connexion , 'SELECT

DISTINCT nomSerie FROM Serie;');3

4 if($resultat == FALSE) {5 printf("<p>Il n'y a aucune série dans la base.</

p>");6 }7 else {8 echo '<h2>Liste des séries </h2><p><ul>';9 while ($row = mysqli_fetch_assoc($resultat)) {10 echo '<li>' . $row['nomSerie'] . '</li>';11 }12 echo '</ul></p>';13 }14 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 31 / 56

Page 32: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Étape de déconnexion

// on possède un lien de connexion $connexionmysqli_close($connexion);

I mysqli_close ferme une connexion à MariaDB / MySQLI Utilisation au préalable de mysqli_kill pour détruire le thread

http://php.net/manual/fr/mysqli.close.phphttp://php.net/manual/fr/mysqli.kill.php

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 32 / 56

Page 33: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Requêtes préparées

Une requête préparée (ou requête paramétrable) est une requêterécurrente, que l’on compile avec des variables, et donc réutilisableen fournissant les valeurs manquantes (visibilité limitée à la sessiondu SGBD)

Avantages d’une requête préparée :I Performances (la requête est déjà compilée, voir CM

optimisation)I Éviter les risques d’injection SQL (paramètres transmis sous

forme binaire)I Économiser de la bande passante

http://php.net/manual/fr/mysqli.quickstart.prepared-statements.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 33 / 56

Page 34: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Requêtes préparées - étapes

Quatre étapes pour exécuter une requête préparée :1. Préparation de la requête2. Lien entre variables et paramètres de la requête préparée3. Exécution de la requête préparée4. Traitement du résultat de la requête

On peut itérer les étapes 2 à 4 autant de fois que l’on veut (aprèsmodification des valeurs des variables)

SELECT *FROM SerieWHERE nomSerie = 'TBBT';

…SELECT *FROM SerieWHERE nomSerie = 'GoT';

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 34 / 56

Page 35: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Préparation d’une requête préparée

// on possède un lien de connexion $connexion$req = ”SELECT attributk FROM table WHERE attributn = ? ”;$stmt = mysqli_prepare($connexion, $req);

I mysqli_prepare prépare une requêteI Un lien de connexion est requis en paramètreI Les variables de la requête sont remplacées par le caractère ?I Pas de point virgule à la fin de la requête !

http://php.net/manual/fr/mysqli-stmt.prepare.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 35 / 56

Page 36: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Lien variables / paramètres

// on a préparé une requête, représentée par $stmt$var1 = ”valeur1”; …; $varn = ”valeurn”;mysqli_stmt_bind_param($stmt, $types, $var1, …, $varn);

I mysqli_stmt_bind_param permet de lier des variables auxparamètres de la requête préparée

I Le premier paramètre est la requête préparéeI Le second paramètre représente le type de chaque variable

I ”i” = entier, ”s” = string, ”d” = décimal, ”b” = blobI ”sid” correspond à une première variable de type string, une

seconde de type entier, et une troisième de type décimalI Paramètre(s) suivant(s) : un paramètre pour chaque variable

de la requête préparéeI Retourne true (succès) or false (échec)

http://php.net/manual/fr/mysqli-stmt.bind-param.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 36 / 56

Page 37: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Exécution d’une requête préparée

// on a préparé une requête, représentée par $stmtmysqli_stmt_execute($stmt);

I mysqli_stmt_execute exécute une requête préparéeI Retourne true (succès) or false (échec)

1 <?php // requête préparée2 $dec = 0.5;3 $str = "abc";4 mysqli_stmt_bind_param($stmt1 , "s", $str);5 mysqli_stmt_execute($stmt1);6 mysqli_stmt_bind_param($stmt2 , "ds", $dec, $str);7 mysqli_stmt_execute($stmt2);8 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 37 / 56

Page 38: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Traitement d’une requête préparée

Pour récupérer le nombre de n-uplets affectés par une requêtepréparée $stmt :

I De type select (obligation de stocker le résultat aupréalable)

mysqli_stmt_store_result($stmt);$nb = mysqli_stmt_num_rows($stmt);

I De type insert, update, delete

$nb = mysqli_stmt_affected_rows($stmt);

http://www.php.net/manual/fr/mysqli-stmt.store-result.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 38 / 56

Page 39: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Traitement d’une requête préparée (2)

Pour récupérer les n-uplets résultat d’une requête select, il fautlier le résultat à des variables :I Autant de variables que de colonnes !

// soit une requête $stmt qui retourne n colonnesmysqli_stmt_bind_result($stmt, $var1, ..., $varn);

Récupération d’une ligne résultat avec mysqli_stmt_fetch :I Retourne true (succès) or false (échec), ou null (plus de

ligne à lire)I Les variables $var1, ..., $varn reçoivent les valeurs de la

première ligne résultat (boucle pour les lignes suivantes)

mysqli_stmt_fetch($stmt);

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 39 / 56

Page 40: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Exemple de requête préparée

1 <?php // affichage des épisodes avec requête préparée2 $reqp = "SELECT titre FROM Episode WHERE numero = ?";3 if(!($stmt = mysqli_prepare($connexion , $reqp)))4 echo "Erreur de préparation (".mysqli_errno($connexion).") :

".mysqli_error($connexion);5 else {6 $var = 1; // valeur 1 pour les épisodes numérotés 17 mysqli_stmt_bind_param($stmt, "i", $var); // lier la variable

$var au paramètre de la requête8 mysqli_stmt_execute($stmt); // exécution de la requête9 mysqli_stmt_bind_result($stmt, $episodes); // récupération

des tuples résultats10 echo "<h2>Episodes numérotés $var :</h2><p><ul>";11 while (mysqli_stmt_fetch($stmt)) {12 echo "<li>$episodes </li>";13 }14 echo "</ul>";15 }16 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 40 / 56

Page 41: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Exemple de requête préparée (2)

Pour réutiliser une requête préparée :I Modification de la valeur de la variable (déjà) liéeI Exécution de la requête

1 <?php // réutilisation requête préparée2 $var = 2; // valeur 2 pour les épisodes numérotés 23 mysqli_stmt_execute($stmt); // pas besoin de lier,

exécution directe de la requête4 echo "<h2>Episodes numérotés $var :</h2><p><ul>";5 while (mysqli_stmt_fetch($stmt)) {6 echo "<li>$episodes </li>";7 }8 echo "</ul><br>";9 ?>

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 41 / 56

Page 42: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

En résumé

I PHP inclut trois APIs pour MariaDB / MySQL, dont mysqliI Quatre étapes pour se connecter et interroger MySQLI Factorisation du code et sécurité avec les requêtes préparées

Démo avec demo-serie (code source en ligne)

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 42 / 56

Page 43: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Plan

Superglobales

Sessions

Bases de données

Système de fichiers

Modèle Vue Contrôleur

Page 44: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Généralités

Avec PHP, il est possible de manipuler le système de fichiers duserveur pour :I Lire ou écrire dans un fichierI Obtenir des informations sur un fichierI Gérer des fichiers uploadés par l’utilisatriceI Lister les fichiers d’un répertoireI Créer, supprimer des fichiers ou répertoiresI …

Extension filesystem incluse dans le noyau de PHP

http://www.php.net/manual/fr/book.filesystem.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 44 / 56

Page 45: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Plan

Superglobales

Sessions

Bases de données

Système de fichiers

Modèle Vue Contrôleur

Page 46: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Introduction à MVC

Architecture Modèle Vue Contrôleur (MVC) :I Design pattern (origine en 1978)I Utilisé par de nombreux sites web et

frameworksI Structuration et réutilisation du code,

développement en parallèle, couplagefaible

I Mais plus complexe et ”fonctionnalitéséparpillées”

http://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leurhttp://openclassrooms.com/fr/courses/4670706-adoptez-une-architecture-mvc-en-php/http://bpesquet.developpez.com/tutoriels/php/evoluer-architecture-mvc/http://openclassrooms.com/courses/evoluez-vers-une-architecture-php-professionnelleBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 46 / 56

Page 47: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Rôle des composants

I Modèle (structure dynamique des données) :I en lien avec la base de donnéesI opérations de lecture, mise à jour, ajout, etc.I indépendant de la vue et du contrôleur

I Vue (interface graphique) :I éléments visuels et logique d’affichage des donnéesI dépend du modèle

I Contrôleur :I lien entre modèle et vueI traite les entrées (paramètres), choisit la vueI dépend de la vue et du modèle

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 47 / 56

Page 48: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Workflow entre composants MVC

1. L’utilisatrice envoie une requête (paramètres optionnels)2. Le contrôleur vérifie les paramètres, et appelle le modèle3. Le modèle interroge la base de données et retourne un résultat au

contrôleur (e.g., des tuples, un booléen)4. Le contrôleur sélectionne la vue à afficher et lui passe le résultat5. La vue (code HTML) est envoyée au navigateur de l’utilisatrice

http://www.supinfo.com/articles/single/1625-mvc-presentation-patron-conceptionBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 48 / 56

Page 49: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Exemple - liste des séries contenant ”th”

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 49 / 56

1 // controleur.php2 include("modele.php");3 if(isset($_POST['rechercher'])) {4 $keyword = $_POST['keyword'];5 $series = getSeries($connexion , $keyword);6 include("vue.php");7 }

1 // modele.php2 function getSeries($connexion , $keyword

) {3 $clean_keyword =

mysqli_real_escape_string($connexion , $keyword);

4 $requete = "SELECT DISTINCT nomSerieFROM Series WHERE nom LIKE '%$clean_keyword%'";

5 $resultat = mysqli_query($connexion ,$requete);

6 while($tuple = mysqli_fetch_assoc($resultat))

7 $series[] = $tuple;8 return $series; // tableau associatif9 }

1 <!-- vue.php -->2 <h2>Liste des séries :</h2>3 <ul>4 <?php foreach($series as $serie) { ?>5 <li><?= $serie['nomSerie'] ?></li>6 <?php } ?>7 </ul>

Page 50: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Contrôleur frontal

En général, pour chaque page ou fonctionnalité : un contrôleur etune vue

Lors de la réception d’une requête, besoin de diriger la requête versle bon contrôleur ⇒ rôle du contrôleur frontal :I Point d’entrée unique du site (souvent index.php)I Besoin d’un paramètre pour spécifier la fonctionnalité

demandée (e.g., ?action= ou ?page=)I Vérification des paramètres fournis (e.g., un ID d’actrice

valide)

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 50 / 56

Page 51: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

WContrôleur frontal - workflow

En réalité, un contrôleur peut effectuer différentes actions (e.g., afficher, mo-difier, ou supprimer une série). Chaque action peut ensuite avoir sa propre vue.

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 51 / 56

Page 52: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Contrôleur frontal - exemple1 $controleur = 'controleurAccueil';2 $vue = 'vueAccueil';34 if(isset($_GET['page'])) {5 $nomPage = $_GET['page'];6 if(isset($routes[$nomPage])) {7 $controleur = $routes[$nomPage]['controleur'];8 $vue = $routes[$nomPage]['vue'];9 }10 }1112 include('controleurs/' . $controleur . '.php');13 include('vues/' . $vue . '.php');

Dans ce contrôleur frontal, on définit le contrôleur et la vue pardéfaut (lignes 1 et 2). On vérifie la fonctionnalité demandée

(paramètre page), et si elle existe dans le fichier de routes, onutilise son contrôleur et sa vue (lignes 4 à 10). Enfin, appel au

contrôleur et à la vue (lignes 12 et 13).

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 52 / 56

Page 53: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Les templates

Un template (gabarit) représente la manière avec laquelle sontagencés et stylisés les éléments d’une page.

Pourquoi avoir plusieurs templates ?I Comparaison des templates pendant la conceptionI Choix pour les utilisatrices, réutilisation pour d’autres projetsI Accessibilité !

Un template comprend la structure HTML et le CSS, mais utilisedes variables pour les données spécifiques à une page (e.g., titre,contenu). Ces variables sont renseignées par les vues.

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 53 / 56

Page 54: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

Les templates - exemple

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 54 / 56

1 <head>2 <meta charset="utf-8" />3 <title ><?= $nomSite ?></title>4 <link href="css/style2.css">5 </head>6 <body class="template2">7 <?php include('templates/header2.php'

); ?>8 <main>9 <?= $titre ?>10 <?= $contenu; ?>11 </main>12 <?php include('templates/footer.php')

; ?>13 </body>

Exemple de template. Le styleCSS peut être spécifique autemplate (ligne 4), et les variables(ici $titre et $contenu)utilisées par les vues (lignes 9 et10).

1 <?php $titre = "Liste des séries"; ?>23 <?php ob_start(); ?>4 <ul>5 <?php foreach($series as $serie) { ?>6 <li><?= $serie['nomSerie'] ?></li>7 <?php } ?>8 </ul>9 <?php $contenu = ob_get_clean(); ?>1011 <?php require 'templates/' .

$currentTemplate; ?>

Exemple de vue utilisant untemplate. La vue ne fait qu’instancierles variables du template : $titre àla ligne 1 et $contenu, qui nécessitede bufferiser les données avec lesfonctions ob_start() etob_get_clean() (lignes 3 à 9). Letemplate courant est chargé ligne 11.

Page 55: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Superglobales Sessions Bases de données Système de fichiers MVC

En pratique - gestion de projet

I Dans le binôme, certaines tâches sont faites ensemble(modélisation, structuration du site) et d’autres en parallèle(programmation des différentes fonctionnalités)I bien réfléchir à la structuration pour faciliter la répartitionI ne pas perdre trop de temps sur le design !

I Utilisation de la forge (http://forge.univ-lyon1.fr/) :I code partagé, travail collaboratif, versioningI travail sauvegardé (cas de perte de la clé USB)I apprentissage de GitI clients graphiques GitKraken, Sourcetree, GitExtensions, etc.

http://fr.wikipedia.org/wiki/Conception_de_site_webhttp://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysqlhttp://openclassrooms.com/courses/gerez-vos-codes-source-avec-githttp://www.mercurial-scm.org/wiki/FrenchTutorialBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 55 / 56

Page 56: BDW1 - Programmation web - PHP avancéExtensionsPHP PHPfournitdesextensions,classéesendif-férentescatégories: I Extensionsnoyau(e.g.,Arrays, Date/Time,FileSystem) I Extensionsintégrées(e.g.,FTP

Bilan

Quelques extensions de PHP :I Variables superglobales (dont celle de session)I Manipulation des bases de données (ici MariaDB / MySQL)I Manipulation du système de fichiers du serveurI Introduction à MVC et aux templates

Prochain et dernier cours :optimisation de requêtes

BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 56 / 56