Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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/
Positionnement dans BDW1
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 2 / 56
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
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
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
Plan
Superglobales
Sessions
Bases de données
Système de fichiers
Modèle Vue Contrôleur
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
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
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
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
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
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
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
Plan
Superglobales
Sessions
Bases de données
Système de fichiers
Modèle Vue Contrôleur
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
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
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
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
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
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
Plan
Superglobales
Sessions
Bases de données
Système de fichiers
Modèle Vue Contrôleur
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Plan
Superglobales
Sessions
Bases de données
Système de fichiers
Modèle Vue Contrôleur
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
Plan
Superglobales
Sessions
Bases de données
Système de fichiers
Modèle Vue Contrôleur
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
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
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
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>
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
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
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
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
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.
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
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