PHP - MYSQL. https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/presentation-desbases-de-donnees-2

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

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

CREATION WEB DYNAMIQUE

PHP. PHP et bases de données

Pratique et administration des systèmes

PDO : PHP Data Object 1/13

Les BASES de DONNEES dans WampServer

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)

OpenPaaS Le réseau social d'entreprise

PHP 4 PARTIE : BASE DE DONNEES

Olivier Mondet

Stockage du fichier dans une table mysql:

I. MySQL : Serveur et SGBD

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

Les bases de données

Bases de données élémentaires Maude Manouvrier

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

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

Encryptions, compression et partitionnement des données

Java DataBaseConnectivity

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

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

PHP et les Bases de données - Généralités

Configurer la supervision pour une base MS SQL Server Viadéis Services

Bases de Données relationnelles et leurs systèmes de Gestion

1. Base de données SQLite

1 Introduction et installation

Mysql avec EasyPhp. 1 er mars 2006

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Création et Gestion des tables

Bases de données relationnelles

Modélisation et Gestion des bases de données avec mysql workbench

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Objectifs du TP : Initiation à Access

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

TP Contraintes - Triggers

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

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

SYSTÈMES D INFORMATIONS

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Le langage SQL (première partie) c Olivier Caron

SQL Historique

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

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

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

Cours: Administration d'une Base de Données

Sommaire. I.1 : Alimentation à partir d un fichier Access (.mdb)...2

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

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

1 Position du problème

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Notes de cours : bases de données distribuées et repliquées

A QUOI SERVENT LES BASES DE DONNÉES?

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

Performance web. Mesurer. Analyser. Optimiser. Benjamin Lampérier - Benoît Goyheneche. RMLL Beauvais. 8 Juillet 2015

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Installation et Mise en œuvre de MySQL

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

Architecture de la plateforme SBC

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Projet 2. Gestion des services enseignants CENTRE D ENSEIGNEMENT ET DE RECHERCHE EN INFORMATIQUE. G r o u p e :

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

CREATION d UN SITE WEB (INTRODUCTION)

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

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

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

TP JAVASCRIPT OMI4 TP5 SRC

COURS 5 Mettre son site en ligne! Exporter son site avec WordPress Duplicator Installer un logiciel FTP Faire le suivi des visites de son site avec

UNIVERSITE DE CONSTANTINE 1 FACULTE DES SIENCES DE LA TECHNOLOGIE DEPARTEMENT D ELECTRONIQUE 3 ème année LMD ELECTRONIQUE MEDICALE

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

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

RÉALISATION D UN SITE DE RENCONTRE

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)

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

A QUOI SERVENT LES BASES DE DONNÉES?

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

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

CESI Bases de données

Bases de SQL. Hacks 1-6 CHAPITRE UN

Dossier I Découverte de Base d Open Office

Page Paragraphe Modification Mise en page du document Le bouton "Format de page" est maintenant "Page"

Programmation Web. Madalina Croitoru IUT Montpellier

Gestion de base de données

Exonet : sauvegarde automatisée d une base de données

Présentation du module Base de données spatio-temporelles

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Compétences Business Objects

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

La base de données XML exist. A. Belaïd

SQL MAP. Etude d un logiciel SQL Injection

Transcription:

PHP - MYSQL https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/presentation-desbases-de-donnees-2 http://php.net/manual/fr/langref.php Open Class Room SOMMAIRE Sommaire... 1 PHP - MySQL... 4 Rappels sur les base de données... 4 Présentation des SGBD... 4 Les différents SGBD... 4 Circulation de l information... 4 Exemple de requête SQL... 4 Présentation de phpmyadmin... 5 Utilisation du SGBD - phpmyadmin... 5 L interface phpmyadmin... 5 Les onglets de la zone centrale... 5 TP - test... 6 Connexion à la BD et print_r du contenu d une table... 7 Utilisation de la base de donnée en PHP... 7 Connexion à la BD : new PDO... 7 Code... 7 Explications... 7 Test... 8 Afficher le contenu d une table - 1 : query(), fetch(), print_r... 8 Exemple... 8 Explications... 8 Résultats... 9 Test... 9 Script ou fonction de connexion... 10 Paramètres de connexion... 10 $dsn : data source name... 10 $erreur : gestion des erreurs... 10 Connexion à la BD : création d un objet PDO... 10 Test... 10 Vocabulaire de Programmation orientée objet... 11 Classe... 11 Objet... 11 Méthode... 11 Exceptions... 11 Guides de style... 11 Gestion des requêtes... 12 Technique de programmation PDO et PDOStatement - $bdd, $requete, $reqsql... 12 Terminologie : $bdd - $reqsql - $requete - $ligne... 12 $bdd (PDO) query - prepare... 12 $requete (PDOStatement) - execute - fetch - closecurseur... 12 Synthèse... 12 Accès aux champs, gestion erreurs, order by, like, limit... 13 PHP MySQL page 1/25

Accéder aux champs... 13 Select attribut1, attribut2, Where, Order by... 13 Select like... 13 Select Order by, limit... 13 Test... 13 Requêtes variables : where realisateur =?... 14 Solution basique à éviter : risque XSS... 14 Solution avec requête préparée : where?, prepare et execute... 14 Remplacer les? par des :alias... 14 Test... 14 Déboguer : or die bdd->errorinfo()... 15 Créer le $bdd avec la gestion des erreurs (déjà vu)... 15 Exécuter la requête (query ou execute) «or die»... 15 Les limites du «or die» : confidentialité et user friendly... 15 Test... 15 Ajouter, modifier, supprimer des données dans une table... 16 Via phpmyadmin Afficher... 16 Via phpmyadmin SQL... 16 Via php - INSERT... 16 Via php DELETE... 16 Via php UPDATE... 17 Bons usages... 17 Test... 17 TD... 18 TP 1 - Création de la BD... 18 Créer la BD avec phpmyadmin correspondant au code suivant :... 18 Exporter le code de la BD créée (dump)... 18 TP 2 Connexion à la BD... 18 Installation... 18 Vérifier que ça marche!... 18 Tester des erreurs de connexion... 18 TP 3 Premier Select dans une BD... 19 Installation... 19 Vérifier que ça marche!... 19 Erreurs SQL... 19 TP 4 fonction de connexion... 19 Création de la fonction connexionbd($dbname)... 19 Test de la fonction... 19 TP 5 Premiers Select... 20 Créer la BD avec phpmyadmin... 20 Tester tous les codes... 20 TP 6 Select Variable... 20 Tester tous les codes... 20 TP 7 Insert Update Delete... 20 Tester tous les codes... 20 TP Blog... 21 Objectif... 21 Remarque... 22 Analyse de la BD... 22 Première analyse... 22 CSS... 22 Variante 1... 22 TP tchat... 23 Objectif... 23 Analyse de la BD... 23 Analyse du design... 23 1 er solution... 23 PHP MySQL page 2/25

Deuxième solution : 1 seul fichier... 23 Variante 1 : rafraichir les messages... 24 Variante 2 : monter et descendre dans les messages affichés... 24 TP modification d un film par son id... 25 Objectif... 25 Edition : janvier 2016 maj mars 2017 PHP MySQL page 3/25

PHP - MYSQL PHP-MySQL : https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/presentationdes-bases-de-donnees-2 Manuel de Référence du PHP : http://php.net/manual/fr/langref.php Manuel de Référence du SQL : http://www.w3schools.com/sql/ Rappels sur les base de données Présentation des SGBD Les différents SGBD SGBD = super tableur excel pour faire du développement MySQL, MariaDB, PostgreSQL, Oracle, SQL server, SQLite Circulation de l information Client ßà Serveur PHP ßà Serveur MySQL Exemple de requête SQL La question en langage naturel : Je voudrais les utilisateurs parisiens avec leurs identifiants, noms et prénoms. En SQL Select id, nom, prenom from utilisateurs where ville = Paris ; Stockage dans un tableau et BD Les données du SGBD sont stockées dans des tableaux. Table des utilisateurs : Id Nom Prenom Ville 1 Liaudet Bertrand Paris 2 Lerdof Rasmus Qeqertarsuaq Relation = tableau = table = classe = ensemble = collection Tuple = ligne du tableau = élément = enregistrement = individu = objet PHP MySQL page 4/25

Une case du tableau = donnée = valeur = information Attribut = colonne du tableau = caractéristique = propriété = champ BD = toutes les lignes de toutes les tables Présentation de phpmyadmin Utilisation du SGBD - phpmyadmin Un SGBD est un serveur : on ne peut l utiliser qu à travers un utilisateur client : Une console Un programme PHP phpmyadmin etc. phpmyadmin va permettre de créer une BD, de créer, modifier, supprimer des tables et des tuples dans la BD. De faire tous les select qu on veut dans la BD. L interface phpmyadmin phpmyadmin permet de voir ce qui se passe dans la BD. Icones phpmyamin et Home : ramène à la page d accueil? : documentation phpmyadmin sql : documentation MySQL double flèche : pour actualiser le panneau de navigation quand on a fait des modifications dans la zone centrale Colonne à gauche : panneau de navigation Elle affiche les BD : il en existe déjà (on n y touche pas!). On choisir : sélectionner une BD ou créer une BD. Pour chaque BD, on peut regarder ses tables, en créer, regarder les attributs, en créer, etc. L information détaillée apparaît dans la zone centrale. Zone centrale Elle affiche le détail des sélections effectuées et propose des onglets et des possibilités de création, modification, suppression, affichage. Elle permettra aussi de mettre des lignes dans les tables. Les onglets de la zone centrale Structure Pour montrer la structure de la BD et des tables. PHP MySQL page 5/25

SQL Pour écrire des requêtes SQL. Rechercher Pour faire des recherches dans la base facilement. Insérer Pour ajouter des lignes. Exporter Pour faire une sauvegarde de la base de données. On peut importer la structure de la BD sans les données, ou les deux. Importer Pour récupérer la sauvegarde. Opérations Surtout des opérations sur les tables. TP - test PHP_TESTBD_TP1_PHPMYADMIN PHP MySQL page 6/25

Connexion à la BD et print_r du contenu d une table Utilisation de la base de donnée en PHP 3 jeux de fonctions (API) permettent de se connecter à la BD et de l utiliser : mysql, mysqli et PDO : http://php.net/manual/fr/mysqlinfo.api.choosing.php Le jeu mysql est le plus ancien : mieux vaut l éviter. On peut utiliser mysqli ou PDO (PHP Data Object), et particulièrement PDO_MYSQL. L intérêt du PDO est que c est une interface d abstraction permettant l utilisation de n importe quelle BD. De plus elle est «orienté objet». On utilisera plutôt PDO_MYSQL http://php.net/manual/en/ref.pdo-mysql.php Connexion à la BD : new PDO Code <?php $host='localhost'; $sgbdname='mysql'; $username = 'root'; $password = 'root'; $dbname='monsupersite'; $charset='utf8'; // machine du serveur de SGBD // type de SGBD // nom du user qui se connecte au SGBD // password du user sur le SGBD // BD à laquelle on accede sur le SGBD // jeu de caractères utilisé // dsn : data source name : pour le new PDO // en dur on peut écrire : // $dsn = 'mysql:host=localhost;dbname=monsupersit;charset=utf8'; // mieux vaut passer par des variables : $dsn = $sgbdname.':host='.$host.';dbname='.$dbname.';charset='.$charset; // connexion à la BD : new PDO try { $bdd = new PDO($dsn, $username, $password); echo 'Connexion réussie à '.$host. ', '.$dbname. ', '.$username. ', '.$password; } catch (PDOException $e) { //echo 'Connexion échouée : '. $e->getmessage(); die ('Connexion échouée : '. $e->getmessage() ); }?> Explications On fait un new PDO avec trois paramètres Le PDO créé on l appelle $bdd : c est la connexion à la BD. http://php.net/manual/fr/pdo.construct.php PHP MySQL page 7/25

$dsn (data source name) : contient des infos sur le SGBD (mysql), le serveur (host, ici : localhost), le nom de la BD, le jeu de caractères utilisé (UTF8 pour que ce soit le plus générique). $username : nom de l utilisateur qui se connecte à la BD $password : password de l utilisateur qui se connecte à la BD On utilise des variables pour rendre le code générique On utilise des variables pour rendre le code plus générique : $host : la machine du serveur de SGBD, $sgbdname : le type de SGBD, $username : le nom de l utilisateur qui se connecte sur la BD, $password : le mot de passe de cet utilisateur, $dbnam : le nom de la BD à laquelle on accède sur le SGBD. Gestion des erreurs avec try catch La structure «try» «catch» est une structure de programmation objet pour gérer les erreurs. Le die permet d arrêter proprement l exécution de la page en cas d erreur. Test PHP_TESTBD_TP2_CONNEXION Afficher le contenu d une table - 1 : query(), fetch(), print_r Exemple // on écrit la requête $reqsql='select * FROM utilisateurs'; // on récupère le résultat $requete=$bdd->query($reqsql); echo '<pre>'; print_r($requete); echo '</pre>'; // on affiche le résultat ligne par ligne while($ligne=$requete->fetch()){ echo '<pre>'; print_r($ligne); echo '</pre>'; echo '<p> nombre d éléments de $ligne : '.sizeof($ligne). '</p>'; } // on libère les tables de la requête $requete->closecursor(); // pour finir le traitement Explications On écrit le select dans $reqsql On utilise la méthode (fonction) query de $bdd (->) en passant la $reqsql en paramètre. Le résultat est dans $requete : c est un objet complexe sur lequel on peut appliquer des méthodes (des fonctions) qui contient le tableau de données du select. On affiche ce qu on peut de la réponse : en l occurrence seule la requête s affiche. On passe les lignes de la réponse en revue avec la méthode fetch(). PHP MySQL page 8/25

Chaque $ligne retourné par le fetch est un tableau associatif : on peut faire un print_r de $ligne. On constate alors qu on a deux accès possible à chaque donnée : par le nom du champs (id par exemple) ou par un numéro (0 pour id) : il y a donc 2 fois plus d éléments que prévu dans chaque ligne Quand on a fini de travailler, on fait un closecursor, pour libérer les tables de la requête Résultats Test PDOStatement Object ( [querystring] => SELECT * FROM utilisateurs ) Array ( [id] => 1 [0] => 1 [nom] => Liaudet [1] => Liaudet [prenom] => Bertrand [2] => Bertrand [ville] => Paris [3] => Paris ) nombre d éléments de $ligne : 8 Array ( [id] => 2 [0] => 2 [nom] => Lerdof [1] => Lerdof [prenom] => Rasmus [2] => Rasmus [ville] => Qeqertarsuaq [3] => Qeqertarsuaq ) nombre d éléments de $ligne : 8) PHP_TESTBD_TP3_SELECT PHP MySQL page 9/25

Script ou fonction de connexion On va se doter d un script de connexion qui sera appelée au début du script principal. Il pourra être transformé en fonction en passant le nom de la BD en paramètre par exemple. Paramètres de connexion $host='localhost'; $sgbdname='mysql'; $username = 'root'; $password = 'root'; $dbname='cinema'; $charset='utf8'; $dsn : data source name $dsn = $sgbdname.':host='.$host.';dbname='.$dbname.';charset='.$charset; $erreur : gestion des erreurs $erreur = array(pdo::attr_errmode => PDO::ERRMODE_EXCEPTION); En ajoutant le paramètre $erreur tel qu il est là dans le new PDO, on aura des messages d erreurs du SGBD, par exemple si le SELECT est mal écrit. Syntaxe : PDO ::ATTR_ERRMODE et PDO::ERRMODE_EXCEPTION sont des constantes de classe définies dans la classe PDO. On a la syntaxe : array (clé =>valeur) qui permet de définir un couple clé-valeur dans le tableau. PDO ::ATTR_ERRMODE : http://php.net/manual/fr/pdo.constants.php PDO::ERRMODE_EXCEPTION : http://php.net/manual/fr/pdo.error-handling.php Connexion à la BD : création d un objet PDO Test $bdd = new PDO($dsn, $username, $password, $erreur); PHP_TESTBD_TP4_FONCTION_CONNEXION Ce test est à réaliser en TP. PHP MySQL page 10/25

Vocabulaire de Programmation orientée objet Classe Une classe, c est un type, comme un entier, un réel, un caractère, une string ou un booléen. En général, une classe correspond à l équivalent d un tableau associatif : elle contient plus couples de clé-valeur. Les différentes clés sont appelées «attribut». En plus, on associe des fonctions à une classe : on les appelle alors «méthode». Objet Un objet c est une variable de type Classe. Quand on crée un objet avec des valeurs pour les couples clé-valeur (pour les attributs), on dit qu on instancie un objet. Ca passe par la commande «new». Méthode Les méthodes sont des fonctions qui sont attachées à une classe. Elle ne se sont utilisables que par les objets de la classe. On écrit : objet->methode() pour appeler la méthode pour l objet en question : c est comme si on avait passé l objet en paramètre de la méthode. Exceptions En cas d erreur, en programmation objet on passe par des objets de classe Exception. Ca se fait avec un «try» «catch» try : on essaie d exécuter une suite d instruction catch : si la suite d instructions exécutée à générer une erreur sous la forme d une exception, on passe dans le bloc catch Le catch précise le nom de l objet exception qu on va traiter. On peut alors accéder à des informations par la méthode getmessage() par exemple. Guides de style https://fr.wikipedia.org/wiki/camelcase https://eilgin.github.io/php-the-right-way/#code_style_guide PHP MySQL page 11/25

Gestion des requêtes Technique de programmation PDO et PDOStatement - $bdd, $requete, $reqsql Pour manipuler la BD, on utilise principalement deux classes : PDO et PDOStatemenet Terminologie : $bdd - $reqsql - $requete - $ligne $bdd : un objet de la classe PDO sera appelé $bdd. C est en quelque sorte l objet qui permet l accès concret à la base de données, pour un utilisateur et une base de donnée. $reqsql : le texte de la requête sera mis dans un $reqsql. C est une simple chaine de caractères. Il ne doit pas être confondu avec le résultat de la requête : $requete. $requete : un objet de la classe PSOStatement sera appelé $requete (statement peut vouloir dire «requête». Cette $requete est un objet complexe qui contient à la fois le $reqsql et le résultat de la requête une fois celle-ci exécutée. $ligne : le résultat d un fetch() est une ligne : $ligne =$requete->fetch(). C est un tuple de la table résultant de la requête SQL. $bdd (PDO) query - prepare http://php.net/manual/fr/class.pdo.php PDO ne contient que des méthodes (il ne contient pas d attributs). Notons Particulièrement : query : renvoie un $requete auquel est associé le $reqsql passé en paramètre et le résultat de la requête (le résultat du Select) prêt à être fetché (prêt à être parcouru). prepare : renvoie un $requete auquel est associé le $reqsql passé en paramètre. La requête n a pas été exécutée. Elle peut contenir des variables. PDO contient aussi des méthodes propres à une BD comme la gestion des transactions : commit, rollback, etc., et d autres choses. $requete (PDOStatement) - execute - fetch - closecurseur http://php.net/manual/fr/class.pdostatement.php PDOStatement contient un attribut : la valeur du $ressql fourni en paramètre quand il a été créé. Il contient aussi des méthodes. Notons particulièrement : execute : permet d exécuter une une requête avec des variables. Il faut fournir en paramètre un tableau de valeurs pour les variables. fetch : permet de récupérer les lignes du résultat de la requête. closecurseur : permet de refaire un execute. Synthèse $bdd : PDO $requete : PDOStatement -> query($reqsql) : PDOStatement -> exectute() : bool -> prepare($reqsql) : PDOStatement -> fetch() : ligne -> closecursor() : bool PHP MySQL page 12/25

Accès aux champs, gestion erreurs, order by, like, limit Accéder aux champs $ligne est un tableau associatif. On peut donc écrire : echo '<p><strong> prenom nom </strong></p>'; while($ligne=$requete->fetch()){ echo '<p>'.$ligne[prenom]. ' '.$ligne[nom]. '</p>'; } Select attribut1, attribut2, Where, Order by $reqsql=' Select realistateur, titre, annee from films where realisateur = '\King Vidor\' order by annee '; // on precise 3 champs : realisateur, titre et annee // attention au \' // on trie par annee Select like $reqsql=' SELECT * FROM films WHERE realisateur like \'%manki%\' order by realisateur, annee '; // like % manki % : n importe quoi autour de manki // order by realisateur, annee : plusieurs realisateurs possibles // dans le resultat : j ordonne le résultat Select Order by, limit $reqsql=' Select realistateur, titre, annee from films where annee = 1960 order by annee limit 0, 10 ') ; // on prend les 10 premiers (de 1 à 10) // limit 10, 10 pour les 10 suivants // limite 20, 10 pour les 10 suivants, etc. Test PHP_TESTBD_TP5_SELECT_WHERE PHP MySQL page 13/25

Requêtes variables : where realisateur =? Objectif : mettre une variable dans une requête (par exemple, une information saisie par l utilisateur) Solution basique à éviter : risque XSS On pourrait mettre un $_GET dans la $reqsql : $reqsql='select where auteur=\''.$_get['realisateur']. '\'') ; A éviter!!! si le $_GET contient toto \' or \'a\'=\'a, le select renverra toute la table! Solution avec requête préparée : where?, prepare et execute $reqsql='select where realisateur =?; $requete=prepare($reqsql) $req->execute(array( $_GET['realisateur'] )); On sépare les arguments par des «,» dans le array Remplacer les? par des :alias Test Cette solution est la plus lisible et celle qu on va privilégier. $reqsql='select where realisateur= :realisateur; $req->execute(array( 'realisateur'=> $_GET['realisateur'] )); PHP_TESTBD_TP6_SELECT_VARIABLE 6 cas sont testés. Les principes des exercices sont présentés dans les exercices et affichés avec les résultats. PHP MySQL page 14/25

Déboguer : or die bdd->errorinfo() Créer le $bdd avec la gestion des erreurs (déjà vu) Pour afficher les détails d une erreur, on crée un $bdd avec la gestion des erreurs : $erreur = array(pdo::attr_errmode => PDO::ERRMODE_EXCEPTION); $bdd = new PDO($dsn, $username, $password, $erreur); Exécuter la requête (query ou execute) «or die» Pour avoir un message d erreur explicite sur le problème SQL, il faut ajouter un «or die» au query ou au execute. $requete=$bdd->query($reqsql) or die(print-r($bdd- >errorinfo())) ; ou $requete->execute(array( )) or die(print-r($bdd- >errorinfo())) ; Le «or die» est inutile avec une connexion en ERRMODE (ce qui est le cas avec notre fonction de connextion). http://php.net/manual/fr/pdo.errorinfo.php Les limites du «or die» : confidentialité et user friendly Test Le «or die» peut être pratique en phase de développement. En production, il met au jour des informations qui peuvent être confidentielles et n est pas userfriendly. http://www.alsacreations.com/tuto/lire/676-gestion-erreurs-mysql-php-or-die.html PHP_TESTBD_TP6_SELECT_VARIABLE TP 6 - Select GET sans faille like date v2 or die.html PHP MySQL page 15/25

Ajouter, modifier, supprimer des données dans une table Via phpmyadmin Afficher Interface graphique Via phpmyadmin SQL On peut entrer les commandes SQL : INSERT, UPDATE et DELETE. Le système propose un pré-remplissage des commandes. Via php - INSERT On peut entrer les commandes SQL : INSERT, UPDATE et DELETE. $reqsql=' INSERT INTO films (titre, realisateur, annee, langue, duree) VALUES (:titre, :realisateur, :annee, :langue, :duree) '; //exemple('l\'homme irrationnel','woody Allen','2015','1h35'); $requete=$bdd->prepare($reqsql) $resultat=$req-> execute(array( 'titre'=>$_get['titre'], 'realisateur'=>$_get['realisateur'], 'annee'=>$_get['annee'], 'langue'=>$_get['langue'], 'duree'=>$_get['duree'] )); // or die(print-r($bdd->errorinfo())) ; /* le or die est inutile avec la connexion en ERRMODE */ /* $resultat pour traiter les erreurs proprement, sans ERRMODE */ Via php DELETE $reqsql=' DELETE FROM films WHERE titre = :titre AND realisateur = :realisateur' ; $requete=$bdd->prepare($reqsql); $resultat=$requete->execute(array( 'titre'=>$_get['titre'], 'realisateur'=>$_get['realisateur'] )); // or die(print-r($bdd->errorinfo())) ; /* pour tester le résultat : 0 si pas de DELETE */ if($requete->rowcount() ){ // rowcount compte le nombre de delete echo '<br/>delete effectué '.$requete->rowcount(). ' fois'; } else { PHP MySQL page 16/25

} echo '<br/> Le DELETE a échoué'; rowcount permet de savoir combien de delete on été effectués. http://www.astuces-webmaster.ch/page/mysql-pdo ATTENTION au DELETE!! Attention au delete : quand une donnée est supprimée, on ne peut pas la récupérer si on est en mode validation (autocommit) ce qui est le plus fréquent! Il faut donc faire des vérifications, par exemple : if (!isset($_get['realisateur']) or!isset($_get['titre']) or $_GET['realisateur']=='' or $_GET['titre']=='') { echo '<br/> Vous n\'avez pas saisi tous les paramètres'; } Via php UPDATE $reqsql=' UPDATE films SET duree=:duree WHERE titre = :titre AND realisateur = :realisateur '; ATTENTION à l UPDATE!! Attention à l UPDATE : quand une donnée est modifiée, on ne peut pas la récupérer si on est en mode validation (autocommit) ce qui est le plus fréquent! Bons usages Test A la place de : 'titre'=>$_get['titre'] on aura 'titre'=>$titre Les variables $titre, $realisateur, etc. seront récupérées via un $_POST ou un $_GET. PHP_TESTBD_TP7_INSERT_UPDATE_DELETE PHP MySQL page 17/25

TD TP 1 - Création de la BD Créer la BD avec phpmyadmin correspondant au code suivant : DROP DATABASE IF EXISTS monsupersite; CREATE DATABASE monsupersite; USE monsupersite; CREATE TABLE Utilisateurs ( id int(11) primary key AUTO_INCREMENT, nom varchar(20) NOT NULL, prenom varchar(20) NOT NULL, ville varchar(20) NOT NULL ) ENGINE=InnoDB; Insert into utilisateurs values (NULL, 'Liaudet', 'Bertrand', 'Paris'); Insert into utilisateurs values (NULL, 'Lerdof', 'Rasmus', 'Qeqertarsuaq'); On crée la table des utilisateurs avec un id, le nom, le prenom et la ville. On utilise : nom, type, taille, index, A_I, moteur de stockage. Exporter le code de la BD créée (dump) Regarder le code exporté. Comparez-le avec le code d origine. TP 2 Connexion à la BD PHP_TESTBD_TP2_CONNEXION.ZIP Installation Charger le zip ci-dessus. Faite le TP1 : vous devez avoir charger la BD du TP 1. Vérifier que ça marche! Tester le fichier de connexion php. Vérifiez que ça marche : vous devez afficher : «connexion réussie». Si ça ne marche pas, vérifiez les paramètres de connexion et faites les modifications nécessaires. Le «username» et «password» posent peut-être un problème. Tester des erreurs de connexion Changez volontairement les paramètres de connexion un par un pour voir le message d erreur correspondant. PHP MySQL page 18/25

TP 3 Premier Select dans une BD PHP_TESTBD_TP3_SELECT.ZIP Installation Charger le zip ci-dessus. Faites le TP1 : vous devez avoir charger la BD du TP 1. Vérifier que ça marche! Tester le fichier TP_SELECT.php Vérifiez que ça marche. S il y a un problème de connexion, vérifiez les paramètres de connexion et faites les modifications nécessaires. Le «username» et «password» posent peut-être un problème. Erreurs SQL Remplacez le «from utilisateurs» de la requête par «from utilisateur» sans «s» à utilisateur. Regardez le message d erreur quand vous testez. Que constatez-vous? TP 4 fonction de connexion PHP_TESTBD_TP4_FONCTION_CONNEXION Création de la fonction connexionbd($dbname) Le TP n est pas fourni. C est à vous de le faire. Faites une copie du TP3 Créer un fichier avec une fonction de connexion en suivant les indications du cours (cherchez «script de connexion dans ce pdf) : function connexionbd($dbname){ A la fin, la fonction retourne un $bdd : return $bdd; Dans cette fonction, le new PDO utilise un paramètre $erreur $bdd = new PDO($dsn, $username, $password, $erreur); Modifier le fichier php du TP3 pour faire appel à cette fonction. Test de la fonction 1) Testez votre programme avec la fonction et vérifiez que ça marche. 2) Remplacez le «from utilisateurs» de la requête par «from utilisateur» sans «s» à utilisateur. PHP MySQL page 19/25

Regardez le message d erreur quand vous testez. 3) Laissez le remplacement précédent. Dans le fichier de connexion, remplacez $erreur = array(pdo::attr_errmode => etc. par $erreur = array() : // PDO::ATTR_ERRMODE => etc. Regardez le message d erreur quand vous testez. Quelle différence faites-vous par rapport au cas précédent? 4) Retirez les modifications et vérifiez que tout marche TP 5 Premiers Select Créer la BD avec phpmyadmin Fichier : cinema.sql Tester tous les codes Tester Select 1, Select 2 et Select 3. Regardez les codes. PHP_TESTBD_TP5_SELECT_WHERE TP 6 Select Variable Tester tous les codes On travaille avec la BD cinéma du TP 5 TP 1 à 6 Tester les codes pour montrer les failles XSS et la protection contre les failles XSS. PHP_TESTBD_TP6_SELECT_VARIABLE TP 7 Insert Update Delete Tester tous les codes On travaille avec la BD cinéma du TP 5 TP 1 à 3 : regardes les codes. 1. Ajoutez un film. Vérifiez qu il est bien présent dans la BD. 2. Supprimer le film que vous venez d ajouter. Vérifiez qu il est bien absent dans la BD. 3. Rajoutez un film. Vérifiez qu il est bien présent dans la BD. 4. Modifiez l année du film que vous venez de rajouter. Vérifiez que la modification a été faite dans la BD. PHP_TESTBD_TP6_SELECT_VARIABLE PHP MySQL page 20/25

TP Blog Objectif Faire un blog basique : des articles avec des commentaires sur les articles. Articles : Les articles ont un titre, un contenu et une date de création. On affiche ces trois informations. Le contenu est coupé à 200 caractères ( ). Vous pouvez utilisez la BD «BD_TPblog.sql» qui est fournie en ligne. L objectif est d afficher les 5 derniers articles et de permettre d accéder aux commentaires. Commentaires : Les commentaires ont un auteur, un contenu et une date de création. L objectif est d afficher tous les commentaires et de pouvoir revenir à la page des articles. PHP MySQL page 21/25

Remarque Coder son propre blog n a pas d intérêt. Mieux vaut utiliser un CMS comme Wordpress ou Dotclear. C est un TP pas un projet! Analyse de la BD Une table des articles : id, titre, contenu, date de création Une table des commentaires : id, id de l article du commentaire, auteur, contenu, date de création. Vous pouvez utilisez la BD «BD_TPblog.sql» qui est fournie en ligne. Première analyse CSS On veut quelque chose de très simple (pour que ça aille vite à réaliser!) Une page d accueil avec les 5 derniers articles raccourcis et la date de publication. On l appelera tp_blog.php. Chaque article permet d accéder à l article complet avec les commentaires. commentaires.php sera la page de l article complet avec les commentaires. La page permet de revenir à la page d accueil. Variante 1 On se dote d un fichier CSS pour faire un peu de mise en page. On affichera le nombre de commentaires avec les articles PHP MySQL page 22/25

TP tchat Objectif Un espace de tchat : Une zone de saisie de message avec l auteur et le message et un bouton de validation. En dessous, on affiche les messages reçus. Le formulaire de saisie est centré dans la page. On ne voit s afficher que les 10 derniers messages. Analyse de la BD Il faut une table avec les messages et les auteurs. Vous pouvez utilisez les BD «BD_TPtchat.sql» et fournies en ligne. «BD_TPtchat_rempli.sql» qui sont Analyse du design On se dote d un fichier css qui gère le centrage. 1 er solution On réalise ça avec deux fichiers : Le premier contient le formulaire de saisie et l affichage des messages. Le deuxième contient le traitement du message envoyé : son insertion dans la BD. Le fichier de traitement vérifiera au moins que les deux champs ont été saisis. Le fichier de traitement renvoie automatiquement sur le formulaire : fonction header : http://php.net/manual/fr/function.header.php http://www.commentcamarche.net/faq/878-redirection-php-redirect-header Rappels sur le header HTML http://www.alsacreations.com/astuce/lire/34-charset-iso-8859-1-iso-8859-15-utf-8-lequelchoisir.html http://www.alsacreations.com/article/lire/628-balises-meta.html#incontournables Deuxième solution : 1 seul fichier On va tout mettre dans le même fichier. PHP MySQL page 23/25

Il n y a pas de difficultés particulières : on fusionne les deux fichiers. Variante 1 : rafraichir les messages Imaginons qu on a effectivement deux utilisateurs qui communiquent sur le tchat. On peut simuler ça en ouvrant deux fenêtres. Le problème est quand l un écrit, l autre ne reçoit pas le message. Solution 1 : bouton d actualisation Ajouter un bouton d actualisation : quand on clique dessus, les nouveaux messages apparaissent. Solution 2 : javascript! La bonne solution serait d utiliser du javascript pour raffraichir automatiquement la page : Voir par exemple : https://openclassrooms.com/forum/sujet/raffraichisemnt-automatique-et-partiel-d-une-pageajax-17580 Variante 2 : monter et descendre dans les messages affichés On va se doter de 4 boutons supplémentaires : monter, descendre, haut, bas, qui permettent de circuler dans toute la conversation. On se dote de deux variables : $debut et $nbmessages qui vont intervenir dans le LIMIT du SELECT qui va chercher les messages à afficher : LIMIT '.$debut. ', '.$nbmessages On va faire circuler la variable $debut de page en page pour pouvoir monter ou descendre : avec un type hidden dans le formulaire des boutons de circulation. Si on veut aller en haut, le $debut vaut 0 Si on veut on veut monter, le $debut est décrémenté de $nbmessages (si on n est pas déjà en haut!) Si on veut on veut descendre, le $debut est incrémenté de $nbmessages (si on n est pas déjà en bas!) Si on veut aller en bas, le $debut vaut le nombre total de messages - $nbmessages (si on n est pas déjà en bas!) PHP MySQL page 24/25

TP modification d un film par son id Objectif On veut avoir une page qui permet de sélectionner un film par son id et de l afficher et qui permette aussi de modifier l année et d afficher la modification. On traitera le problème dans une seule page. Pistes pour la réalisation : Dans le formulaire, on mettra deux boutons de validation : un Rechercher et un Modifier. Avant l affichage du formulaire : on testera si le $_GET ou $_POST de Rechercher est setté pour faire le travail en conséquence (faire une recherche sur l id) on testera si le $_GET ou $_POST de Modifier est setté pour faire le travail en conséquence (faire un update si les informations nécessaires ont été entrées. On aura intérêt à afficher dans le formulaire le film en court de traitement. PHP MySQL page 25/25