Programmation Internet en PHP SIL module M12 Jean-Michel Ilié IUT Paris 5 - département informatique Partie II : Accès aux SGBD – cas de MYSQL
PLAN du cours Introduction : composants additionnelles aux langages (dont gestionnaires de bases de données) interface MYSQL
Composants de services associés à l'interpréteur PHP Extensions pour le langage, de type bibliothèque Intégré (dans le cœur du langage) : MYSQL (SGBD), DOM (XML), COM et DOT NET, NuSOAP, … Externe (type bibliothèque) DLL (Windows), SO (Unix) Extensions spécialisées (php_....dll) Création de ses propres composants. Chargement des composants Chargement dynamique à l’initialisation du serveur fichier de configuration voir PHP.ini dans le dossier apache. Chargement par défaut : exemple MYSQLI Chargement/déchargement dynamique à l’exécution (php sous Unix) Test de chargement des composants fonction du langage if (extension_loaded(‘mysqli’)) …
Quelques exemples de composants additionnels extension=php_mysqli.dll MYSQL optimisé ;extension=php_dba.dll BD type fichier ;extension=php_oracle.dll ORACLE (prévoir le client Oracle) ;extension=php_ldap.dll Interface LDAP identification ;extension=php_mcrypt.dll CRYPTAGE ;extension=php_snmp.dll Interface MAIL ;extension=php_sockets.dll Gestion de Sockets ;extension=php_w32api.dll Interface API WINDOWS (fenêtres …) ;extension=php_xmlrpc.dll Compléments XML ;extension=php_xsl.dll ;extension=php_zip.dll Accès aux fichier Zippés A ajouter ou à dé-commenter ( ; ) dans le fichier de configuration php.ni
Serveur MYSQL de bases de données MYSQL : serveur de base de données RELATIONNELLES Connection sécurisée nom, mot-de-passe, postes d’accès (% tout poste, localhost : le serveur courant seul) Sélection de base de données Fonction de requêtes SQL (éventuellement imbriquées) Fonctions ou requêtes SQL de gestion de la structure Gestion de bases de données avancées Contraintes d’intégrité, procédure stockées, trigger, … Compatibilité PL/SQL MSQLI : version MYSQL évoluée Logiciel libre comme PHP (cission avec les concepteurs de MYSQL) Syntaxe orientée objet Performance
Serveur MYSQL de bases de données (2) Pour des questions d'économie de liaison, le serveur gère toutes les données y compris les tables de résultats Serveur de bases de données base administrateur table des bases existantes, tables des sites pouvant se connecter au serveur tables des utilisateurs (dont root) et droits d'accès bases de données utilisateurs tables temporaires de résultats bd admin (mysql) bds utilisateur temporaire Le résultat d'une requête est souvent un entier qualifiant le résultat : une référence sur une table temporaire ou 0 si échec Des requêtes sont nécessaires pour obtenir les valeurs
Connexion à une base de données MySQL connexion = création d'un espace temporaire dans MySql (tables résultats) connect() Connection contextuelle à une page PHP pconnect() Connexion permanente (le même espace est réutilisé pour les pconnect des pages suivantes) Les connexions permanentes sont réservées aux accès multiples rapprochés Il faut penser à se déconnecter le plus rapidement possible.
Connexion à une base de données MySQL MYSQL * mysql_connect ($hostName, $userName, $password); //connexion temporaire // validité maximum : 1a page courante MYSQL * mysql_pconnect ($hostName, $userName, $password); //connexion permanente paramètres URL de la machine hôte ($hostName = adresseweb [:port [:socketEcouteSiUnix]]) nom utilisateur mot de passe retourne une référence pour la connexion ou 0 (type MYSQL*)
Exemple de connexion MySQL <?php $serveur="localhost"; $utilisateur="php"; $passe="php"; if (!($link = mysql_connect($serveur, $utilisateur, $passe))) {echo "erreur de connexion à $Serveur"; exit();} else {echo "base exploitable sous la référence $link"} ?>
Accès à une des bases de données définition de base de données courante pour une connexion mysql_select_db ($baseName [, $link]); //selection d'une base de données existante //après connexion paramètres nom de la base référence de connexion (par défaut : la dernière connectée) retourne une référence sur la base ou 0
Requêtes SQL paramètres Notion de ligne courante MYSQL * mysql_query ($query [, $link]); Notion de ligne courante dans une table résultat paramètres chaîne SQL de la requête (CREATE, SELECT, DELETE …) référence de connexion (optionnel) retourne une référence sur une table- résultat ou renvoie 0 (la référence sert de pointeur de ligne courante) $nb = mysql_num_rows (MYSQL *); //nombre de lignes dans la table résultat $nb = mysql_num_fields (MYSQL *); //nombre de colonnes dans la table résultat $enregT = mysql_fetch_array (MYSQL *); // rend un tableau associatif contenant la ligne courante // puis incrémente le pointeur de ligne $enregO = mysql_fetch_object ($res); //idem mais rend un objet Accès par $enregO->nomChps au lieu de l'accès indicé $enregT['nomChps']
Exemple de requête SQL Requête de sélection Table Personnes Requête de sélection (après connexion et sélection de base) ID (PRIMARY KEY) NOM EMAIL VILLE <?php $nomTable="Personnes"; $rech = "SELECT * from $nomTable WHERE NOM like '%$_GET['nom']%'"; if (!($res =mysql_query($rech, $link))) {exit(); } while ($enregT = mysql_fetch_array($res)) { echo "$enregT['NOM'], $enregT['EMAIL'], $enregT['VILLE']";} //while ($enreg = mysql_fetch_object($res)) { // echo "$enreg->NOM, $enreg->EMAIL, $enreg->VILLE";} ?>
Rappel : autres requêtes classiques CREATE, SELECT, DELETE Table Personnes ID(PRIMARY KEY)(automatic incrementation) NOM EMAIL VILLE A utiliser dans une requête msql_query <?php //... $nouvelleTab = "CREATE TABLE $tableName (NOM CHAR(255), EMAIL CHAR(255), VILLE CHAR(255), ID INT PRIMARY KEY AUTO_INCREMENT)"; $modif = "UPDATE $tableName SET EMAIL='$mail', VILLE='$ville', NOM=$nom" WHERE ID=$id" ; $suppr = "DELETE FRom tableName WHERE ID=$id" ; ?>
Gestion des contraintes d’intégrité Table Personnes Table Documents ID(PRIMARY KEY) NOM EMAIL VILLE NOM_DOC THEME DESC URL POSTEUR Exple à utiliser dans une requête msql_query <?php $nouvelleTab = 'ALTER TABLE Documents ADD CONSTRAINTS Fk_DocPost FOREIGN KEY (Posteur) REFERENCES Personnes(EMAIL) '; ?> !! Choisir des tables de types INNODB pour permettre les clés étrangères
Libération des ressources La libération des ressources est à faire dès que possible --> le site web n'a pas qu'un client !!! void mysql_free_result ($res); //libère la table temporaire référencée par $res void mysql_close ($link); //ferme une connexion au serveur impérativement
Informations sur la structure des bases $refListeB = mysql_list_dbs ($link, $expr); //liste de bases existantes $refListeT = mysql_list_tables ($link, $expr); //liste de tables dans la base courante $refListeC = mysql_list_fields ($link, $nomTable, $expr); // liste des champs // de la table $nomTable Paramètres : $link : identifiant de connexion (optionnel) $expr : expression régulière permettant une selection partielle (non documenté et optionnel) retourne une référence sur la table temporaire créée Puis accès standard aux données via la table aux données $nb = mysql_num_rows ($refListeB); //nb de lignes de la table = nb de base
Informations d'erreurs sur requêtes mysql_errno ([$link]); //numéro de l'erreur mysql_error ([$link]); //texte de l'erreur exit avec msg <?php $requete = mysql_query ($sql_req, db_link) or die (mysql_error()); ?> <?php $link = mysql_connect($hostName, $userName, $password); if (!($listOfDbs = mysql_list_dbs($link))) {printf("erreur:%d %s", mysql_errno($link), mysql_error($link))); exit();} ?>
Exercices Connaissance d'un environnement de gestion MySQL Accès PHP à la structure d'une base Script PHP de création automatique d'une base Conception d’une interface d’interrogation en PHP.
Application Gestion d'un carnet d'adresse Table carnetAdresse (base PHP) ID (PRIMARY KEY) NOM CIVILITE EMAIL VILLE DESCRIPTION TELEPHONE $creat = "CREATE TABLE $tab ( `ID` INT AUTO_INCREMENT , `NOM` VARCHAR(255) NOT NULL, `CIVILITE` ENUM(`Mr`, `Mme`, `Melle`) DEFAULT `Mr`, `EMAIL` VARCHAR(255), `VILLE` VARCHAR(255), `DESCRIPTION` VARCHAR(255), `TELEPHONE` VARCHAR(255), PRIMARY KEY(`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1"; Actions sur la table Ajouter un enregistrement Rechercher un enregistrement modifier Détruire