Upload
others
View
9
Download
0
Embed Size (px)
Citation preview
PHPetPostgreSQL(cours2)
M2G2M,Univ.Paris8parIsisTRUCK
Inspirédediversessourcescomme
http://php.net/manual/fr/http://www.wikipedia.fr
Introduction(1)• PostgreSQL(abrégéPGSQL)estunSGBD(qu’est-cequec’est?)relationnel
etobjet
• Versionactuelle:9.3
• Outillibre,souslicenceBSD
• Objetcar– PostgreSQLpeutstockerdavantagedetypesdedonnéesquelestypes
traditionnelsentier,caractères,etc.
– Possibilitédecréerdestypes,desfonctions,d’utiliserl'héritagedetype,etc.
• PostgreSQLestconformeàbeaucoupdenormesSQL(ANSISQL89,SQL92(SQL2),SQL99(SQL3),SQL:2003etSQL:2008)
• Ilfonctionnesurdiversesplates-formesmatériellesetsousdifférentssystèmesd'exploitation.
2
Introduction(2)
• PostgreSQLfonctionnesurMacOSX,Linux,Unix,BSD,etc.etmême,depuislaversion8.0,nativementsurWindows.AvantlaV8.0,ilfallaitunémulateur(commecygwin)pourfairefonctionnerPostgreSQLsurcesystèmed'exploitation.
• PostgreSQLestlargementreconnupoursoncomportementstable,prochedeOracle
• Possibilitésdeprogrammationétendues,directementdanslemoteurdelabasededonnées,viaPL/pgSQL.
• Letraitementinternedesdonnéespeutaussiêtrecoupléàd'autresmodulesexternescompilésdansd'autreslangages(cf.notamment«Outilsconnexes»,plusloin)
3
Interfaces• Ilexisteplusieursinterfacesutilisateurspourmanierdes
basesdedonnéesPGSQL:– psqlestuneinterfaceenlignedecommandepermettantlasaisiederequêtesSQL,directementouparl'utilisationdeprocéduresstockées.
– pgAdminestunoutild'administrationgraphiquepourPostgreSQL
– phpPgAdminestuneinterfacewebd’administrationpourPostgreSQL:• écriteenPHP• supportelesdifférentesbranches(qu’est-cequec’est?)dePostgreSQLdepuislaV7
• interfaces'appuiesurdesscriptsPHPetsurlabasededonnéesPostgreSQLpourfavoriserlesdiversestâchesd'administrationvialeWeb.
4
Outilsconnexes(extensions)
• Ilexisteplusieursoutils,connexesàPGSQL.• Parmieux,onnoteralemodulespatialPostGISquipermetd’étendreleSGBD(RetO)PGSQLàunSGBDspatial:– Eneffet,PostGISestconformeàlanormeOGC(OpenGeospatialConsortium)etcodelesdonnéesspatialessousformegéométrique(points,lignes,polygones)
– PGSQL,avecceplugin,devientdoncinterfaçableaveclesSIG
5
RappelsBD• modèlededonnéesrelationnelestfondésurlanotionderelation• chaqueenregistrementd'unetablecontientungrouped'informationsrelativesàunsujetetlesdifférents
sujetssontconnexes• Lesliensexistantsentrelesinformationssontstockésdansleschampsdesenregistrementssousforme
decléprimaireetcléétrangère.• Cléprimaire:champoucolonne(contrainte,enfait)permettantdedistinguerdefaçonuniqueles
élémentsdelatable• Cléétrangère:champoucolonne(contrainte)quigarantitl'intégritéréférentielleentredeuxtables.
– Unecléétrangèreidentifieunecolonne(ouunensembledecolonnes)d'unetablecommeréférençantunecolonne(ouunensembledecolonnes)d'uneautretable(i.e.latableréférencée)
– Lescolonnesdelatableréférencéedoiventfairepartied'unecontraintedecléprimaire(oudecontrainted’unicité)– Lacontraintedecléétrangèregarantitquelesvaleursdechaquelignedelatableréférençantexistentdanslatable
référencée:ainsiunelignedelatableréférençantnepeutpascontenirunensembledevaleursquin'existepasdanslatableréférencée.
• Lesopérationsd'algèbrerelationnelletellesquel'intersection,lajointureouleproduitcartésien(UNION,INTERSECT,JOIN,OUTERJOIN…,CROSSJOIN,INNERJOIN)sontutiliséespourfairedesrapprochementsentrelesenregistrementsetcréerdenouvellesrelationsàpartirdesrelationsenregistréesdanslabasededonnées
6
PostgreSQL:Fonctionnement
• PgSQL:modeclient/serveur:– Serveur:processusappelépostmasterqui
• gèrelesfichiersdelabasededonnées,• acceptelesconnexionsàlabasedelapartdesapplicationsclientes• effectuelesrequêtes(actions)desclients
– Client:applicationdesutilisateursquimanipulentlabasededonnées.Unclientpeutêtre:• unoutiltexte,• uneapplicationgraphique,• unserveurwebquiaccèdeàlabasededonnéespourafficherdespagesweb
• unoutilspécialisédanslamaintenancedebasesdedonnées
7
PostgreSQL:schémas• Schémas:– Ils’agitd’unregroupementdetablesafindepermettreuneorganisationdeplusieurs«bases»dansunemêmeBD
– Parexemple,plusieursutilisateurssontsurlamêmeBDetregroupentleurstablesdansdesschémas,chacunayantson(ouses)schéma(s)
• Leresteestplus«classique»:tables,champs,etc.
8
ConnexionPHPóPostgreSQL(1)• PourutiliseruneBDPostgreSQL«surleWeb»,ilfaut
interfacerlaBDavecunlangageWeb(nousprendronsPHP)
• PourconnecterPHPàuneBDPostgreSQL,ilfaut,parexemple:– EasyPHP(plateformeWAMPsurunemêmemachine)aveclaplateformephpPgAdmin,parexemple;
– PostgreSQL(indispensableetdéjàinstalléensalleC210);– Depréférence,lesobjetsPDO_PGSQL(pourpermettrel’interfacePGSQLóPHPviadesobjetsgérantnotammentleserreurs)
• Ainsi,enconservantEasyPHP(installéensalleC210),onpourraintégrerdesrequêtesPostgreSQLàducodePHP
9
ConnexionPHPóPostgreSQL(2)• EasyPHP?
– uneplateformededéveloppementWeb– faitfonctionnerlocalement(sansconnexionàunserveurexterne)des
scriptsPHP– environnementcomprenant:
• deuxserveurs(unserveurwebApacheetunserveurdebasesdedonnéesMySQL),• uninterpréteurdescriptPHP,• uneadministrationSQLphpMyAdmin
– disposed'uneinterfaced'administrationpermettantdegérerlesalias(dossiersvirtuelsdisponiblessousApache),etledémarrage/arrêtdesserveurs
– permetdoncd'installerenuneseulefoistoutlenécessaireaudéveloppementlocalduPHP.Pardéfaut,leserveurApachecréeunnomdedomainevirtuel(enlocal)127.0.0.1oulocalhost.
– Enchoisissant«Weblocal»danslemenud'EasyPHP,lenavigateurs'ouvresurl’URL127.0.0.1etaffichelapageindex.phpdecesitequicorrespondenfaitaucontenududossierwwwd'EasyPHP.
10
ConnexionPHPóPostgreSQL(3)• IlsetrouvequelespostesdelaC210comportentunedesdernières
versionsd’EasyPHP• IlresteàinstallercorrectementphpPgAdmin(carc’estphpMyAdmin–
interfaceavecMySQL–quiestinstallépardéfaut)• NotaBene:phpPgAdminn’estpasindispensable,dèslorsquel’ona
déjàpsqloupgAdmin(normalementinstallésavecpostgreSQL),maisilestintéressantdevoirplusieursinterfacesd’administration
• Desexplicationsclairesicipourl’installationdephpPgAdmin:http://dgriessinger.developpez.com/postgresql/easyphp-phppgadmin/
• IlfautensuiteactiverPGSQLainsiquel’extensionPDOpourPGSQLdanslefichierphp.ini(souslerépertoireEasyPHP):ilfautdécommenter(enretirantle;devant)dansphp.inilesdeuxlignessuivantes:– extension=php_pdo_pgsql.dll – extension=php_pgsql.dll
11
PDO_PGSQL(1)• PDO_PGSQLestunpilotequiimplémentel'interfacedePHP
DataObjects(PDO)pourautoriserl'accèsdePHPauxbasesdedonnéesPostgreSQL.
• IlfautspécifierleDataSourceName(DSN)pourseconnecteràunebasededonnéesPostgreSQL.LeDSNestcomposédes5élémentssuivants,délimitéspardesespacesoudespoints-virgules:
pgsql:host=localhost;port=5432;dbname=testdb;user=postgres;password=lemotdepasse
12
PDO_PGSQL(1)• PDO_PGSQLestunpilotequiimplémentel'interfacedePHP
DataObjects(PDO)pourautoriserl'accèsdePHPauxbasesdedonnéesPostgreSQL.
• IlfautspécifierleDataSourceName(DSN)pourseconnecteràunebasededonnéesPostgreSQL.LeDSNestcomposédes5élémentssuivants,délimitéspardesespacesoudespoints-virgules:
pgsql:host=localhost;port=5432;dbname=testdb;user=postgres;password=lemotdepasse
13
PortpourPostgreSQL
PDO_PGSQL(2)• Ilfauttoujourstestersilaconnexionaréussi• Onutilisetry(pouressayerlaconnexion)etcatch(pourattraper
l’éventuelleexception(erreur)quiauraitétélevée)• Exemple:
try { $db = new PDO("pgsql:host=localhost;port=5432;dbname=nomBase", "postgres", "motDePasse"); echo 'Connexion OK !!<br />';
} catch(PDOException $e) { $db = null; echo 'ERREUR Base de données: ' . $e->getMessage();
} if($db) { … // écrire la suite (les requêtes) ici }
14
RequêtessimplesavecPDO• Pourfaireunerequêtenedemandantpasderésultatvisuel
(UPDATE,DELETE…),utiliserPDO::exec() – public int PDO::exec(string $statement):exécute
unerequêteSQLetretournelenombredelignesaffectées
• Pourfaireunerequêtedontonaurabesoinuneseulefoisdansleprogramme,utiliserPDO::query() – exécuteunerequêteSQL,retourneunjeuderésultatsentant
qu'objetPDOStatement
• Pourfaireunerequêtedontonaurabesoinplusieursfois,utiliserlesrequêtespluscomplexesavecPDO::prepare etPDOStatement::execute
15
RequêtespluscomplexesavecPDO• Requêtesendeuxoutroistemps:
– Préparation:prepare – Association(impliciteouexplicite):bindValue,bindParam…– Exécution:execute
• Exemples– Exécuteunerequêtepréparéeavecdesvariablesliées<?php
/* Exécute une requête préparée en liant des variables PHP */ $calories = 150; $couleur = 'rouge'; $sth = $dbh->prepare('SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur '); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12); $sth->execute();
?>
16
Exemplesderequêtes(1)
– Exécuteunerequêtepréparéeavecuntableaudevaleurs(paramètresdenom)
<?php /* Exécute une requête préparée en passant un tableau de valeurs */ $calories = 150; $couleur = 'rouge'; $sth = $dbh->prepare('SELECT nom, couleur, calories FROM fruit
WHERE calories < :calories
AND couleur = :couleur'); $sth->execute(array(':calories' => $calories,
':couleur' => $couleur));
?>
17
Exemplesderequêtes(2)• Exécuteunerequêtepréparéeavecuntableaudevaleurs(marqueurs)
<?php /* Exécute une requête préparée en passant un tableau de valeurs */ $calories = 150; $couleur = 'rouge'; $sth = $dbh->prepare('SELECT nom, couleur,
calories FROM fruit WHERE calories < ? AND
couleur = ?'); $sth->execute(array($calories, $couleur));
?>
18
Exemplesderequêtes(3)• Exécuteunerequêtepréparéeavecdesmarqueursnommés<?php
/* Exécute une requête préparée en associant des variables PHP */ $calories = 150; $couleur = 'rouge'; $sth = $dbh->prepare('SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur'); $sth->bindValue(':calories', $calories, PDO::PARAM_INT); $sth->bindValue(':couleur', $couleur, PDO::PARAM_STR); $sth->execute();
?> • NB:bindParamlieunevariablePHPàunmarqueurnomméou
interrogatifcorrespondantdansunerequêteSQLutiliséepourpréparerlarequête.ContrairementàPDOStatement::bindValue(),lavariableestliéeentantqueréférenceetneseraévaluéequ'aumomentdel'appelàlafonctionPDOStatement::execute().
19
Récupérationdeslignesd’unerequête
• PDOStatement::fetch—Récupèrelalignesuivanted'unjeuderésultatsPDO
• PDOStatement::fetchAll—Retourneuntableaucontenanttoutesleslignesdujeud'enregistrements.OnpeutensuiteafficherleslignesdansuntableauHTML,etc.
• Exemple:<?php
$sth = $dbh->prepare("SELECT nom, couleur FROM fruit"); $sth->execute(); print("PDO::FETCH_OBJ: "); print("Retourne la ligne suivante en tant qu'objet anonyme ayant les noms de colonnes comme propriétés\n"); $result = $sth->fetch(PDO::FETCH_OBJ); print $result->NAME; print("\n");
?>
20
Pourplusd’efficacité
• Aprèsunerequête,onutiliselaméthodecloseCursorpourlibérerlaconnexion:– publicboolPDOStatement::closeCursor(void)– PDOStatement::closeCursor()libèrelaconnexionduserveur,permettantainsiàd'autresrequêtesSQLd'êtreexécutées,maisquittelarequête,permettantainsiqu'ellesoitdenouveauexécutée
21
RetoursurleNotaBeneduCMn°1• Utilitéd’utilisersespropresattributsdanslesnœudsHTML5:– Exemple:$qry = $db->prepare("select * from marque"); $qry->execute(); $rows = $qry->fetchAll(); foreach($rows as $row) {
$nom = trim($row['nom']); $lat = trim($row['latitude']); $lon = trim($row['longitude']); echo "<input type='radio' name='marque' data-lat='".$lat."' data-long='".$lon."' value='".$nom."'>".$nom."</input>"
}
22
RetoursurleNotaBeneduCMn°1• OnpeutainsirécupérerlesvaleursissuesdelarequêteSQL
dansJS(sansavoiràpasserdenouveauparPHP):– Exemple(suite):<?php $qry = $db->prepare("select * from marque"); $qry->execute(); $rows = $qry->fetchAll(); foreach($rows as $row) { // $nom = trim($row['nom']); ...
echo "<input type='radio' name='marque' data-lat='".$lat."' data-long='".$lon."' value='".$nom."'>".$nom."</input>"
} ?> <button onclick="myFunction()">Voir la latitude</button> <script> function myFunction() { v=document.querySelector("[name=marque]:checked").dataset.lat; console.log(v); } </script>
23
RetoursurleNotaBeneduCMn°1<?php $qry = $db->prepare("select * from marque"); $qry->execute(); $rows = $qry->fetchAll(); foreach($rows as $row) {// $nom = trim($row['nom']); ...
echo "<input type='radio' name='marque' data-lat='".$lat."' data-long='".$lon."' value='".$nom."'>".$nom."</input>"
} ?>
<button onclick="myFunction()">Voir la latitude</button> <script> function myFunction() { v=document.querySelector("[name=marque]:checked").dataset.lat;
console.log(v);
} </script>
24
data-xxxdevientdataset.xxx
permetdesélectionnerle1ernœuddenom«marque»dont
l’attributcheckedestvrai
RetoursurleNotaBeneduCMn°1
– Quefaitl’exempleprécédent?• Ilextraitd’unetable«marque»touteslesmarquesetleurlatitude/longitude• Cettelisteapparaîtsousformederadiobuttonsaveclatitudeetlongitudemasquées• Lorsqu’undesradiobuttonestsélectionné,laconsoleaffichelalatitudedelamarquecorrespondante(viaunbutton).• =>utilesil’onveutdessinerensuiteunecarteavecJavaScript,parexemple
25