bdw1 - programmation web - php avancé i séparationducodehtmletphp i...
TRANSCRIPT
BDW1 - Programmation web - PHP avancé
Fabien Duchateau
fabien.duchateau [at] univ-lyon1.fr
Université Claude Bernard Lyon 1
2017 - 2018
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 / 60
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 / 60
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 / 60
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 / 60
Connaitre les extensions PHP
I phpinfo(), qui fournit de nombreuses informations sur PHP(version, extensions, environnement, etc.)
I get_loaded_extensions(), qui retourne un tableau avec lesextensions 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 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Inclusion de fichiers
En PHP, il est possible d’inclure un fichier externe :I Équivalent à copier-coller le contenu du fichier inclus à la
place de la fonction d’inclusionI Regroupement de fonctions (liées à la manipulation de BD par
exemple) ou de variablesI Découpage des différentes parties d’un site
Fonctions d’inclusion include ou require :I Avertissement avec include si fichier non trouvéI Erreur fatale avec require si fichier non trouvéI Variantes avec include_once et require_once
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 7 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Syntaxe de l’inclusion de fichiers
include(”chemin/nom_fichier.php”);require(”chemin/nom_fichier.php”);
Fichier exemples.php1 <?php // inclusion2 include("fonctions.php");3 echo sommer(1, 2);4 ?>
Fichier fonctions.php1 <?php // fonction somme2 function sommer($a, $b) {3 return $a + $b;4 }5 ?>
Le fichier de gauche inclut le fichier de droite (ligne 2) : celaéquivaut à ”remplacer la ligne d’inclusion par les 5 lignes du fichierfonctions.php”
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 8 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage de l’information
Grâce aux fonctions d’inclusion, il est facile de réutiliser etfactoriser le code :
I Les parties du site communes/statiques (e.g., entête, menu)sont incluses par les autres pages
I Les parties avec le contenu spécifique d’une page (i.e.,fonctionnalité) peuvent être incluses ou pas
Dans la suite, description des différents découpages
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 9 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”sans inclusion”
Le code n’est pas factorisé : la partie <header> est identique dansles fichiers index.php et ajout.php
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 10 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”sans inclusion”
Le code n’est pas factorisé : la partie <header> est identique dansles fichiers index.php et ajout.php
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 10 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page par contenu spécifique”
Avec cette solution, chaque fonctionnalité a sa propre page :I Les parties communes/statiques du site sont inclusesI Les parties de contenu sont spécifiques à chaque fichier, sans
inclusion
Inconvénients :I Pour certaines modifications (e.g., du template ou le nom
d’un fichier d’inclusion), besoin de modifier chaque fichier decontenu
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 11 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page par contenu spécifique” (2)
Découpage ”une page par contenu spécifique” : les zonescommunes, stockées dans des fichiers externes, sont incluses par
chaque page de contenuBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 12 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page par contenu spécifique” (3)
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 13 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page unique avec inclusions”
Avec cette solution, un seul fichier qui fait de multiples inclusions :I Généralement le fichier index.phpI Les parties communes/statiques sont inclusesI Les parties de contenu sont dans des fichiers séparés, et
chargées selon la valeur d’un paramètre
Inconvénients :I URL non explicite (page index.php)I Besoin de passer la page de contenu en paramètre, session,
etc.
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 14 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page unique avec inclusions” (2)
Découpage ”une page unique avec inclusions” : une seule page, quicharge les zones communes à partir de fichiers externes et un
contenu spécifique selon la valeur d’un paramètreBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 15 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page unique avec inclusions” (3)
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 16 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
Découpage ”une page unique avec inclusions” (4)
Extrait du fichier index.php, avec les inclusions de partiesstatiques et l’inclusion de la partie contenu via un paramètre GET
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 17 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
En pratique - réalisation du projet
I Structuration du site avec les inclusions (”une page unique”ou ”une page par contenu”)
I En général, à chaque balise structurante correspond un fichier(e.g., un fichier menu.php pour la balise <nav>)
I Exemple d’organisation du site en fichiers :I page d’accueil (index.php)I répertoire static/, qui contiendra les fichiers communs à
toutes les pages (e.g., menu.php, header.php, footer.php)I répertoire php/, qui contiendra les fichiers dynamiques
(contenu ou fonctionnalité)I répertoire img/ pour les imagesI répertoire inc/ pour les fichiers généraux (e.g., un fichier qui
contient des fonctions)I répertoire css/ pour le(s) fichier(s) de styles
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 18 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 zones en PHP)
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 Git
http://fr.wikipedia.org/wiki/Site_webhttp://fr.wikipedia.org/wiki/Conception_de_site_webhttp://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysqlhttp://openclassrooms.com/courses/evoluez-vers-une-architecture-php-professionnellehttps://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 19 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
En résumé
I Deux fonctions pour inclure des fichiers : include et requireI Un peu d’aide pour s’organiser en projet
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 20 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 formuaire ($_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 22 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 23 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 24 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 24 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 24 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 24 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 25 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 26 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 26 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 26 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 nom
echo ”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 26 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 26 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 27 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 28 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 avecauthentification
I Se souvenir des références indiquant à quoi l’utilisatrices’intéresse
I 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 30 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 avecauthentification
I Se souvenir des références indiquant à quoi l’utilisatrices’intéresse
I 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 30 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 ... ?
http://www.php.net/manual/fr/book.session.phpBDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 31 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 31 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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édente
I La variable $_SESSION se manipule ensuite comme un tableauassociatif classique
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 32 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 : Wed, 18 Oct 2017 10:50:58 +0000
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 33 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 session
I 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 34 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 35 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 37 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 37 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 38 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 39 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 40 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 $connexion = null;3 function connectBD() {4 global $connexion;5 $connexion = mysqli_connect($serveur , $user, $mdp, $bd);6 if (mysqli_connect_errno()) {7 printf("Échec de la connexion : %s\n", mysqli_connect_error
());8 exit();9 }10 }11 ?>
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 41 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 42 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 43 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 44 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 45 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 46 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
É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 47 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 48 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 49 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 50 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 51 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 52 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 53 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 54 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 55 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 55 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 56 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 56 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 57 / 60
Structuration du site Superglobales Sessions Bases de données Système de fichiers
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 59 / 60
Bilan
Quelques extensions de PHP :I Structuration du site avec les fonctions d’inclusionI Variables superglobales (dont celle de session)I Manipulation des bases de données (ici MariaDB / MySQL)I Manipulation du système de fichiers du serveur
Prochain et dernier cours :optimisation de requêtes
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 60 / 60
Bilan
Quelques extensions de PHP :I Structuration du site avec les fonctions d’inclusionI Variables superglobales (dont celle de session)I Manipulation des bases de données (ici MariaDB / MySQL)I Manipulation du système de fichiers du serveur
Prochain et dernier cours :optimisation de requêtes
BDW1 - Bases de données et programmation web // Programmation web - PHP avancé UCBL Lyon 1 60 / 60