php et postgresql (cours 2)

25
PHP et PostgreSQL (cours 2) M2 G2M, Univ. Paris 8 par Isis TRUCK Inspiré de diverses sources comme http://php.net/manual/fr/ http://www.wikipedia.fr

Upload: others

Post on 25-Jun-2022

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PHP et PostgreSQL (cours 2)

PHPetPostgreSQL(cours2)

M2G2M,Univ.Paris8parIsisTRUCK

Inspirédediversessourcescomme

http://php.net/manual/fr/http://www.wikipedia.fr

Page 2: PHP et PostgreSQL (cours 2)

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

Page 3: PHP et PostgreSQL (cours 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

Page 4: PHP et PostgreSQL (cours 2)

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

Page 5: PHP et PostgreSQL (cours 2)

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

Page 6: PHP et PostgreSQL (cours 2)

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

Page 7: PHP et PostgreSQL (cours 2)

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

Page 8: PHP et PostgreSQL (cours 2)

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

Page 9: PHP et PostgreSQL (cours 2)

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

Page 10: PHP et PostgreSQL (cours 2)

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

Page 11: PHP et PostgreSQL (cours 2)

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

Page 12: PHP et PostgreSQL (cours 2)

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

Page 13: PHP et PostgreSQL (cours 2)

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

Page 14: PHP et PostgreSQL (cours 2)

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

Page 15: PHP et PostgreSQL (cours 2)

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

Page 16: PHP et PostgreSQL (cours 2)

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

Page 17: PHP et PostgreSQL (cours 2)

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

Page 18: PHP et PostgreSQL (cours 2)

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

Page 19: PHP et PostgreSQL (cours 2)

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

Page 20: PHP et PostgreSQL (cours 2)

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

Page 21: PHP et PostgreSQL (cours 2)

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

Page 22: PHP et PostgreSQL (cours 2)

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

Page 23: PHP et PostgreSQL (cours 2)

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

Page 24: PHP et PostgreSQL (cours 2)

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

Page 25: PHP et PostgreSQL (cours 2)

RetoursurleNotaBeneduCMn°1

– Quefaitl’exempleprécédent?•  Ilextraitd’unetable«marque»touteslesmarquesetleurlatitude/longitude•  Cettelisteapparaîtsousformederadiobuttonsaveclatitudeetlongitudemasquées•  Lorsqu’undesradiobuttonestsélectionné,laconsoleaffichelalatitudedelamarquecorrespondante(viaunbutton).•  =>utilesil’onveutdessinerensuiteunecarteavecJavaScript,parexemple

25