PHP/MYSQL Web Dynamique ENSG Septembre 2009
Ces 6 jours de formation Jour 1 : présentations, attentes, principes, HTML Jour 2 : HTML, CSS, PHP Jour 3 : formulaires, connexion à la base de données Jour 4 : Rappel PHP, sessions, cookies, extraction de données, affichage Jour 5 : Requêtes, Insertion de données Jour 6 : Sécurité, questions, retours sur la formation.
NOTRE EXEMPLE Application simple en PHP
Gestion de bibliothèque Enregistrement des ouvrages : titre, auteur, date de publication, catégorie Ajout de nouveau livres par des utilisateurs autorisés Recherche par catégorie, par titre, par auteur Accès par le web
Application web PHP : traitements MySQL : base de données contenant les informations sur les livres, utilisateurs, etc...
PHP Langage de script adapté au web
Où trouver tout ce que vous voulez savoir et tout ce que vous ne voulez pas savoir à propos de PHP?
http://www.php.net
AU REVOIR Bonne fin de journée!
IDE ET DEBUGGER Eclipse et XDebug
IDE : eclipse + PDT Se simplifier la vie
IDE : eclipse + PDT Auto-complétion ctrl+espace Vérification de la syntaxe à la volée Ajout automatique de commentaires de documentation : /** + retour chariot devant une déclaration de fonction ou sur un en-tête de fichier Intégration avec XDebug (point d arrêts, lancement)
DEBUGGER ET PHP XDebug
XDebug : debugger de PHP PHP : langage de script Debu!er non prévu à l origine comme en C/C++/ java/.net Debu!er : Points d arrêts, Pas à pas, Exploration des variables
Configurer XAMPP sans installation Récupérer et décompresser le.zip dans un répertoire adéquat (pas le bureau) Lancer setup_xampp.bat Aux questions, voyons les réponses ensemble
Configuration de XDebug Utiliser XAMPP : XDebug est installé mais pas activé ouvrir <XAMPP>/php/php.ini avec un éditeur texte Décommenter les lignes de configuration de la section [XDebug] Décommenter la ligne zend_extension =..php_xdebug.dll Relancer apache via XAMPP
Nouveau projet Eclipse Ouvrir eclipse Choisir <XAMPP>/htdocs/eclipse (créer le dossier) comme workspace Créer un projet PHP : Clic droit dans la liste des projets : New > PHP Project Clic droit sur le dossier : New > PHP File > index.php Écrire : <?php phpinfo(); et sauvegarder Configurer le debu!er : Clic droit sur le projet > debug as Choisir XDebug, Nouveau serveur Web : Donner un nom, URL : http://localhost/eclipse/ Cliquer sur Debug pour tester : le navigateur doit s ouvrir sur une page non vide
LANGAGE PHP Introduction
BONJOUR LE MONDE Le n-ième He$o World
Hello world Nouveau langage, nouveau He$o world! Créer un fichier index.php
Hello world Nouveau langage, nouveau He$o world! Créer un fichier index.php <?php?> echo Hello world ;
Explications <?php?> echo Hello world ;
Explications Délimitent le code PHP <?php?> echo Hello world ;
Explications Délimitent le code PHP Tout ce qui est en dehors de ces balises n est pas interprété comme du code PHP mais directement envoyé au client. <?php?> echo Hello world ;
Hello world 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/tr/xhtml11/dtd/ xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>mon index.php!!!</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <p> <?php echo Hello World! ;?> </p> </body> </html>
Hello world 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/tr/xhtml11/dtd/ xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>mon index.php!!!</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <p> <?php echo Hello World! ;?> </p> </body> </html> Seule partie interprétée par PHP
LES VARIABLES et les opérateurs
PHP et les variables Pas besoin de déclarer les variables Pas de type de données Pas de gestion mémoire
PHP et les variables Pas besoin de déclarer les variables Pas de type de données Pas de gestion mémoire <?php $foo = bar ; $foo = 3; $foo++;?>
Opérateurs Opérateur Exemple Résultat si $bar = 3 = affectation $foo = $bar 3 + addition 2+3+$bar; 8 - soustraction 2-3-$bar; -2 * multiplication 2*3*$bar; 18 / division $bar/2; 1.5 % modulo $bar%2 1. concaténation $bar. ok 3 ok
Opérateurs Opérateur Exemple Résultat si $bar = 3 = affectation $foo = $bar 3 + addition 2+3+$bar; 8 - soustraction 2-3-$bar; -2 * multiplication 2*3*$bar; 18 / division $bar/2; 1.5 % modulo $bar%2 1. concaténation $bar. ok 3 ok Ne pas confondre avec l opérateur de comparaison ==
Opérateurs de comparaison Opérateur Exemple Résultat == égalité de valeur 3 == 3 TRUE === égalité valeur et type 3 === 3 FALSE < inférieur strict 3 < 3 FALSE <= inférieur ou égal 3 <= 3 TRUE > supérieur strict 3 > 3 FALSE >= supérieur ou égal 3 >= 3 TRUE!= différent (valeur) 3!= 3 FALSE!== différent (valeur ou type) 3!== 3 TRUE
Opérateurs logiques Opérateur! NON && ET OU
LES TABLEAUX Une structure de données très utile en PHP
PHP et les tableaux <?php // Création (facultatif) $montab = array();?> // Initialisations $montab[0] = 1; $montab[1] = 32.5; $montab[2] = Hello World ; // Tableaux à plusieurs dimensions $montab[3] = array(); $montab[3][0] = 1; $montab[3][2] = Hello World ; // Initialisation sans connaître le numéro $montab[] = 32; // Équivalent à $montab[4] = 32; // Création et initalisation $tableau2 = array(1,32.5, Hello World,32);
Tableaux de hachage <?php // Création (facultatif) $montab = array();?> // Initialisations $montab[ couleur ] = vert ; $montab[ temperature ] = 32.5; $montab[ message ] = Hello World ; // Création et initalisation $tableau2 = array( couleur => vert, temperature =>32.5, message => Hello World );
Tableaux de hachage <?php // Création (facultatif) $montab = array();?> // Initialisations $montab[ couleur ] = vert ; $montab[ temperature ] = 32.5; $montab[ message ] = Hello World ; // Création et initalisation $tableau2 = array( couleur => vert, temperature =>32.5, message => Hello World ); NB : les tableaux à plusieurs dimensions sont aussi possibles
Parcours de tableaux <?php // Récupération de la clé foreach ($tableau as $cle => $valeur) { echo <p>la clé.$cle. est associée à la valeur :.$valeur. <p> ; }?> // Pas de récupération de la clé foreach ($tableau as $valeur) { echo <p>le tableau contient la valeur :.$valeur. <p> ; }
Boucles <?php // Boucle «Pour» de 0 à 99 for ($compteur = 0; $compteur < 100 ; $compteur++) { echo <p>le compteur a la valeur.$compteur. </p> ; }?> // Boucle «Tant que» while ($test == false) { echo <p>le test est faux<p> ; $test = true; } // Boucle «Répeter jusqu à» do { echo <p>traitement<p> ; $test = true; } while ($test == false)
Tests <?php if ($truc == machin ){ // Si truc = machin }else{ // Sinon }?>
LES FORMULAIRES Interactions avec l utilisateur
Données des formulaires Code source HTML <form action= fichier.php method= get > <input type= text name= nom /> <input type= submit value= Envoyer /> </form>
Données des formulaires Fichier qui devra analyser le formulaire Code source HTML <form action= fichier.php method= get > <input type= text name= nom /> <input type= submit value= Envoyer /> </form>
Données des formulaires Fichier qui devra analyser le formulaire Code source HTML <form action= fichier.php method= get > <input type= text name= nom /> <input type= submit value= Envoyer /> </form> Valeur renvoyée par l utilisateur accessible via $_GET[ nom ]
Méthodes de formulaires GET POST passé dans la barre d adresse passé en HTTP marques-page et liens possibles pas de marque-page $_GET[ nom ] $_POST[ nom ]
PETIT EXERCICE Formulaire d authentification
Exo : formulaire et PHP Créer un formulaire d authentification dans un fichier php Traiter le résultat du formulaire avec le même fichier Si le login est admin et le mot de passe pipo remplacer le formulaire par un cadre rappelant l identité de l utilisateur Afficher une information secrète Fonctions utiles : array_key_exists() et is_array() (voir la documentation de PHP)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">! <head>! <meta http-equiv="content-type" content="text/ html;charset=utf-8" /> <title>exercice 1</title>! </head>! <body>! <h1>page web protégée</h1>! <div id="identite"> <?php if (is_array($_post) && array_key_exists("login", $_POST) && array_key_exists("pass",$_post) && $_POST ["login"]=="admin" && $_POST["pass"]=="pipo") { // Ok $connecte = true; echo "<p>bienvenue Admin!</p>"; }else{ $connecte = false; // Formulaire?> <form method="post" action="index.php"> <dl> <dt>nom</dt> <dd><input type="text" name="login" /></dd> <dt>mot de passe</dt> <dd><input type="password" name="pass" /></ dd> </dl> <p><input type="submit" value="connexion" /></ p> </form> <?php }?> </div> <div id="contenu"> <?php if ($connecte) {?> <p>informations confidentielles, accessibles uniquement pour l'admin! Trop fort!</p> <?php }else {?> <p>connectez-vous d'abord!</p> <?php }?> </div>! </body> </html>
Comment fait-on pour gérer les identités grâce à la base de données?
MYSQL SGBD libre
SGBD libre Système de gestion de bases de données libre Bases de données relationnelle (standard) Suffit à la plupart des usages du web Grand succès grâce au lien fort avec PHP Libre : open source et gratuit
SGBD simple Pas de transactions (sur MyISAM) Pas de procédures stockées Pas de contrôle d intégrité
SQL Échanger avec la base de données
Un langage standard Langage normalisé Repris par tous les SGBD, mais adapté aux besoins : petites différences dans la syntaxe base et principes communs
Manipulation des données SELECT : récupération de données selon certains critères INSERT : enregistrement de nouvelles données UPDATE : modification de données existantes DELETE : suppression de données
Manipulation de la structure CREATE : création d une table ou d une base de données DROP : effacement d une table ou base ALTER : modifier une table existante
MODÉLISATION Créer un schéma de base de données
Identifier les données Utilisateurs Livres Auteurs Catégories
Modélisation de la base de données n
Modélisation de la base de données Utilisateur Nom Prénom Login Mot de passe Auteur Nom Prénom 1.Identifier les objets Livre ISBN Titre Année de publication Catégorie Nom n
Modélisation de la base de données Utilisateur Nom Prénom Login Mot de passe Auteur Nom Prénom Livre 1.Identifier les objets 2.Trouver des identifiants uniques ISBN Titre Année de publication Catégorie Nom n
Modélisation de la base de données Utilisateur id Nom Prénom Login Mot de passe Auteur id Nom Prénom Livre 1.Identifier les objets 2.Trouver des identifiants uniques ISBN Titre Année de publication Catégorie id Nom n
Modélisation de la base de données 1.Identifier les objets Utilisateur id Nom Prénom Login Mot de passe 2.Trouver des identifiants uniques Livre ISBN Titre Année de publication 3.Trouver les relations entre objets et les cardinalités 1 auteur écrit plusieurs livres 1 livre n a qu un auteur Auteur id Nom Prénom Catégorie id Nom n
Modélisation de la base de données 1.Identifier les objets Utilisateur id Nom Prénom Login Mot de passe 2.Trouver des identifiants uniques Livre ISBN Titre Année de publication 3.Trouver les relations entre objets et les cardinalités 1 auteur écrit plusieurs livres 1 livre n a qu un auteur 1 livre appartient à 1 ou plusieurs catégories 1 catégorie peut contenir plusieurs livres Auteur id Nom Prénom Catégorie id Nom n
Modélisation de la base de données 1.Identifier les objets Utilisateur id Nom Prénom Login Mot de passe 2.Trouver des identifiants uniques Livre ISBN Titre Année de publication 3.Trouver les relations entre objets et les cardinalités 1,1 1 auteur écrit plusieurs livres 1 livre n a qu un auteur 1 livre appartient à 1 ou plusieurs catégories 1 catégorie peut contenir plusieurs livres 1,n 0,n 1,n Auteur id Nom Prénom Catégorie id Nom n
Modélisation de la base de données Utilisateur id Nom Prénom Login Mot de passe Livre 1,1 1,n Auteur id Nom Prénom ISBN Titre Année de publication 1,n Catégorie 0,n id Nom n
Modélisation de la base de données Utilisateur id Nom Prénom Login Mot de passe Livre 1,1 1,n Auteur id Nom Prénom 4.Relations 1-n : mettre une clé ISBN Titre Année de publication #auteur étrangère dans la table des objets qui ne sont liés qu à un seul objet 1,n 0,n Catégorie id Nom n
Modélisation de la base de données Utilisateur id Nom Prénom Login Mot de passe Livre 1,1 1,n Auteur id Nom Prénom 4.Relations 1-n : mettre une clé ISBN Titre Année de publication #auteur étrangère dans la table des objets qui ne sont liés qu à un seul objet 1,n 5.Relations n-n : créer une table de liaison 1,1 Appartenance #catégorie #livre 1,1 0,n Catégorie id Nom n
Exemples de données ISBN Titre Auteur 32234S Le Calme 1 08534G Tempête 1 id Nom Prénom 1 Dupond Jean 2 Dupont Georges ISBN Categorie 08534G 1 id Catégorie 08534G 2 1 Roman 2 Policier
Exemples de données ISBN Titre Auteur 32234S Le Calme 1 08534G Tempête 1 id Nom Prénom 1 Dupond Jean 2 Dupont Georges ISBN Categorie 08534G 1 id Catégorie 08534G 2 1 Roman 2 Policier
Exemples de données ISBN Titre Auteur 32234S Le Calme 1 08534G Tempête 1 id Nom Prénom 1 Dupond Jean 2 Dupont Georges ISBN Categorie 08534G 1 id Catégorie 08534G 2 1 Roman 2 Policier
Exemples de données ISBN Titre Auteur 32234S Le Calme 1 08534G Tempête 1 id Nom Prénom 1 Dupond Jean 2 Dupont Georges ISBN Categorie 08534G 1 id Catégorie 08534G 2 1 Roman 2 Policier
Exercice Créez des tables Écrivez des données d exemple : comptes d utilisateurs, livres, catégories, auteurs Écrivez et testez avec phpmyadmin des requêtes qui permettent de récupérer les livres d une certaine catégorie ou les ouvrages d un auteur (selon son nom)
AUTHENTIFICATION Avec utilisation de la base de données
Fonctions de hachage
Fonctions de hachage hash
Fonctions de hachage Texte, fichier (Peut être très long) hash Empreinte de taille fixe
Fonctions de hachage Texte, fichier (Peut être très long) hash Empreinte de taille fixe X Impossible (ou au moins très difficile)
Exercice Utilisez la base de données pour vérifier l authentification Stockez en base de données le mot de passe haché (md5 ou sha-1) Ne jamais stocker les mots de passe en clair dans la base de données Ne jamais chiffrer les mots de passe dans la base de données Toujours stocker des mots de passe hachés
Fonctions MySQL de PHP Rechercher dans la documentation PHP des informations sur MySQL mysql_connect() mysql_query() mysql_real_escape_string() mysql_fetch_object() ou mysql_fetch_array()
Connexion à une base de données Fonction mysql_connect(host, user, password) N utiliser qu une seule fois dans un script Script plus rapide Moins de charge sur la base de données <?php $liendb = @mysql_connect( localhost, utilisateur, motdepasse ); if (!$liendb) die( Erreur de connexion à la base de données );?>
Exécution d une requête Fonction mysql_query() <?php $liendb = @mysql_connect( localhost, utilisateur, motdepasse ); if (!$liendb) die( Erreur de connexion à la base de données ); @mysql_query( INSERT INTO livres (titre,auteur) VALUES ( Test,1),$lienDB);?>
Récupération de données Fonction mysql_fetch_array() ou mysql_fetch_object() <?php $liendb = @mysql_connect( localhost, utilisateur, motdepasse ); if (!$liendb) die( Erreur de connexion à la base de données ); $resultat = @mysql_query( SELECT * FROM livres,$liendb);?> for ($i=0;$i<@mysql_num_rows($resultat);$i++) { $livres[] = @mysql_fetch_object($resultat); } // Accès aux données echo <ul> ; foreach($livres as $livre) { echo <p>.$livre->titre. </p> ; } echo </ul> ;
Sécurisation des requêtes Tous les paramètres reçus de l utilisateur et utilisés dans une requête doivent-être sécurisés : mysql_real_escape_string() Formulaires Base de donnée <?php $liendb = @mysql_connect( localhost, utilisateur, motdepasse ); if (!$liendb) die( Erreur de connexion à la base de données ); // Sécurisation $login = mysql_real_escape_string($_post[ login ],$liendb); @mysql_query( SELECT * FROM utilisateurs WHERE login=.$login.,$liendb);?> Le paramètre magic_quotes de PHP peut poser des problèmes. Avant sa désactivation, il faut vérifier que tous les paramètres sont sécurisés!
MODÉLISATION DE L APPLICATION Quels fichiers, quelles fonctions?
QUELLES FONCTIONS? Un fichier par fonction de l application
Utilisation de librairies PHP Appel à des fonctions définies dans un autre fichier : include / include_once require / require_once : erreur si le fichier n est pas trouvé *_once : le fichier n est pas parsé une deuxième fois, évite les erreurs (fonctions déjà déclarées) include ou require : équivalent à la recopie du fichier appelé à la place de l instruction d inclusion
QUELLE LIBRAIRIES UTILISÉES PAR TOUTE L APPLICATION? Un fichier par librairie!
Librairies Connexion, requêtes MySQL Authentification et gestion de l identité Affichage des éléments de la page : titre, menu, footer, etc...
CRÉEZ LES LIBRAIRIES Et incluez les au bon endroit.