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