LIF4 - Programmation Web - cours PHP 2



Documents pareils
PHP. PHP et bases de données

PHP 4 PARTIE : BASE DE DONNEES

Mysql. Les requêtes préparées Prepared statements

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Installation / Sauvegarde Restauration / Mise à jour

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Java DataBaseConnectivity

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Introduction à JDBC. Accès aux bases de données en Java

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

CREATION WEB DYNAMIQUE

Stockage du fichier dans une table mysql:

Devenez un véritable développeur web en 3 mois!

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

PHP 5. La base de données MySql. A. Belaïd 1

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

INFORMATIQUE & WEB. PARCOURS CERTIFICAT PROFESSIONNEL Programmation de sites Web. 1 an 7 MODULES. Code du diplôme : CP09

Dans l'article précédent, vous avez appris

Programmation Web. Madalina Croitoru IUT Montpellier

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Pratique et administration des systèmes

Le service FTP. M.BOUABID, Page 1 sur 5

Guide de démarrage

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

Bases de données et sites WEB

Plan du cours. Historique du langage Nouveautés de Java 7

Installation de Joomla avec Filezilla

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Attaques applicatives

Mysql avec EasyPhp. 1 er mars 2006

SYSTÈMES D INFORMATIONS

Application web de gestion de comptes en banques

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

les techniques d'extraction, les formulaires et intégration dans un site WEB

OpenPaaS Le réseau social d'entreprise

Un exemple d'authentification sécurisée utilisant les outils du Web : CAS. P-F. Bonnefoi

Les sites Internet dynamiques. contact : Patrick VINCENT pvincent@erasme.org

Gestion du parc informatique matériel et logiciel de l Ensicaen. Rapport de projet. Spécialité Informatique 2 e année. SAKHI Taoufik SIFAOUI Mohammed

Dans nos locaux au 98 Route de Sauve NÎMES. Un ordinateur PC par stagiaire, scanner, imprimante/copieur laser couleur

Documentation de conception

PDO : PHP Data Object 1/13

Accès aux bases de données

Formation : WEbMaster

Structure fonctionnelle d un SGBD

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

SUPPORT DE COURS / PHP PARTIE 3

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

L3 informatique TP n o 2 : Les applications réseau

I. MySQL : Serveur et SGBD

ISPConfig Documentation

Bureautique Initiation Excel-Powerpoint

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Réseaux et protocoles Damien Nouvel

PHP 5.4 Développez un site web dynamique et interactif

Automatisation de l administration système

PROMETHEE Guide d installation

Installation d'un serveur FTP géré par une base de données MySQL

E-TRANSACTIONS. Guide du programmeur API Plug-in. Version 1.1

contact@nqicorp.com - Web :

1. Base de données SQLite

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

Transfert d un site local vers un serveur. NPDS REvolution 13. Rédaction : Axel Relecture : Dev & Jpb

WordPress :: Migrer son site du local vers le serveur en ligne

BES WEBDEVELOPER ACTIVITÉ RÔLE

3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures

INTRODUCTION AU CMS MODX

Créer une connexion entre Sage CRM et Sage Etendue pour émettre directement des devis et commandes

Impact des robots d indexation sur le cache de second niveau de SPIP IMBERTI Christophe - SG/SPSSI/CP2I/DO Ouest 06/06/2012 mis à jour le 05/07/2012

Hébergement de site web Damien Nouvel

PROJET 1 : BASE DE DONNÉES REPARTIES

WebSpy Analyzer Giga 2.1 Guide de démarrage

LI345 Bases de données et sites Web. Licence de Sciences et Technologies Mention Informatique

STID 2ème année : TP Web/PHP

Logiciel de gestion de caisse et d ardoises

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Diffuser un contenu sur Internet : notions de base... 13

LA PLATE-FORME D'ALTERN C

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Java et les bases de données

Les BASES de DONNEES dans WampServer

SQL Parser XML Xquery : Approche de détection des injections SQL

Vulnérabilités et sécurisation des applications Web

MANUEL DE L UTILISATEUR

Tutorial sur SQL Server 2000

Thème : Création, Hébergement et référencement d un site Web

Transcription:

LIF4 - Programmation Web - cours PHP 2 Fabien Duchateau fabien.duchateau [at] univ-lyon1.fr Université Claude Bernard Lyon 1 2015-2016 http://liris.cnrs.fr/fabien.duchateau/ens/lif4/ 1/65

Rappel du cours précédent Syntaxe générale de PHP : Séparation du code HTML et PHP Affectation de variables (typage faible) Structures conditionnelles Boucles 2/65

Rappel du cours précédent Syntaxe générale de PHP : Séparation du code HTML et PHP Affectation de variables (typage faible) Structures conditionnelles Boucles Dans ce cours, fonctionnalités plus spécifiques à l utilisation de PHP en programmation Web 2/65

Extensions PHP PHP inclut des extensions spécifiques à des applications tierces, classées en différentes catégories : Extensions noyau (e.g., Arrays, Date/Time, FileSystem) Extensions intégrées (e.g., FTP, PostgreSQL, Zip) Extensions externes (e.g., MySQL, GeoIP) Extensions liées à l inclusion de fichiers, à la manipulation de fichiers, aux sessions et aux bases de données 3/65

Plan du cours Organisation du code Système de fichiers Superglobales Sessions Bases de données 4/65

Inclusion de fichiers En PHP, il est possible d inclure un fichier externe : Équivalent à copier-coller le contenu du fichier inclus à la place de la fonction d inclusion Regroupement de fonctions (liées à la manipulation de BD par exemple) ou de variables Découpage des différentes parties d un site Fonctions d inclusion include ou require : Avertissement avec include si fichier non trouvé Erreur fatale avec require si fichier non trouvé Variantes avec include_once et require_once 5/65

Inclusion de fichiers (2) Syntaxe avec include ou require : nom_fichier est le chemin vers le fichier include("nom_fichier.php") ; require("nom_fichier.php") ; 6/65

Découpage de l information Grâce aux fonctions d inclusion, il est facile de réutiliser et factoriser le code : Les parties du site communes/statiques (e.g., entête, menu) sont incluses par les autres pages 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 7/65

Découpage "sans inclusion" Le code n est pas factorisé : la partie <header> est identique dans les fichiers index.php et ajout.php 8/65

Découpage "sans inclusion" Le code n est pas factorisé : la partie <header> est identique dans les fichiers index.php et ajout.php 8/65

Découpage "une page par contenu spécifique" Avec cette solution, chaque fonctionnalité a sa propre page : Les parties communes/statiques du site sont incluses Les parties de contenu sont spécifiques à chaque fichier, sans inclusion Inconvénients : Pour certaines modifications (e.g., du template ou le nom d un fichier d inclusion), besoin de modifier chaque fichier de contenu 9/65

Découpage "une page par contenu spécifique" (2) Découpage "une page par contenu spécifique" : les zones communes, stockées dans des fichiers externes, sont incluses par chaque page de contenu 10/65

Découpage "une page par contenu spécifique" (3) 11/65

Découpage "une seule page avec inclusions" Avec cette solution, un seul fichier qui fait de multiples inclusions : Généralement le fichier index.php Les parties communes/statiques sont incluses Les parties de contenu sont dans des fichiers séparés, et chargées selon la valeur d un paramètre Inconvénients : URL non explicite (page index.php) Besoin de passer la page de contenu en paramètre, session, etc. 12/65

Découpage "une seule page avec inclusions" (2) Découpage "une seule page avec inclusions" : une seule page, qui récupère les zones communes dans des fichiers externes et un contenu spécifique selon la valeur d un paramètre 13/65

Découpage "une seule page avec inclusions" (3) 14/65

Découpage "une seule page avec inclusions" (4) Extrait du fichier index.php, avec les inclusions de parties fixes et l inclusion de la partie contenu via un paramètre GET 15/65

En résumé Deux fonctions pour include des fichiers : include et require Organisation du site avec les inclusions ("une seule page" ou "une page par contenu") 16/65

Plan Organisation du code Système de fichiers Superglobales Sessions Bases de données 17/65

Généralités Avec PHP, il est possible de manipuler le système de fichiers du serveur : Lire ou écrire dans un fichier Obtenir des informations sur un fichier Gérer des fichiers uploadés par l utilisatrice Lister les fichiers d un répertoire Créer, supprimer des fichiers ou répertoires... Extension filesystem incluse dans le noyau de PHP http://www.php.net/manual/fr/book.filesystem.php 18/65

Chemins de fichiers Plusieurs types de système de fichiers ext3, ext4 pour Linux hfs, hsf+ sous Mac fat, ntfs pour Windows Comment représenter un chemin en PHP? Sous Windows : slash (/) et antislash (\) sont utilisés Pour les autres : seul le slash (/) est utilisé Éviter de coder un chemin de fichier absolu en "dur" (projet)! http://fr.wikipedia.org/wiki/syst%c3%a8me_de_fichiers 19/65

Chemins de fichiers (2) Fonction pathinfo pour avoir des informations sur un chemin pathinfo($chemin_fichier) Également disponibles les fonctions dirname() et basename() Attention, toutes ces fonctions n agissent que sur la chaîne de caractères représentant le chemin! Example d utilisation de pathinfo $infos = pathinfo('/www/htdocs/mon-site/index.php') ; echo $infos['dirname']."\n" ; echo $infos['basename']."\n" ; echo $infos['extension']."\n" ; echo $infos['filename']."\n" ; 20/65

Chemins de fichiers (2) Fonction pathinfo pour avoir des informations sur un chemin pathinfo($chemin_fichier) Également disponibles les fonctions dirname() et basename() Attention, toutes ces fonctions n agissent que sur la chaîne de caractères représentant le chemin! Example d utilisation de pathinfo $infos = pathinfo('/www/htdocs/mon-site/index.php') ; echo $infos['dirname']."\n" ; echo $infos['basename']."\n" ; echo $infos['extension']."\n" ; echo $infos['filename']."\n" ; 20/65

Tests sur les fichiers Vérifier si un fichier représenté par $chemin existe file_exists($chemin) // retourne true ou false Vérifier si un fichier $nom_fic existe et est un fichier régulier is_file($nom_fic) // retourne true ou false Vérifier si un fichier $nom_rep existe et est un répertoire is_dir($nom_rep) // retourne true ou false 21/65

Tests sur les fichiers (2) Vérifier l existence et les droits de lecture, écriture et exécution d un fichier représenté par $chemin is_readable($chemin) // retourne true ou false is_writable($chemin) // retourne true ou false is_executable($chemin) // retourne true ou false Attention : les droits sont ceux de l utilisatrice qui fait touner le serveur Web (généralement nobody) 22/65

Lecture d un fichier Lire le contenu d un fichier $fichier et placer son contenu dans la chaîne $contenu : Retourne false en cas d échec Drapeau booléen optionnel : file_use_include_path pour rechercher le fichier dans les chemins définis dans include_path $contenu = file_get_contents($fichier [, $drapeau ]) ; Example de lecture d un fichier if(is_file("un_fichier.txt")) { $contenu = file_get_contents("un_fichier.txt") ; echo $contenu ; } http://www.php.net/manual/fr/function.file-get-contents.php 23/65

Écriture dans un fichier Écrire le contenu de la variable $donnees dans le fichier $fichier : Si $fichier n existe pas, il est créé La variable $donnees peut être une chaîne ou un tableau Retourne le nombre d octets écrits, sinon false Drapeaux optionnels (concaténation de drapeaux avec ) : lock_ex (verrouillage du fichier pendant l écriture) file_append (concaténation des données au fichier s il existe) file_use_include_path (recherche du fichier dans le include_path) $nb = file_put_contents($fichier, $donnees [, $drapeaux ]) ; http://www.php.net/manual/fr/function.file-put-contents.php 24/65

Écriture dans un fichier (2) Que contient le fichier animaux.txt en fin de script? $chaine1 = "abeille" ; $chaine2 = "otarie" ; $fichier = "animaux.txt" ; $nb = file_put_contents($fichier, $chaine1) ; $retour = file_put_contents($fichier, " ".$nb, lock_ex file_append) ; $contenu = file_get_contents($fichier) ; file_put_contents($fichier, $chaine2." ".$contenu) ; echo file_get_contents($fichier) ; 25/65

Écriture dans un fichier (2) Que contient le fichier animaux.txt en fin de script? $chaine1 = "abeille" ; $chaine2 = "otarie" ; $fichier = "animaux.txt" ; $nb = file_put_contents($fichier, $chaine1) ; $retour = file_put_contents($fichier, " ".$nb, lock_ex file_append) ; $contenu = file_get_contents($fichier) ; file_put_contents($fichier, $chaine2." ".$contenu) ; echo file_get_contents($fichier) ; 25/65

Fichier à nom unique Créer un fichier avec un nom unique $nom_fichier_unique dans le répertoire $repertoire : La chaine $prefixe sert de préfixe au nom du fichier Retourne le nom du fichier créé, ou false en cas d erreur Si le répertoire n existe pas, création dans le répertoire temporaire du système $nom_fichier_unique = tempnam($repertoire, $prefixe) ; 26/65

Fichier temporaire Créer un fichier temporaire au nom unique dans le répertoire système utilisé pour les fichiers temporaires : Retourne un pointeur $fichier_temp sur le fichier créé, ou false en cas d erreur Fichier ouvert en lecture et écriture Fichier supprimé s il est fermé ou en fin du script $fichier_temp = tmpfile() ; 27/65

Répertoires Lister le contenu d un répertoire $rep : Retourne un tableau $liste Drapeau optionnel pour le tri : scandir_sort_ascending (par défaut) scandir_sort_descending scandir_sort_none $liste = scandir($rep [, $tri ]) ; 28/65

Répertoires (2) Autres fonctions de répertoire : Obtenir le répertoire courant (getcwd) Créer un répertoire (mkdir) Supprimer un répertoire vide (rmdir) $rep_courant = getcwd() ; // retourne le chemin du fichier courant, ou false mkdir($rep) ; // retourne true ou false rmdir($rep) ; // retourne true ou false Voir la documentation pour les paramètres optionnels. Attention : certaines fonctions utilisent une ressource, d autres une chaine de caractères http://www.php.net/manual/fr/ref.dir.php 29/65

En résumé Extension filesystem de PHP : Un fichier est un flux (ressource qui peut être lue ou écrite séquentiellement) Nombreuses fonctions sur la manipulation des fichiers/répertoires Création de fichiers uniques ou temporaires Consulter la documentation officielle! http://vidberg.blog.lemonde.fr/ http://www.php.net/manual/fr/book.filesystem.php 30/65

Plan du cours Organisation du code Système de fichiers Superglobales Sessions Bases de données 31/65

Variables superglobales PHP définit un certain nombre de variables superglobales : Accessibles de n importe où Représentées par des tableaux associatifs Une dizaine de superglobales dont : Variables d environnement, du système d exploitation ($_ENV) Variables de session ($_SESSION) Variables de serveur ($_SERVER) Variables de paramètres ($_REQUEST, $_GET, $_POST, $_COOKIE) Fichiers envoyés par formuaire ($_FILE) http://www.php.net/manual/en/language.variables.superglobals.php 32/65

Superglobale $_GET La variable $_GET : Tableau associatif qui contient les paramètres d un formulaire soumis Ces paramètres ont été transmis via la méthode get Syntaxe de l utilisation de $_GET : Retourne la valeur pour le paramètre nomparam $_GET[' nomparam '] 33/65

Superglobale $_GET (2) Exemple : vérifier si un formulaire get est soumis <form action="#" method="get"> </form> 34/65

Superglobale $_GET (2) Exemple : vérifier si un formulaire get est soumis <form action="#" method="get"> <input type="text" name="nom"> <input type="submit" name="bvalider" value="soumettre"> </form> 34/65

Superglobale $_GET (2) Exemple : vérifier si un formulaire get est soumis <? if(isset($_get['bvalider'])) // formulaire 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> <??> 34/65

Superglobale $_GET (2) Exemple : vérifier si un formulaire get est soumis <? if(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> <? }?> 34/65

Superglobale $_POST La variable $_POST : Tableau associatif qui contient les paramètres d un formulaire soumis Ces paramètres ont été transmis via la méthode post Syntaxe de l utilisation de $_POST : Retourne la valeur pour le paramètre nomparam $_POST[' nomparam '] 35/65

Superglobale $_POST (2) Exemple : afficher le paramètre nom soumis par post <form action="#" method="post"> </form> 36/65

Superglobale $_POST (2) Exemple : afficher le paramètre nom soumis par post <form action="#" method="post"> <input type="text" name="nom"> <input type="submit" name="bvalider" value="soumettre"> </form> 36/65

Superglobale $_POST (2) Exemple : afficher le paramètre nom soumis par post <? if(isset($_post['bvalider'])) // formulaire soumis else { // formulaire non soumis, affichage du formulaire?> <form action="#" method="post"> <input type="text" name="nom"> <input type="submit" name="bvalider" value="soumettre"> </form> <??> 36/65

Superglobale $_POST (2) Exemple : afficher le paramètre nom soumis par post <? if(isset($_post['bvalider'])) // formulaire soumis if(isset($_post['nom']) &&!empty($_post['nom'])) else // formulaire soumis mais sans valeur pour le 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> <? }?> 36/65

Superglobale $_POST (2) Exemple : afficher le paramètre nom soumis par post <? if(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> <? }?> 36/65

Un mot sur la sécurité Les variables superglobales peuvent potentiellement être modifiées par l utilisatrice (e.g., modifier la valeur d un paramètre passé en get dans l URL) https://duckduckgo.com/?q=chocolat https://duckduckgo.com/?q= %3B%20DROP%20TABLE% 20uneTable%3B%20-- Votre code doit donc vérifier et valider ces variables : Côté client (HTML, Javascript) Côté serveur (PHP), avec des fonctions prédéfinies (échappement de caractères spéciaux, encodage d URL, etc.) 37/65

En résumé Variables superglobables définies par PHP $_GET et $_POST pour récupérer les paramètres d un formulaire soumis Effectuer des vérifications lors de la récupération des données 38/65

Plan du cours Organisation du code Système de fichiers Superglobales Sessions Bases de données 39/65

Généralités Il peut être utile de conserver des informations d une page sur l autre : Se souvenir du login de l utilisatrice pour les sites avec authentification Se souvenir des références indiquant à quoi l utilisatrice s intéresse Se souvenir des dernières pages visitées par l utilisatrice... 40/65

Généralités Il peut être utile de conserver des informations d une page sur l autre : Se souvenir du login de l utilisatrice pour les sites avec authentification Se souvenir des références indiquant à quoi l utilisatrice s intéresse Se souvenir des dernières pages visitées par l utilisatrice... Jusqu ici, un seul moyen : utiliser des paramètres et penser à les remettre à chaque lien et dans chaque formulaire Programmation fastidieuse et source de problèmes 40/65

Sessions Une session peut être vue comme un ensemble d informations concernant une utilisatrice d un site : Par utilisatrice, on entend un navigateur sur une machine Les informations sont conservées entre deux pages Une page PHP peut ajouter ou modifier les informations de la session En PHP, la session est vue comme une variable superglobale appelée $_SESSION : C est donc un...? http://www.php.net/manual/fr/book.session.php 41/65

Sessions Une session peut être vue comme un ensemble d informations concernant une utilisatrice d un site : Par utilisatrice, on entend un navigateur sur une machine Les informations sont conservées entre deux pages Une page PHP peut ajouter ou modifier les informations de la session En PHP, la session est vue comme une variable superglobale appelée $_SESSION : C est donc un tableau associatif http://www.php.net/manual/fr/book.session.php 41/65

Utilisation des sessions en PHP Une page PHP utilisant une session doit obligatoirement, avant mê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 les valeurs qu elle avait dans la page PHP précédente La variable $_SESSION se manipule ensuite comme un tableau associatif classique 42/65

Utilisation des sessions en PHP (2) Affichage des informations de session <? session_start() ; $_SESSION["dateConnexion"] = date("r") ; echo "Identifiant de session : ".session_id() ; echo "Date de connexion : ".$_SESSION["dateConnexion"] ;?> 43/65

Déconnexion Lorsque l utilisatrice se déconnecte, il est important de détruire sa session (e.g., éviter qu une seconde personne utilisant le même ordinateur ne se fasse passer pour la première personne) Deux étapes : réinitialiser $_SESSION pour effacer toutes les variables de la session courante, et détruire la session Destruction du cookie de session pour plus de sécurité $_SESSION = array() ; // réinitialisation session_destroy() ; // destruction http://www.php.net/manual/fr/function.session-destroy.php 44/65

En résumé Une session PHP est vue comme une variable superglobale, et donc gérée comme un tableau associatif Instruction session_start() avant tout affichage! Déconnexion en deux étapes (initialisation et destruction de la session) Démo avec demo-serie (code source sur la page du LIF4) 45/65

Plan Organisation du code Système de fichiers Superglobales Sessions Bases de données 46/65

Généralités Pour manipuler les bases de données, PHP possède plus d une vingtaine d extensions et des couches d abstraction Pour la base de données MySQL, trois API différentes : mysql : API d origine, aujourd hui obsolète mysqli : mysql improved, avec de nouvelles fonctionnalités PDO_MySQL : couche d abstraction d accès aux données à travers des PHP Data Objects http://php.net/manual/fr/refs.database.php 47/65

Généralités Pour manipuler les bases de données, PHP possède plus d une vingtaine d extensions et des couches d abstraction Pour la base de données MySQL, trois API différentes : mysql : API d origine, aujourd hui obsolète mysqli : mysql improved, avec de nouvelles fonctionnalités PDO_MySQL : couche d abstraction d accès aux données à travers des PHP Data Objects http://php.net/manual/fr/refs.database.php 47/65

Généralités (2) Utilisation de l API mysqli : Support des paradigmes de programmation procédurale et orientée objet Support des transactions Support des requêtes multiples http://www.php.net/manual/fr/book.mysqli.php 48/65

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 base 2. Exécution d une requête (préparée ou non) 3. Récupération et utilisation du résultat 4. Fermeture de la connexion On peut itérer les étapes 2 à 3 autant de fois que l on veut avant de fermer la connexion à l étape 4 49/65

Connexion à MySQL Tentative de connexion avec mysqli_connect : Paramètres : machine, utilisatrice, mot de passe et base de données Retourne une ressource $connexion, qui représente le lien de connexion vers la base de données sélectionnée $machine = "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($machine,$user,$mdp, $bd) ; 50/65

Connexion à MySQL (2) Statut de la connexion avec mysqli_connect_errno : Exécution sur la dernière tentative de connexion Retourne un code d erreur, ou 0 en cas de succès if(mysqli_connect_errno()) // erreur si > 0 printf("échec de la connexion : %s", mysqli_connect_error()) ; else { // utilisation de la base } 51/65

Exécution d une requête non préparée Exécution d une requête non préparée avec mysqli_query : Un lien de connexion est requis en paramètre La requête $req (select, insert, etc.) est un paramètre : Si la requête est construite avec les données d un formulaire, il faut échapper ces données avec la fonction mysqli_real_escape_string Retourne un objet $resultat (de type mysqli_result) // on possède un lien de connexion $connexion $req = "une_requete_sql" ; $resultat = mysqli_query($connexion, $req) ; http://www.php.net/manual/fr/mysqli.real-escape-string.php http://www.php.net/manual/fr/class.mysqli-result.php http://kunststube.net/escapism/ 52/65

Exécution d une requête non préparée (2) Remarques : Durant la phase de développement, il peut être utile d afficher la requête ($req) avant son exécution Une seule requête exécutée avec la fonction mysqli_query! Utiliser mysqli_multi_query pour envoyer plusieurs requêtes séparées par des point-virgules Nombreuses autres fonctions dans l API! http://www.php.net/manual/fr/mysqli.multi-query.php http://php.net/manual/fr/book.mysqli.php 53/65

Récupération et utilisation du résultat Récupérer chaque ligne de résultat (une par tour de boucle) dans un tableau associatif (mysqli_fetch_assoc) ou tableau numérique (mysqli_fetch_array) : Accès aux valeurs par $ligne['champ'] ou $ligne[1] Retourne true pour les requêtes insert, update, et delete // on possède un objet résultat $resultat if($resultat == FALSE) // échec printf("échec de la requête") ; else { // succès while ($ligne = mysqli_fetch_assoc($resultat)) { // utilisation des champs $ligne['champ1'],... } } 54/65

Fermeture de connexion Fermer une connexion à MySQL avec mysqli_close : Utilisation au préalable de mysqli_kill pour détruire le thread MySQL // on possède un lien de connexion $connexion mysqli_close($connexion) ; http://www.php.net/manual/fr/mysqli.kill.php 55/65

Les requêtes préparées Une requête préparée (ou requête paramétrable) est une requête réccurente, que l on compile avec des variables, et donc réutilisable en fournissant les valeurs manquantes (visibilité limitée à la session fournie par MySQL) Avantages d une requête préparée : Performances (la requête est déjà compilée, voir CM optimisation) Éviter les risques d injection SQL (paramètres transmis sous forme binaire) Économiser de la bande passante http://www.php.net/manual/fr/mysqli.quickstart.prepared-statements.php http://fr.openclassrooms.com/informatique/cours/requete-preparee-1 56/65

Les requêtes préparées (2) Préparation d une requête avec mysqli_prepare : Un lien de connexion est requis en paramètre Les variables de la requête sont remplacées par le caractère? Pas de point virgule à la fin de la requête! // on possède un lien de connexion $connexion $req = "SELECT attribut k FROM table WHERE attribut n =? " ; $stmt = mysqli_prepare($connexion, $req) ; http://www.php.net/manual/fr/mysqli-stmt.prepare.php 57/65

Les requêtes préparées (3) Avant d exécuter une requête préparée, il faut lier des variables à chacun de ses paramètres avec mysqli_stmt_bind_param : Le premier paramètre est la requête préparée Le second paramètre représente le type de chaque variable "i" = entier, "s" = string, "d" = décimal, "b" = blob "sid" correspond à une première variable de type string, une seconde de type entier, et une troisième de type décimal Paramètre(s) suivant(s) : un paramètre pour chaque variable de la requête préparée (?) Retourne true (succès) or false (échec) // on a préparé une requête, représentée par $stmt $var = "une_valeur" ; mysqli_stmt_bind_param($stmt, $types, $var) ; 58/65

Les requêtes préparées (4) Exécution de la requête avec mysqli_stmt_execute : Retourne true (succès) or false (échec) // on a préparé une requête, représentée par $stmt mysqli_stmt_execute($stmt) ; Exemples de lien et exécution $dec = 0.5 ; $str = "abc" ; mysqli_stmt_bind_param($stmt1, "s", $str) ; mysqli_stmt_execute($stmt1) ; mysqli_stmt_bind_param($stmt2, "ds", $dec, $str) ; mysqli_stmt_execute($stmt2) ; 59/65

Les requêtes préparées (5) Récupérer le nombre de lignes affectées par une requête représentée par l objet $stmt : De type select (obligation de stocker le résultat au préalable) $mysqli_stmt_store_result($stmt) ; $nb = mysqli_stmt_num_rows($stmt) ; De type insert, update, delete $nb = mysqli_stmt_affected_rows($stmt) ; http://www.php.net/manual/fr/mysqli-stmt.store-result.php 60/65

Les requêtes préparées (6) Pour récupérer les lignes résultat d une requête select, il faut lier le résultat à des variables : Autant de variables que de colonnes! // soit une requête $stmt qui retourne n colonnes mysqli_stmt_bind_result($stmt, $var 1,..., $var n ) ; Récupération d une ligne résultat avec mysqli_stmt_fetch : Retourne true (succès) or false (échec), ou null (plus de ligne à lire) Les variables $var 1,..., $var n reçoivent les valeurs de la première ligne résultat (boucle pour les lignes suivantes) mysqli_stmt_fetch($stmt) ; 61/65

Les requêtes préparées (7) Exemple de requête préparée $reqp = "SELECT titre FROM Episode WHERE numero =?" ; if(!($stmt = mysqli_prepare($connexion, $reqp))) echo "Erreur de préparation : ".mysqli_error($connexion) ; else { $var = 1 ; // variable qui sera liée à la requête mysqli_stmt_bind_param($stmt, "i", $var) ; // lien mysqli_stmt_execute($stmt) ; // exécution de la requête mysqli_stmt_bind_result($stmt, $episodes) ; // lien résultat echo "<h2>episodes numérotés $var :</h2><p><ul>" ; while (mysqli_stmt_fetch($stmt)){ // parcours du résultat echo "<li>$episodes</li>" ; } echo "</ul>" ; } 62/65

Les requêtes préparées (7) Exemple de requête préparée $reqp = "SELECT titre FROM Episode WHERE numero =?" ; if(!($stmt = mysqli_prepare($connexion, $reqp))) echo "Erreur de préparation : ".mysqli_error($connexion) ; else { $var = 1 ; // variable qui sera liée à la requête mysqli_stmt_bind_param($stmt, "i", $var) ; // lien mysqli_stmt_execute($stmt) ; // exécution de la requête mysqli_stmt_bind_result($stmt, $episodes) ; // lien résultat echo "<h2>episodes numérotés $var :</h2><p><ul>" ; while (mysqli_stmt_fetch($stmt)){ // parcours du résultat echo "<li>$episodes</li>" ; } echo "</ul>" ; } 62/65

Les requêtes préparées (8) Pour réutiliser une requête préparée : Modifier la valeur de la variable (déjà) liée Éxécuter de nouveau la requête Exemple de réutilisation de requête préparée $var = 2 ; // modification de la valeur de la variable liée mysqli_stmt_execute($stmt) ; // exécution de la requête mysqli_stmt_bind_result($stmt, $episodes) ; // lien résultat echo "<h2>episodes numérotés $var :</h2><p><ul>" ; while (mysqli_stmt_fetch($stmt)) {// parcours du résultat echo "<li>$episodes</li>" ; } echo "</ul>" ; 63/65

Les requêtes préparées (8) Pour réutiliser une requête préparée : Modifier la valeur de la variable (déjà) liée Éxécuter de nouveau la requête Exemple de réutilisation de requête préparée $var = 2 ; // modification de la valeur de la variable liée mysqli_stmt_execute($stmt) ; // exécution de la requête mysqli_stmt_bind_result($stmt, $episodes) ; // lien résultat echo "<h2>episodes numérotés $var :</h2><p><ul>" ; while (mysqli_stmt_fetch($stmt)) {// parcours du résultat echo "<li>$episodes</li>" ; } echo "</ul>" ; 63/65

En résumé PHP inclut trois APIs pour MySQL, dont mysqli Quatre étapes pour se connecter et interroger MySQL Factorisation du code et sécurité avec les requêtes préparées Démo avec demo-serie (code source sur la page du LIF4) 64/65

Bilan PHP propose des extensions : Organisation du site avec les fonctions d inclusion Manipulation du système de fichiers du serveur Variables superglobales (dont celle de session) Manipulation des bases de données (ici MySQL) 65/65

Bilan PHP propose des extensions : Organisation du site avec les fonctions d inclusion Manipulation du système de fichiers du serveur Variables superglobales (dont celle de session) Manipulation des bases de données (ici MySQL) Prochain et dernier cours : optimisation de requêtes 65/65