bdw1 - programmation web - php avancé i séparationducodehtmletphp i...

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

Upload: doandung

Post on 09-Jul-2018

219 views

Category:

Documents


0 download

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

Plan

Structuration du site

Superglobales

Sessions

Bases de données

Système de fichiers

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

Plan

Structuration du site

Superglobales

Sessions

Bases de données

Système de fichiers

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

Plan

Structuration du site

Superglobales

Sessions

Bases de données

Système de fichiers

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

Plan

Structuration du site

Superglobales

Sessions

Bases de données

Système de fichiers

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

Plan

Structuration du site

Superglobales

Sessions

Bases de données

Système de fichiers

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