28
41 Chapitre 3 Environnement MySQL/PHP Sommaire 3.1 Apports de MySQL et PHP ............................... 41 3.1.1 MySQL ...................................... 42 3.1.2 PHP ........................................ 44 3.2 Une premi` ere base MySQL ............................... 46 3.2.1 Cr´ eation d’une table ................................ 46 3.2.2 L’utilitaire mysql ................................. 47 3.2.3 L’interface phpMyAdmin ............................. 53 3.3 Acc` es ` a MySQL avec PHP ................................ 55 3.3.1 L’interface MySQL/PHP ............................. 56 3.3.2 Formulaires d’interrogation ............................ 61 3.3.3 Formulaires de mises ` a jour ............................ 63 Nous d´ ecrivons maintenant l’utilisation de MySQL et de PHP. Comme dans le chapitre pr´ ec´ edent, nous nous limiterons pour l’instant ` a une application tr` es simple, consistant ` a g´ erer sur le serveur une liste de films et ` a proposer aux utilisateurs de consulter une partie de ces films, s´ electionn´ es selon des crit` eres de recherche entr´ es dans un formulaire, et pr´ esent´ es dans un document HTML. Cette fonctionnalit ´ e est identique ` a celle que nous avons d´ evelopp´ ee (avec quelques efforts) dans le chapitre pr´ ec´ edent, sous la forme d’un programme C bas´ e sur l’interface CGI. En fait la programmation de sites web avec MySQL/PHP est une variante des techniques CGI. Dans les deux cas toute la complexit´ e est du c ˆ ot´ e du serveur, le client ne recevant que des documents HTML qu’il peut se contenter d’afficher. Dans les deux cas on combine des techniques de programmation (C ou PHP) et l’acc` es ` a des sources de donn ´ ees ext´ erieures au programme (un fichier texte dans notre exemple du chapitre pr´ ec´ edent ou une base MySQL dans tout ce qui suit). 3.1 Apports de MySQL et PHP Toute l’avantage de la combinaison MySQL/PHP par rapport ` a une solution CGI classique tient dans la puissance est la facilit´ e d’utilisation de ces outils. La comparaison entre les deux techniques montre que l’environnement MySQL/PHP nous permet de faire beaucoup mieux et beaucoup plus ! Il est en fait assez facile de se convaincre que l’approche adopt´ ee par le programme CGI du chapitre 2 souffre de nombreuses faiblesses et que beaucoup d’efforts seraient n´ ecessaires pour obtenir une application tenant la route. Les probl` emes d´ ecoulent en premier lieu de l’utilisation directe des fichiers texte : Rigidit´ e du format. Si vous regardez attentivement le fichier films.txt que nous avons utilis´ e dans le cha- pitre 2, vous constaterez que son format est tr` es contraint. Par exemple le titre du film consiste en un seul mot et toutes les caract´ eristiques des films sont connues pour tous les films. Si ces contraintes ne sont pas respect´ ees, le programme ne marche plus !

Environnement MySQL/PHP

Embed Size (px)

Citation preview

Page 1: Environnement MySQL/PHP

41

Chapitr e 3

Envir onnementMySQL/PHP

Sommaire

3.1 Apports deMySQL et PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.1.1 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.1.2 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.2 Une premierebaseMySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.2.1 Creationd’unetable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.2.2 L’utilitaire mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.2.3 L’interfacephpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3.3 Accesa MySQL avecPHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.3.1 L’interfaceMySQL/PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563.3.2 Formulairesd’interrogation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613.3.3 Formulairesdemisesa jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Nousdecrivonsmaintenantl’utilisation deMySQL etdePHP. Commedansle chapitreprecedent,nousnouslimiteronspour l’instant a uneapplicationtressimple,consistanta gerersur le serveuruneliste defilms et a proposerauxutilisateursdeconsulterunepartiedecesfilms, selectionnesselondescriteresderechercheentresdansun formulaire,et presentesdansun documentHTML.

Cettefonctionnalite est identiquea celle quenousavonsdeveloppee(avec quelquesefforts) danslechapitreprecedent,sousla formed’un programmeC basesurl’interfaceCGI. Enfait la programmationdesiteswebavecMySQL/PHPestunevariantedestechniquesCGI.Danslesdeuxcastoutela complexiteestdu cotedu serveur, le clientnerecevantquedesdocumentsHTML qu’il peutsecontenterd’afficher. Danslesdeuxcasoncombinedestechniquesdeprogrammation(C ouPHP)et l’accesadessourcesdedonneesexterieuresauprogramme(un fichier textedansnotreexempledu chapitreprecedentou unebaseMySQLdanstout cequi suit).

3.1 Apports de MySQL et PHP

Toutel’avantagede la combinaisonMySQL/PHPpar rapporta unesolutionCGI classiquetient dansla puissanceestla facilite d’utilisationdecesoutils.La comparaisonentrelesdeuxtechniquesmontrequel’environnementMySQL/PHPnouspermetdefairebeaucoupmieuxet beaucoupplus! Il estenfait assezfaciledeseconvaincrequel’approcheadopteeparle programmeCGI duchapitre2 souffre denombreusesfaiblessesetquebeaucoupd’effortsseraientnecessairespourobteniruneapplicationtenantla route.

Lesproblemesdecoulentenpremierlieu del’utilisation directedesfichierstexte:

Rigidit e du format. Si vousregardezattentivementle fichier films.txtquenousavonsutilise dansle cha-pitre2, vousconstaterezquesonformatesttrescontraint.Parexemplele titre dufilm consisteenunseulmot et touteslescaracteristiquesdesfilms sontconnuespour touslesfilms. Si cescontraintesnesontpasrespectees,le programmenemarcheplus!

Page 2: Environnement MySQL/PHP

42 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

Lourdeur d’accesaux donnees.En pratique,pourchaqueacces,memele plussimple,il faudraitecrireun programmequi ouvre le fichier, parcourtseslignes,effectuedestestsspecifiques,etc. Si ons’autorise(cequi estindispensable)plusieursmotspourun titre defilm, ou si on accepted’ignorer,parexemple,le prenomdumetteurenscene,il fautdefinir un formatcomplexe,difficile a analyser.

Manque de securite. Si toutprogrammeurpeutaccederdirectementauxfichiers,il estimpossibledega-rantir la securite et l’int egrite desdonnees.Tout devient possible,par exempleun programmequiouvrele fichier desfilms poury ecrirelescoursdela bourse...

Pasde controlede concurrence. Imaginonsquel’application permetted’insererde nouveauxfilms (ceque nous allons d’ailleurs faire dansce qui suit). Que va-t-il se passersi plusieursutilisateursaccedentsimultanementaumemefichier?

Touscesproblemessontreconnuscommeetanttresdifficiles a resoudre(essayezsi vousn’etespasconvaincus...).Il existe doncdeslogiciels specialisesqui prennenten charge tousles problemesd’accesaux donneesstockeesdansun ou plusieursfichiers,plus generalementappeleesbasesde donnees. CeslogicielssontlesSystemesdegestiondeBasesdeDonnees, (SGBD),etMySQL enestun representant.

3.1.1 MySQL

Le recoursa MySQL permetde masquerles detailscomplexeset fastidieuxli es a l’utilisation de fi-chiers.MySQL gerepourvouslesfichiersconstituantunebasededonnees,prendenchargelesfonction-nalitesde protectionet de securite et fournit un ensembled’interfacesde programmation(dont uneavecPHP)facilitantl’accesauxdonnees.

La complexite de logicielscommeMySQL estduea la diversite destechniquesmisesenœuvre,a lamultiplicite descomposantsintervenantdansleur architecture,et egalementaux differentstypesd’utili-sateurs(administrateurs,programmeurs,non informaticiens,...) qui sontconfrontes,a differentsniveaux,ausysteme.Au coursdecelivre nousaborderonscesdifferentsaspects,tousnevousetantd’ailleurspasutiles,en particuliersi votreobjectif n’est pasd’administrerunebaseMySQL. Pourl’instant, nousnouscontenteronsdedecrirel’essentiel,asavoir sonarchitectureet sescomposants.

MySQL consisteenun ensembledeprogrammesqui sontchargesdegereruneou plusieursbasesdedonnees,etqui fonctionnentselonunearchitectureclient/serveur(voir figure3.1).

de donnéesBase

Client

mysql

Client

Client

Client

mysqldump

mysqlimport

Apache/PHP

Serveur mysqld

Connexion

Connexion

Connexion

Connexion

FIG. 3.1– Serveuret clientsdeMySQL.

Le serveur mysqld. Le processusmysqldest le serveur de MySQL. Lui seul peut accederaux fichiersstockantlesdonneespourlire et ecriredesinformations.

Utilitair es. MySQL fournit toutunensembledeprogrammes,quenousappelleronsutilitair esparla suite,qui sontchargesdedialogueravecmysqld, par l’intermediaired’uneconnexion, pouraccompliruntypedetacheparticulier. Par exemplemysqldumppermetd’effectuerdessauvegardes,mysqlimportpeutimporterdesfichiersASCII dansunebase,etc.NousetudieronslesutilitairesdeMySQL dans

Page 3: Environnement MySQL/PHP

3.1. APPORTS DE MYSQL ET PHP 43

le chapitre8. Le client le plusutile estsimplementnomme mysql, et permetd’envoyer directementdescommandesauserveur.

La basede donneesestun ensemblede fichiersstockantles informationsselonun format propreaMySQL et qui peut– doit – resterinconnua l’utilisateur. Le serveurestle seulhabilite a lire/ecriredanscesfichiers,enfonctiondedemandeseffectueespardesclientsMySQL. Noterqu’il peuty avoir plusieursclientsaccedantsimultanementa unememebase.Le serveursechargedecoordonnercesacces.

LesclientsdeMySQL communiquentavecle serveurpoureffectuerdesrecherchesoudesmisesa jourdansla base.Cettecommunicationn’est paslimit eea desprocessussituessur la mememachine: il estpossibledes’adresserauserveurMySQL parun reseaucommel’Internet,memesi nousn’utiliseronspascettepossibilite.

Il estpossibledecreersoi-memesonpropreclientMySQL enutilisantdesoutilsdeprogrammationquisepresententsousla formed’un ensembledefonctions,habituellementdesigne par l’acronymeAPI pourApplicationProgrammingInterface. MySQL fournit uneAPI en langageC, a partir de laquelleplusieursautresont ete creees,dont une API en PHP. Commetous les autresclients de MySQL, un script PHPenassociationavecApachedoit etablir uneconnexion avec le serveurpourpouvoir dialogueravec lui etrechercherou mettrea jour desdonnees(figure3.1).

Basesde donneesrelationnelles

MySQL estun SGBD relationnel, commebeaucoupd’autresdontORACLE, SYBASE, SQL/Server,etc. Le point communde touscessystemesest de proposerune representationextremementsimple del’information sousformedetable. Voici unetablerelationnelleFilm, montrantlesquelquesfilms quenousavonsmanipulesjusqu’apresent.

titre annee nomMES prenomMES anneeNaissAlien 1979 Scott Ridley 1943Vertigo 1958 Hitchcock Alfred 1899Psychose 1960 Hitchcock Alfred 1899Kagemusha 1980 Kurosawa Akira 1910Volte-face 1997 Woo John 1946PulpFiction 1995 Tarantino QuentinTitanic 1997 Cameron James 1954Sacrifice 1986 Tarkovski Andrei 1932

Il y a quelquesdifferencesessentiellesentrecetterepresentationet le stockagedansun fichier. D’unepartlesinformationssontconformesaunedescriptionprecise.Ici la tables’appelleFilm, etellecomprendun ensembled’attributs commetitre, annee, etc.Une basede donneesestconstitueed’une ou plusieurstables,dont les descriptionssont connueset gereespar le serveur. Nous verronsqu’il est possible,viaun langagesimple,de specifier le format d’unetable,ainsiquele typedesattributset lescontraintesquis’appliquentauxdonneescomme,parexemple: il nedoit pasy avoir deuxfilmsavecle memetitre. Toutcequi concernela descriptiondesdonnees,etpaslesdonneeselles-memes,constituele schemadela basededonnees.

Si on regardemaintenantla representationdesdonnees,on constatequ’elle estbeaucoupplussoupleet puissantequele simplefichier quenousavionsutilise. Il estpossibled’introduiredescaracteresblancsdansles titres desfilms (voir ’Pulp Fiction’) ou de laisserunecellule de la tablevide si on ignoresoncontenu(commeparexemplel’anneedenaissancedeTarantino).

LesSGBDrelationnelsoffrent nonseulementunerepresentationsimpleet puissante,maisegalementun langage,SQL, pour interrogerou mettrea jour les donnees.SQL est incomparablementplus facile autiliser qu’un langagedeprogrammationclassiquecommele C. Voici parexemplecommenton demandela listedestitresdefilm parusapres1980.

SELECT titreFROM FilmWHERE annee >1980

Page 4: Environnement MySQL/PHP

44 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

Cetteapprocheesttressimplepuisqu’ellesecontented’indiquercequel’on veutobtenir, achargepourle SGBDdedeterminercommenton peutl’obtenir. SQL estun langagedeclaratif qui permetd’interrogerunebasesanssesoucierdela representationinternedesdonnees,deleur localisation,descheminsd’accesoudesalgorithmesnecessaires.A cetitre il s’adresseaunelargecommunauted’utilisateurspotentiels(passeulementdesinformaticiens)etconstitueundesatoutslesplusspectaculaires(et le plusconnu)desSGBDrelationnels.On peutl’utiliser de maniereinteractive, maisegalementen associationavec desinterfacesgraphiques,desoutils dereportingou, tresgeneralement,deslangagesdeprogrammation.

Ce dernieraspectest importanten pratiquecar SQL ne permetpasde faire de la programmationausenscourantdu termeet doit doncetreassocie avecun langagecommele C, ouPHP.

3.1.2 PHP

Le langagePHPaetecreeparRasmusLerdorfversla fin del’annee1994,poursesbesoinspersonnels.Commedansbeaucoupd’autrescas,la misea dispositiondu langagesur l’Internet esta l’origine desondeveloppementpar beaucoupd’autresutilisateursqui y ont vu un outil proprea satisfaire leursbesoins.Apresdiversesevolutions,PHPen est(depuisle mois de mai 2000)a saversion4, celle quenousutili-sons.Au momentou ce livre estecrit, l’ordre de grandeurdu nombrede sitesutilisantPHP(souventenassociationavecMySQL) estestime a2-3 millions etsembleenprogressionconstante.

Qu’est-cequePHP

PHPestun langagede programmation,tresprochedu langageC – dont il reprendl’essentielde lasyntaxe – et destine a etre integre dansdespagesHTML. Contrairementa d’autreslangages,PHP estexclusivementdedie a la productiondepagesHTML genereesdynamiquement.Voici unpremierexemple.

Exemple10 ExPHP1.php: PremierexemplePHP<HTML> <HEAD><TITLE>HTML avec PHP</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<H1>HTML + PHP</H1>

Nous sommes le <?php echo Date ("j/m/Y"); ?>

<P>

<?phpecho "Je suis $HTTP_USER_AGENTet je dialogue avec $SERVER_NAME.";

?>

</BODY></HTML>

Il s’agit d’un documentcontenantdu codeHTML classique,au seinduquelon a introduit descom-mandesencadreespar lesbalises�

?php et? � . Tout cequi setrouve entrecescommandesestenvoye aun interpreteurdu langagePHPintegre a Apache.Cetinterpreteurlit lesinstructionset lesexecute.

Ici on a deux occurrencesde codePHP (que l’on appellera � � scripts� � a partir de maintenant).Lapremierefait partiedela ligne suivante:

Nous sommes le�

?php echo Date ("j/m/Y"); ? �Le debut dela ligne estdu texte traite par le serveurApachecommedu HTML. Ensuiteon trouveune

instructionecho Date ("j/m/Y"); . La fonctionecho estl’ equivalentdu printf utilise enlangageC.Elle ecrit sur la sortiestandard,laquelleestdirectementtransmiseaunavigateurpar le serveurweb. DateestunefonctionPHPqui recuperela datecouranteet la metenformeselonunformatdonne(ici, la chaınej/m/Y qui corresponda jour, moiset anneesurquatrechiffres).

Page 5: Environnement MySQL/PHP

3.1. APPORTS DE MYSQL ET PHP 45

La syntaxe de PHPestrelativementsimple,et la plus grandepartiede la richessedu langageresidedanssesinnombrablesfonctions.Il existedesfonctionspourcreerdesimages,pourgenererdu PDF, pourlire ou ecriredansdesfichiers,et – cequi nousinteresseparticulierement– pour accedera desbasesdedonnees.

Remarque: Le langagePHPestintroduit progressivementa l’aide d’exemples.Si voussouhaitezavoirdesmaintenantun apercu completdu langage,reportez-vousa l’annexeC.

Le scriptExPHP1.phpillustreunautreaspectdu langage.Non seulementil s’integredirectementavecle langageHTML, mais toutesles variablesd’environnementdecrivant le contexte descommunicationsentrele navigateuret le serveurwebsontdirectementaccessiblessousformedevariablesPHP.

echo "Je suis $HTTP USERAGENT et je dialogue avec $SERVERNAME.";

Tousles nomsde variablede PHPdebutentpar un ’$’. L’exemplemontrequel’on disposeautoma-tiquementde toutesles variablesquenousavonsciteesau momentde la presentationde l’interfaceCGI(voir table 2.1, page35), entreautres,de HTTP USERAGENTqui donnele nom du navigateur, et deSERVERNAMEqui donnele nomduserveur. Vouspouvezremarquerquecesvariablespeuventetredirec-tementutiliseesdansunechaınedecaracteresdelimiteepar(”).

PHP estdu cote serveur

Il estessentield’etrebien conscientqu’un script PHPest execute par un interpreteurqui se trouvedu cote serveur. En celaPHPestcompletementdifferentd’un langagecommeJavaScriptqui s’executesur le navigateur. En general l’interpreteurPHPest integre a Apachesousforme de module,et le moded’executionestalorstressimple.Quandunfichieravecuneextension.php (ou .php3 pourlesanciennesversions)estdemande auserveurweb,cedernierle chargeenmemoireet y cherchetouslesscriptsPHPqu’il transmeta l’interpreteur. L’interpreteurexecutele script, ce qui a pour effet de produiredu codeHTML qui vient remplacerle script PHPdansle documentfinalementfourni au navigateur. Ce dernierrecoit doncdu HTML � � pur � � et nevoit jamaisla moindreinstructionPHP.

A titre d’exemple,voici le codeHTML produit par le fichier PHP precedent,tel que vous pouvezvous-memesle verifier sur notresite.Le resultatcorresponda uneexecutionsur la machineserveurcar-tier.cnam.fr, avecun navigateurNetscape(dont le nomestMozilla). LespartiesHTML sontinchangees,lesscriptsPHPont ete remplacesparle resultatdeleur execution.

<HTML> <HEAD><TITLE>HTML avec PHP</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<H1>HTML + PHP</H1>

Nous sommes le 20/09/2000<P>

Je suis Mozilla/4.72 [en] (X11; I; Linux 2.2.14 i686)et je dialogue avec cartier.cnam.fr.</BODY></HTML>

Le principeestdonctresprochedu CGI, avecdesameliorationsnotables:

1. onpeutmixerHTML et PHPdemanieretressouple;2. lesvariablesCGI ou autressontfourniesdirectementet sanseffort (compareravecle programmeC

duchapitreprecedent);3. enfinlesscriptssontexecutesdirectementauseind’Apache,cequi evited’avoir alancersystematiquement

unprogrammeCGI.

Page 6: Environnement MySQL/PHP

46 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

Accesa MySQL

Un desgrandsatoutsde PHPestsatresrichecollectiond’interfaces(API) avec tout un ensembledeSGBD. En particulier il estpossiblea partir d’un script PHPde seconnectera un serveur mysqldpourrecupererdesdonneesquel’on va ensuiteafficher dansdesdocumentsHTML. D’une certainemaniere,PHPpermetdefaired’Apacheun clientMySQL, cequi aboutita l’architecturedela figure3.2.

de donnéesBaseFichiers

PHP

requêtes

Internet document(s)

HTML

requêtesprogrammeserveur

Serveur mysqld

SQL

données(navigateur)

Site web avec scripts PHP et MySQL

Client HTTP

Prog. client

FIG. 3.2– Architectured’un sitewebavecMySQL/PHP

Il s’agit d’unearchitecturea trois composantes,chacunerealisantunedestrois tachesfondamentalesd’uneapplication.

1. le navigateurconstituel’interfacegraphiquedontle roleestdepermettrea l’utilisateurdevisualiseretd’interagiravecl’information;

2. MySQL estle serveurdedonnees;3. enfin l’ensembledesfichiersPHPcontenantle coded’extraction,traitementet miseen forme des

donneesest le serveurd’application, associe a Apachequi secharge de transferer les documentsproduitssurl’Internet.

Rienn’empeched’aller un tout petit peuplus loin et d’imaginerunearchitectureou les trois compo-santessontfranchementsepareesetdialoguentparl’intermediairedureseauInternet.Ici noussupposeronsquele serveurmysqldet Apachesontsur la mememachine,maisle passagea unesolutionreellementa

� � trois poles � � nepresentepas,ou peu,dedifferencedu point devuetechnique.

3.2 Une premierebaseMySQL

NousallonsmaintenantmettrecesprincipesenapplicationencreantunepremierebaseMySQL conte-nantnotrelistedefilms,etenaccedantacettebaseavecPHP. Pourl’instantnouspresentonslesdifferentescommandesd’unemanieresimpleet intuitiveavantd’y revenirplusendetail danslesprochainschapitres.

3.2.1 Creationd’une table

La premierebase,tres simple,est constituee d’une seuletable FilmSimple, avec les quelquesattri-butsdeja rencontresprecedemment.Pourcreerdestables,on utilise unepartiedeSQL dite � � LangagedeDefinitiondeDonnees� � (DDL) dontla commandeprincipaleestle CREATE TABLE.

CREATETABLE FilmSimple(titre VARCHAR(30),annee INTEGER,nomMESVARCHAR(30),prenomMES VARCHAR(30),anneeNaiss INTEGER);

Page 7: Environnement MySQL/PHP

3.2. UNE PREMIEREBASE MYSQL 47

La syntaxedu CREATETABLEsecomprendaisement.On indiquele nomdela table,qui serautilisepar la suitepouraccedera soncontenu,puis la liste desattributsavec leur type.Pourl’instant nousnousentenonsa quelquestypesdebase: INTEGER, quel’on peutabregeren INT , estun entier, et VARCHARestunechaınedecaracteresdelongueurvariable,pourlaquelleon specifiela longueurmaximale.

Remarque: On peututiliser indifferemmentles majusculeset lesminusculespour les mot-cle deSQL.De meme,lessautsde ligne, les tabulationset lesespacessuccessifsdansun ordreSQL equivalenta unseulespacepourl’interpreteuret peuventdoncetreutiliseslibrementpourclarifier la commande.

PourexecuterunecommandeSQL, il existe plusieurspossibilites,la plus generaleetantd’utiliser leclient mysqldont le role estprincipalementcelui d’un interpreteurde commande.C’est la solutionquenousadopteronsdansla plupartdescas.

Quandvousavezrecoursauxservicesd’un fournisseurd’accesadistance,cedernierproposegeneralementd’entrerdescommandespar l’intermediaired’une interfacewebd’administrationdebasesMySQL, php-MyAdmin. Cet outil est– a justetitre – trespopulaire,et fournit un environnementde travail graphique,doncplusconvivial quel’interpreteurdecommandesmysql.

Nousenvisageonssuccessivementlesdeuxsituations,mysqlet phpMyAdmin, danscequi suit.

3.2.2 L’utilitair e mysql

Si vousavezsuivi le processusd’installationet deconfigurationdecrit dansl’annexe A, vousdevriezdeja disposerd’un acces(nom et mot de passe)au client mysqlet d’une baseFilms. Voici un rappeldel’essentieldu processusdeconnexion.

Connexion

Voici toutd’abordcommentcreerunebasededonneeset un nouvel utilisateuravecl’utilitaire mysql.

% mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 6 to server version: 3.23.9

Type ’help’ for help.

mysql> CREATEDATABASEFilms;mysql>mysql> GRANTALL PRIVILEGES ON Films.* TO rigaux@localhost

IDENTIFIED BY ’mdprigaux’;mysql> exit

Le promptmysql � estceluidel’interpreteurdecommandesdeMySQL: nepasentrerdecommandesUnix a ceniveau,et reciproquement!

La commandeCREATE DATABASEcreeunebasede donneesFilms, autrementdit un espacedanslequelon va placeruneou plusieurstablescontenantlesdonneesde l’application.La commandeGRANTdefinit un utilisateurrigaux qui auratouslesdroits (ALL PRIVILEGES) pouraccedera cettebaseetmanipulersesdonnees.Onpeutalorsseconnectera la baseFilmssousle compterigaux avec:

% mysql -u rigaux -p FilmsL’option -p indiquequel’on veutentrerun mot depasse.mysqlaffichealorsun promptpassword:

Il estpossiblededonnerle motdepassedirectementapres-p dansla lignedecommandemaiscen’estpasunetresbonnehabitudea prendrequed’afficherenclair desmotsdepasse.

La meilleuremethodeconsistea stocker dansun fichier deconfigurationle compted’accesa MySQLet le motdepasse.Pourevitera l’utilisateur rigaux d’entrersystematiquementcesinformations,onpeut

Page 8: Environnement MySQL/PHP

48 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

ainsicreerun fichier .my.cnf dansle repertoire$HOME(sousUnix) ou C: (sousWindows),et y placerlesinformationssuivantes:

[client]user= rigauxpassword = mdprigaux

TouslesprogrammesclientsdeMySQL lisentcefichieretutiliserontcecompted’accespourseconnec-terauprogrammeserveurmysqld. La connexion a la baseFilmsdevientalorssimplement:

% mysql FilmsBien entendu,il fauts’assurerquele fichier .my.cnf n’estpaslisible par lesautresutilisateurs,cequi

estfacilesousUnix, et impossiblesousWindows. Nousrenvoyonsa l’annexe A pour plus dedetailssurl’utilisation desfichiersdeconfiguration.

Creationde la table

Onsupposemaintenantquel’utilisateurdisposed’unfichierdeconfiguration.Voici lasequencecompletedecommandespourcreerla tableFilmSimple.

% mysql

Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 10 to server version: 3.23.9

Type ’help’ for help.

mysql> USE Films;Database changedmysql> CREATETABLE FilmSimple

-> (titre VARCHAR(30),-> annee INTEGER,-> nomMES VARCHAR(30),-> prenomMES VARCHAR(30),-> anneeNaiss INTEGER-> );

Query OK, 0 rows affected (0.01 sec)mysql> exit

La commandeUSEFilms indiquequel’on s’appretea travailler sur la baseFilms (rappelonsqu’unserveur peut gerer plusieursbasesde donnees).On peut de maniere equivalente,donnerle nom de labasesur la ligne decommandedemysql. La commandeCREATETABLE, entreeligne a ligne,provoquel’affichagede-> tantqu’un point-virguleindiquantla fin dela commanden’estpasentreauclavier.

Remarque: Peut-onutiliser desaccentsdansles nomsde tableet d’attributs? La reponseestoui, dumoinssi MySQL a ete installeenprecisantquele jeudecaracteresautiliserestdutypeLatin. Il y aquandmemeun petit problemea prendreencompte: cesnomssontutilisespour interrogerla basededonnees,et tous les claviers ne disposentpasdescaracteresaccentues.Nousavonspris le parti de ne pasutiliserd’accentpourtout le codeinformatique.En revanchelesinformationsstockeesdansla basepourrontellescontenirdesaccents.A vousdejugerdu choixqui convient a votresituation.

La tableFilmSimpleestmaintenantcreee.Vouspouvezconsultersonschemaavecla commandeDESCet obtenirl’affichageci-dessous.Seulesles informationsField et Type nousinteressentpour l’instant(pourdesraisonsobscures,MySQL affiche int(11) aulieu deINTEGERdansla colonneType ...).

mysql> DESC FilmSimple;

Page 9: Environnement MySQL/PHP

3.2. UNE PREMIEREBASE MYSQL 49

+------------+-------------+------+ -----+ ----- ----+ ------ -+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+ -----+ ----- ----+ ------ -+| titre | varchar(30) | YES | | NULL | || annee | int(11) | YES | | NULL | || nomMES | varchar(30) | YES | | NULL | || prenomMES | varchar(30) | YES | | NULL | || anneeNaiss | int(11) | YES | | NULL | |+------------+-------------+------+ -----+ ----- ----+ ------ -+

Pourdesraisonsobscures,MySQL affiche int(11) aulieu deINTEGERdansla colonneType ....

Pourdetruireunetable,on disposedela commandeDROPTABLE.

mysql> DROPTABLE FilmSimple;Query OK, 0 rows affected (0.01 sec)

Il estassezfastidieuxd’entrerauclavier touteslescommandesdemysql, d’autantquetouteerreurdefrappeimpliquederecommencerla saisieaudebut.Unemeilleuresolutionestdecreerunfichiercontenantles commandeset de l’executer. Voici le fichier FilmSimple.sql (nousparleronsde script SQLa partir demaintenant).

Exemple11 FilmSimple.sql: Fichier decreationdela tableFilmSimple# Cr eation d’une table ’FilmSimple’

USE Films;

CREATE TABLE FilmSimple(titre VARCHAR(30),

annee INTEGER,nomMES VARCHAR(30),prenomMES VARCHAR(30),anneeNaiss INTEGER

);

Un scriptSQLpeutcontenirtoutunensembledecommandes,chacunedevantseterminerparun’;’. Icion s’assured’abordquela basecouranteestbienFilms, avecla commandeUSEFilms , avantd’executerla commandeCREATETABLE. Toutesleslignescommenc¸antpar’#’ sontdescommentaires.

On indiquea mysqlqu’il doit prendresescommandesdanscefichier aulieu del’entreestandarddelamanieresuivante:

% mysql�

FilmSimple.sqlLe ’ � ’ permetuneredirectiondel’entreestandard(pardefautlaconsoleutilisateur)versFilmSimple.sql.

Insertion dedonnees

NousavonsmaintenantunetableFilmSimpledanslaquellenouspouvonsinsererdesdonneesavec lacommandeSQL INSERT. Voici sasyntaxe:

INSERT INTO FilmSimple (titre, annee, nomMES, prenomMES)VALUES (’Pulp Fiction’, 1996, ’Quentin’, ’Tarantino’);

On indiquedoncla tabledanslaquelleon veutinsereruneligne,puisla listedesattributsauxquelsontvaaffecterunevaleur. Lesattributsqui n’apparaissentpas,comme,pourcetexemplel’anneedenaissancedu metteurensceneanneeNaiss , aurontunevaleurditeNULLsurlaquellenousreviendronsplustard.

La dernierepartiede la commandeINSERT estla liste desvaleurs,precedeedu mot-cle VALUES. Ildoit y avoir autantde valeursqued’attributs,et les chaınesde caracteresdoivent etreencadreespar desapostrophessimples(’), cequi permetd’y introduiredesblancs.

Page 10: Environnement MySQL/PHP

50 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

Remarque: MySQL accepteles apostrophesdoubles(”), maisce n’est pasconformea la normeSQLANSI. Il estpreferabledeprendrel’habituded’utiliser systematiquementlesapostrophessimples.

Voici l’executiondecettecommandeINSERT avecl’utilitaire mysql.

% mysql Films

Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 86 to server version: 3.23.9

Type ’help’ for help.

mysql> INSERT INTO FilmSimple-> (titre, annee, nomMES, prenomMES)-> VALUES (’Pulp Fiction’, 1996, ’Quentin’, ’Tarantino’);

Query OK, 1 row affected (0.16 sec)

La commandeINSERT est en fait rarementutilisee directement,car la syntaxe est assezlourde etsurtoutil n’y pasde controle sur les valeursdesattributs.Le plus souvent l’insertion de lignesdansunetablesefait avecl’une desdeuxmethodessuivantes.

Saisiedansune interface graphique. Cetyped’interfaceoffre uneaidea la saisie,permetdescontroles,et facilite la tachede l’utilisateur. Nousverronscommentcreerde telles interfacessousforme deformulairesHTML.

Chargement � � en masse� � a partir d’un fichier. Dansce casun programmelit les informationsdanslefichier contenantles donnees,et effectue repetitivementdes ordres INSERT pour chaquelignetrouvee.

MySQL fournit unecommandeassezpuissante,LOAD DATA, qui evitedansbeaucoupdecasd’avoira ecrireun programmespecifiquepourchargerdesfichiersdansunebase.Cettecommandeestcapabledelire denombreuxformatsdifferents.Nousreprenonsle fichierfilms.txtquenousavionsutilisepourillustrerla programmationCGI (voir page33)dontle contenuestrappeleci-dessous

Alien 1979 Scott Ridley 1943Vertigo 1958 Hitchcock Alfred 1899Psychose 1960 Hitchcock Alfred 1899Kagemusha 1980 Kurosawa Akira 1910Volte-face 1997 Woo John 1946Titanic 1997 Cameron James 1954Sacrifice 1986 Tarkovski Andrei 1932

Voici commenton utilise la commandeLOAD DATApour inserer en une seulefois le contenudefilms.txtdansla tableFilmSimple.

LOAD DATA LOCAL INFILE ’films.txt’INTO TABLE FilmSimpleFIELDS TERMINATEDBY ’ ’;

Voici quelquesexplicationssurlesoptionsutilisees:– l’option LOCALindiqueauserveurquele fichiersetrouvesurla machineduclientmysql. Pardefaut,

le serveurcherchele fichier sursapropremachine,dansle repertoirecontenantla basededonnees;– on donneici simplementle nom ’films.txt’, ce qui supposequele client mysqla ete lance dansle

repertoireou setrouvecefichier. Si cen’estpasle casil fautindiquerle chemind’accescomplet.– enfinil existedenombreusesoptionspourindiquerle formatdu fichier. Ici on indiquequ’uneligne

dansle fichiercorrespondaunelignedansla table,etquelesvaleursdesattributsdansle fichiersontsepareespardesblancs.

Page 11: Environnement MySQL/PHP

3.2. UNE PREMIEREBASE MYSQL 51

L’executionsousmysqldonnele resultatsuivant:

% mysqlWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 8 to server version: 3.23.9

Type ’help’ for help.

mysql> LOAD DATA LOCAL INFILE ’films.txt’-> INTO TABLE FilmSimple-> FIELDS TERMINATEDBY ’ ’;

Query OK, 7 rows affected (0.00 sec)Records: 7 Deleted: 0 Skipped: 0 Warnings: 0

Il s’agit d’un formatsimplemaisnotablementinsuffisant,commenousl’avonsdeja souligne. Il n’estpaspossibled’avoir desblancsdansle titre defilms, ou d’ignorerla valeurd’un attribut. Onnesauraitpaschargerla descriptiondufilm Pulp Fiction avecceformat.

HeureusementLOAD DATAsait traiterdesformatsdefichier beaucouppluscomplexes.Unedescrip-tion completedecettecommandeestdonneedansl’annexeB.

Interr ogationet modification

Le langageSQLproposelesquatreoperationsessentiellesdemanipulationdedonnees: insertion, des-truction, misea jour et recherche. Cesoperationssontcommunementdesigneespar le termede requetes.L’ensembledescommandespermettantd’effectuerces operationsest le Langage de Manipulation deDonnees, ou LMD, paroppositionauLangagedeDefinitiondeDonneesou LDD.

Nousavonsdeja vu la commandeINSERT qui effectuedesinsertions.Nousintroduisonsmaintenantlestrois autresoperationsencommenc¸antparla recherchequi estdeloin la pluscomplexe.Lesexemplesqui suivents’appuientsurla tableFilmSimplecontenantlesquelqueslignesinsereesprecedemment.

SELECT titre, anneeFROM FilmSimpleWHERE annee � 1980

Cepremierexemplenousmontrela structuredebased’unerechercheavecSQL,aveclestroisclausesSELECT, FROMet WHERE.

– FROMindiquela tabledanslaquelleon trouve les attributsutiles a la requete.Un attribut peutetre� � utile � � dedeuxmanieres(nonexclusives): (1) on souhaiteaffichersoncontenu(clauseSELECT,(2) il a unevaleurparticuliere(uneconstanteou la valeurd’un autreattribut) quel’on indiquedansla clauseWHERE.

– SELECTindiquela listedesattributsconstituantle resultat.– WHEREindiquelesconditionsquedoiventsatisfaireleslignesdela basepourfairepartieduresultat.

Remarque: sousUnix, une tablecommeFilmSimpleest stockeepar MySQL dansun fichier de nomFilmSimple. CommeUnix distinguelesmajusculeset lesminusculespour lesnomsdefichier, il fautab-solumentrespecterla cassedansle nomdestables,souspeined’obtenir le messageTable does notexist .

Cetterequetepeutetredirectementeffectueesousmysql, cequi donnele resultatsuivant.

mysql> SELECT titre, annee-> FROM FilmSimple-> WHERE annee > 1980;

+------------+-------+| titre | annee |

Page 12: Environnement MySQL/PHP

52 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

+------------+-------+| Volte-face | 1997 || Titanic | 1997 || Sacrifice | 1986 |+------------+-------+3 rows in set (0.00 sec)

N’oubliez pasle point-virgulepourfinir unecommande.La requeteSQL la plus simpleestcellequiaffichetoutela table,sansfairedeselection(doncsansclauseWHERE) etengardanttouslesattributs.Dansun tel cason peutsimplementutiliser le caractere’*’ pourdesignerla listedetouslesattributs.

mysql> SELECT * FROMFilmSimple;+------------+-------+-----------+- ------ ----+ ----- ------ -+| titre | annee | nomMES | prenomMES | anneeNaiss |+------------+-------+-----------+- ------ ----+ ----- ------ -+| Alien | 1979 | Scott | Ridley | 1943 || Vertigo | 1958 | Hitchcock | Alfred | 1899 || Psychose | 1960 | Hitchcock | Alfred | 1899 || Kagemusha | 1980 | Kurosawa | Akira | 1910 || Volte-face | 1997 | Woo | John | 1946 || Titanic | 1997 | Cameron | James | 1954 || Sacrifice | 1986 | Tarkovski | Andrei | 1932 |+------------+-------+-----------+- ------ ----+ ----- ------ -+7 rows in set (0.00 sec)

Lesrequeteslespluscomplexesquel’on puissefairea cestadesontcellesqui selectionnentdesfilmsselondescriterescomme � � Les films dont le titre estVertigo, ou dont le prenomdu metteuren sceneestJohn, ou qui sontparusdanslesannees90 � � . La clauseWHEREpermetla combinaisondecescriteresaveclesconnecteursAND, ORet l’utilisation eventuelledesparenthesespourlever lesambiguıtes.

mysql> SELECT titre, annee-> FROM FilmSimple-> WHEREtitre = ’Vertigo’-> OR prenomMES = ’Alfred’-> OR (annee >= 1990 AND annee < 2000);

+------------+-------+| titre | annee |+------------+-------+| Vertigo | 1958 || Psychose | 1960 || Volte-face | 1997 || Titanic | 1997 |+------------+-------+4 rows in set (0.00 sec)

Tantqu’il n’y a qu’unetablea interroger, l’utilisation deSQL s’avereextremementsimple.Le serveurfait tout le travail pournous: accederaufichier, lire leslignes,retenircellesqui satisfontlescriteres,satis-fairesimultanement(ou presque)lesdemandesdeplusieursutilisateurs,etc.Desqu’on interrogeunebaseavecplusieurstables,cequi estla situationnormale,lesrequetesSQL deviennentun peupluscomplexe.

Remarque: Commepour PHP, nousintroduisonsSQL au fur et a mesure.Les requetessur plusieurstables(jointures)sontpresenteesdansle chapitre4.1,page133.Lesrequetesd’agregationsontpresenteesdanscememechapitre,page147.Enfin le chapitre7 proposeun recapitulatifcompletsurle langage.

Les commandesde misea jour et de destructionsontdesvariantesdu SELECT. On utilise la memeclauseWHERE, en remplacant dansun casle SELECTpar UPDATE, et dansl’autre par DELETE. Voici

Page 13: Environnement MySQL/PHP

3.2. UNE PREMIEREBASE MYSQL 53

deuxexemples.

– Detruire touslesfilmsanterieurs a 1960.Le criteredeselectiondesfilms a detruireestexprimeparuneclauseWHERE.

DELETE FROMFilmSimple WHEREannee <= 1960

Les donneesdetruitessont vraiment perdues.Ceux qui auraientl’habitude d’un systeme gerantles transactionsdoivent garderen memoirequ’il n’y a pasde possibilite de retouren arriereavecrollback dansMySQL.

– Changer le nomde‘JohnWoo’ en’JusenWu’.Lacommandeestlegerementpluscomplexe.OnindiqueparunesuitedeSET attribut=valeurl’af fectationdenouvellesvaleursa certainsattributsdeslignesmodifiees.

UPDATEFilmSimple SET nomMES=’Wu’, prenomMES=’Yusen’WHEREnomMES= ’Woo’

Memeremarquequeprecedemment: toutesles lignessontmodifieessanspossibilite d’annulation.Unemanieredes’assurerquela partiedela tableaffecteeparunordreDELETEouUPDATEestbiencellequel’on viseestd’effectuerauprealablela requeteavecSELECTet la memeclauseWHERE.

Voici l’executionsousmysql.

mysql> DELETE FROMFilmSimple WHEREannee <= 1960;Query OK, 2 rows affected (0.01 sec)mysql>mysql> UPDATEFilmSimple SET nomMES=’Wu’, prenomMES=’Yusen’

-> WHEREnomMES= ’Woo’;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

Quelquescommandesutiles

Enfinmysqlfournit toutunensembledecommandespourinspecterlestables,donnerla listedestablesd’unebasededonnees,etc.Voici uneselectiondescommandeslesplusutiles.L’annexeB donneunelisteexhaustivedetouteslesfonctionnalitesdeMySQL.

– SELECT DATABASE(); C’estunepseudo-requeteSQL(il n’y apasde FROM) qui affichele nomdela basecourante.

– SELECT USER(); Idem,cettepseudo-requeteaffichele nomdel’utilisateur courant.– SHOWDATABASES;Affichela listedesbasesdedonnees.– SHOWTABLES; Affichela liste destablesdela basecourante.– SHOWCOLUMNSFROMNomTable; Affichela descriptiondeNomTable.

3.2.3 L’interface phpMyAdmin

phpMyAdminestun outil entierementecrit en PHPqui fournit uneinterfacesimpleet trescompletepouradministrerunebaseMySQL. La plupartdescommandesdel’utilitaire mysqlpeuvents’effectuerparl’intermediairedephpMyAdmin,lesoperationspossiblesdependantbiensur desdroitsdel’utilisateurquiseconnectea la base.Voici unelistedesprincipalespossibilites:

1. Creeretdetruiredesbasesdedonnees(sousle compteroot deMySQL).2. Creer, detruire,modifierla descriptiondestables.3. Consulterle contenudestables,modifiercertaineslignesou lesdetruire,etc.4. ExecuterdesrequetesSQL interactivement.

Page 14: Environnement MySQL/PHP

54 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

5. Charger desfichiers dansdestableset, reciproquement,recuperer le contenude tablesdansdesfichiersASCII.

Beaucoupdefournisseursd’accesutilisentcemodulepourpermettrela creation,modificationoumiseajour d’unebasededonneespersonnelleadistance,a l’aide d’un simplenavigateur. L’annexeA decrit l’ins-tallationdephpMyAdmin.Memes’il nedispensepascompletementdel’utilisation del’utilitaire mysql, ilpermetdefairebeaucoupd’operationssimplesdemaniereconviviale.

FIG. 3.3– La paged’accueildephpMyAdmin

La figure 3.3 montreunecopied’ecrande la paged’accueilde phpMyAdmin.L’ ecranestdivise endeuxparties.Sur la gaucheon voit toutesles basesde donneesgereespar le serveur (si vousaccedezausystemed’un fournisseurd’acces,vousneverrezcertainementquevotrebasepersonnelle).Nousavonsici,enpartantdu bas,la basetestautomatiquementcreeeparMySQL pour fairedesessais,la basemysqlquicontientlesinformationssurlesutilisateurs(voir chapitre8), la baseFilms quenousallonsutiliser tout aulongdecelivre,enfinunebasesimplifiee,FilmSQL, qui nousservirapournotrepresentationdeSQLdansle chapitre7.

Cettepartiegaucheresteafficheeenpermanence.La partiedroitepresentel’ensembledesoperationsdisponiblesenfonctiondu contexte. Initialement,si le comptedeconnexion utilise estroot , phpMyAd-min proposedeconsulterla situationdu serveuret desclientsMySQL.

En cliquantsurunedesbases,on obtientla liste destables,et touteuneliste d’actionsa effectuersurcettebase.La figure3.4montrecettesecondepage(noterqu’il s’agit d’un formulaireHTML).

Liste destables Le hautdela pageestconsacrea la listedestables.Ici onnevoit quela tableFilmSimplequenousvenonsdecreeravecmysql. Surcettetableon peuteffectuerlesoperationssuivantes.

1. Afficherdonnele contenudela table.

2. Selectionnerproposeunpetit formulairepermettantdeselectionnerunepartiedela table.

3. Inserer presenteun autreformulaire,cree dynamiquementpar phpMyAdmin,cettefois pourinsererdesdonneesdansla table.

Page 15: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 55

4. Proprietesdonnela descriptionde la table.Cetteoption donneaccesa uneautrepage,assezcomplete,qui permetdemodifierla tableenajoutantouensupprimantdesattributs.C’est la aussique l’on peut echangerdesdonneesentreune tableet un fichier ASCII. UneoptionInserer unfichier textedansla tablevouspermetdetransmettreunfichier (parexemplefilms.txt) quephpMyAdminutiliseradansunecommandeLOAD DATA INFILE .

5. Effacerdetruit la table(phpMyAdmindemandeconfirmation).

6. Videdetruit toutesleslignes.

Executionde commande La fenetreplacee en dessousde la liste destablespermetd’entrerdescom-mandesSQL directement.Pourcreer la tableFilmSimple, on peutcopier/collerdirectementla commandeCREATE TABLEdanscettefenetreet l’executer. De memeon peuteffectuerdesINSERT, desSELECT, et touteslescommandesquenousavonsvuesdansla sectionprecedente.Cettefenetreest,dansphpMyAdmin,la fonctionnalite la plusprochedel’utilitaire mysql.

Requetepar un exemple Ce lien donneaccesa un formulaireaidanta la constructionde requetesSQLcomplexes,sansconnaıtreSQL.

Schemade la base Cettepartiepermetdecreerunfichier contenanttouteslescommandesdecreationdela base,ainsi que,optionnellement,les ordresd’insertiondesdonneessousforme de commandesINSERT. En d’autrestermesvouspouvez faire unesauvegardecomplete,sousforme d’un fichierASCII. Enchoisissantl’option transmettre, le fichier esttransmisaunavigateur.

Creationd’une nouvelle table proposeun formulaire pour creer une nouvelle table. Avant le bouton� � Executer� � , il fautentrerle nomdela tableet le nombred’attributs.

L’utilisation dephpMyAdminestsimpleet s’apprendenpratiquant.Bien quecetoutil, enoffrant uneinterfacedesaisie,economisebeaucoupdefrappeauclavier, il s’averequandmemenecessaireal’usagedeconnaıtre lescommandesSQL pourcomprendrelesactionseffectueeset lesdifferentesoptionspossibles.Danstout cequi suit, nouscontinueronsa utiliser l’outil mysqlpourpresenterlescommandesdu langageSQL,sachantquel’ equivalentexistesousphpMyAdmin.

Si vous voulez comprendrede maniere approfondiecommentcet outil a ete realise, vous pouvezconsulterdirectementle codePHP de phpMyAdmin, librementdisponible.Il presentebeaucoupd’as-pectsinteressants,en particulier la gestiondeslangues,l’outil d’aide a la creationde requete,et le mo-dulepermettantdegenererdynamiquementlescommandesdecreationd’unebaseet desoncontenu.Lacomprehensiondu codedemandequandmemeunecertainepratique: attendezd’avoir acquisunebonneconnaissancedePHP.

3.3 Accesa MySQL avecPHP

Maintenantquenousdisposonsd’une baseMySQL, nouspouvonsaborderles outils d’accesa cettebasea partir descriptsPHP. Nousetudionssuccessivementdanscettesectionlesaspectssuivants:

L’interface fonctionnelleMySQL/PHP. Il s’agit d’un ensemblede fonctionsqui, pour l’essentiel,per-mettentdeseconnectera MySQL, d’executerdesrequetesSQL et derecupererle resultatquel’onpeutensuiteafficherdansun pageHTML.

Interr ogation a partir de formulair esHTML. Nousreprenonsl’exempledonnesousla formed’un pro-grammeCGI dansle chapitre2 et montronssonequivalentavecPHP. Beaucoupplussimple!

Insertions et misesa jour. Toujoursa partir de formulairesHTML, on peut creer desscriptsPHP quiinserentdenouvellesinformationsou modifientcellesqui existentdeja.

Enfinnousmontrons,enreprenantle codeproduitaucoursdecesetapesetenle reorganisant,commentl’utilisation defonctionspermetd’obtenirdesscriptspluslisibleset concis.

Page 16: Environnement MySQL/PHP

56 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

FIG. 3.4– ActionssurunebaseavecphpMyAdmin

3.3.1 L’interface MySQL/PHP

PHP communiqueavec MySQL par l’intermediaired’un ensemblede fonctionsqui permettentderecuperer, modifier, ou creer a peu pres toutesles informationsrelatives a unebasede donnees.Parmicesinformations,il faut compterbien entendule contenudestables,maisegalementleur description(leschemade la base).L’utilitaire phpMyAdmin utilise par exempleles fonctionspermettantd’obtenir leschemapourpresenteruneinterfaced’administration,generera la voleedesformulairesdesaisie,etc.

Le tableau3.1donnela listedesprincipalesfonctionsdel’API. Nousrenvoyonsa l’annexeD pourunelisteexhaustivedesfonctionsMySQL/PHP.

Voici maintenantcesfonctionsenaction.Le scriptsuivanteffectueunerecherchedetoutesles lignesdela tableFilmSimpleetaffichela listedesfilms dansunepageHTML.

Exemple12 ExMyPHP1.php: Accesa MySQLavecPHP<HTML><HEAD><TITLE>Connexion a MySQL</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<H1>Interrogation de la table FilmSimple</H1>

<?php

Page 17: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 57

Fonction Descriptionmysqlconnect PouretabliruneconnexionavecMySQL,pouruncompte

utilisateur, et un serveurdonnes.Renvoie unevaleurquipeutetreutiliseeensuitepourdialogueravecle serveur.

mysqlpconnect Idem, mais avec une connexion persistante (voir an-nexeD). Cettedeuxiemeversionestplusperformante.

mysqlselectdb Permetde se placer dansune basede donnees.C’estl’ equivalentdela commandeUSEbase sousmysql.

mysqlquery Pour executerune requete SQL. Renvoie une variablerepresentantle resultatdela requete.

mysqlfetch object Permetde recuperer une des lignes du resultat,et po-sitionne le curseursur la ligne suivante. La ligne estrepresenteesousformed’un objet(ungroupedevaleurs).

mysqlfetch row Permetde recuperer une des lignes du resultat,et po-sitionne le curseursur la ligne suivante. La ligne estrepresentee sousforme d’un tableau (une liste de va-leurs).

mysqlerror Renvoie le messagedela derniereerreurrencontree.

TAB. 3.1– Principalesfonctionsdel’API MySQL/PHP

require ("Connect.php");

$connexion = mysql_pconnect (SERVEUR, NOM, PASSE);

if (!$connexion){

echo "Desol e, connexion a " . SERVEUR. " impossible\n";exit;

}

if (!mysql_select_db (BASE, $connexion)){

echo "Desol e, acc es a la base " . BASE . " impossible\n";exit;

}

$resultat = mysql_query ("SELECT * FROMFilmSimple", $connexion);

if ($resultat){

while ($film = mysql_fetch_object ($resultat)){

echo "$film->titre, paru en $film->annee, r ealis e ". "par $film->prenomMES $film->nomMES.<BR>\n";

}}else{

echo "<B>Erreur dans l’ex ecution de la requ ete.</B><BR>";echo "<B>Message de MySQL :</B> " . mysql_error($connexion);

}?></BODY></HTML>

Nousallonscommentersoigneusementcecodequi estrepresentatifd’unebonnepartiedestechniques

Page 18: Environnement MySQL/PHP

58 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

necessairespour accedera unebaseMySQL et en extrairedesinformations.Le script proprementdit sereduita la partiecompriseentrelesbalises<?php et? � .

Inclusion de fichiers - Constantes

La premiereinstructionest

require ("Connect.php");

La commanderequire permetd’inclurele contenud’un fichierdansle script.Certainesinformationssontcommunesa beaucoupdescripts,et les repetersystematiquementesta la fois unepertedetempsetunegrossesourced’ennuile jour ou il fauteffectuerunemodificationdans� versionsdupliquees.Ici on aplace dansle fichier Connect.phpquelquesinformationsdebasesur le site: le nomdu serveur, le nomdela baseet le compted’accesa la base.

�?phpdefine (NOM,"adminFilms");define (PASSE, "mdpAdminFilms");define (SERVEUR, "localhost");define (BASE, "Films");

? �

La commandedefine permetde definir desconstantes, en fait dessymbolesqui correspondentadesvaleursqui ne peuvent etremodifiees.L’utilisation systematiquedesconstantes,definiesen un seulendroit(un fichier quel’on peutinserera la demande)garantitl’ evolutivite du site.Si le serveurdevientpar exemplemagellan et le nom de la baseMovies, il suffira de faire la modificationa un seulendroit.Accessoirement,l’utilisation de symbolessimplespermetde ne pasavoir a sesouvenir de valeursou detextesqui peuventetrecompliques.

Remarque: Il est tentantde donneruneextensionautreque .phpaux fichierscontenantles scripts.Lefichier Connect.phppar exemplepourrait etrenomme Connect.incpour bien indiquerqu’il estdestine aetreinclus. Attention cependant: il devient alorspossiblede consulterle contenudu fichier avec l’URLhttp://serveur/Connect.inc. L’extension.inc etantt inconnuedu programmeserveur, ce dernierchoisiraalorsdetransmettrele contenuenclair (en-tetetext/plain ) auclient.Celaseraittresregrettabledansle casdeConnect.phpqui contientun mot depasse.Un fichier d’extension.phpsera,lui, toujourssoumispar le programmeserveurau filtre de l’interpreteurPHPet soncontenun’est jamaisvisible par le clientweb.

Connexionau serveur

Doncnousdisposonsaveccerequire dessymbolesdeconstantesNOM, PASSE, BASEetSERVEUR1,soit touslesparametresnecessairesa la connexion aMySQL.

$connexion = mysql pconnect (SERVEUR, NOM, PASSE);

La fonction mysqlpconnectessaied’etablir uneconnexion avec le serveurmysqld. En casde succesunevaleurpositiveestrenvoyee,qui doit ensuiteetreutiliseepourdialogueravecle serveur. Encasd’echecmysqlpconnectafficheun messaged’erreuret renvoieunevaleurnulle.

Remarque: Si vousvoulezeviter queMySQL envoie un messageen casd’echeca la connexion, vouspouvezprefixer le nom de la fonction par ’@’. C’est a vousalorsde testersi la connexion estetablieet

1. L’utilisation desmajusculespourlesconstantesn’estpasuneobligation,maisfacilite la lecture.

Page 19: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 59

d’afficherun messageselonvospropresnormesdepresentation.

Avantdecontinuer, il fautverifier quela connexion estbienetablie.Pourcelaon peuttesterla valeurdela variable$connexion , et, le casecheant,afficherun messageet interromprele scriptavecexit .

if (!$connexion)�

echo "Desol e, connexion a " . SERVEUR. " impossible";exit;�

La commandeecho ecritsurla sortiestandard,laquelleesttransmiseparle serveurwebaunavigateur.En d’autrestermes,tout cequi estecrit avececho (ou la fonctionsimilaireprintf ) constituele (sous-)documentHTML resultatdel’executiondu script.

AvecPHP, toutevaleurnonnulle estconsidereecommevraie, le 0 ou la chaınevide etantinterpretescommefaux.Doncaulieu d’effectueruntestdecomparaison,onpeuttesterdirectementla valeurdela va-riable$connexion . Le testsimpleif ($connexion) donneunresultatinversedeif ($connexion== 0) .

En revanche,en inversantla valeurbooleennede $connexion avec l’operateurde negation(!), onobtientun testequivalent,et la notation,trescourante,if (! $connexion) . Doncle if estverifie si$connexion estfaux,cequi estle but recherche.

Le memeprincipeestapplique au resultatde la fonction mysqlselectdb qui renvoie, elle aussi,unevaleurpositive (doncvraie)si l’accesa la basereussit.D’ou le test:

if (!mysql select db (BASE, $connexion))

Touscestestssont importants.Il peut y avoir beaucoupde raisonspour qu’un serveur ne soit plusdisponible,ou qu’un comptede connexion ne soit plus valide,etc.Le fait de continuerle script,et doncd’effectuerdesrequetessansavoir deconnexion, menea desmessagesd’erreurassezdesagreables.Bienentendul’ ecrituresystematiquede testset demessagesalourdit le code: nousverronscommentecrirecegenredechoseune(seule)fois pourtoutesenutilisantdesfonctions.

Executionde la requete

Le momentestenfinvenud’effectuerunerequete! On utilise la fonctionmysqlquery.

$resultat = mysql query ("SELECT * FROMFilmSimple", $connexion);

Commed’habitude,cettefonctionrenvoieunevaleurpositivesi la fonctions’executecorrectement.Encasdeprobleme,erreurdesyntaxeparexemple,le bloc associeauelse estexecute.Il affichele messagefourni parMySQL via la fonctionmysqlerror.

echo "<B>Erreur dans l’ex ecution de la requ ete.</B><BR>";echo "<B>Message de MySQL:</B>" . mysql error();

Noterl’utilisation debalisesHTML dansleschaınesdecaracteres,ainsiquel’utilisation del’operateurdeconcatenationdechaınes,’.’.

Affichagedu r esultat

Si la requetereussit,il neresteplusqu’a recupererle resultat.Ici nousavonsa resoudreun problemeclassiqued’interactionentreune basede donneeset un langagede programmation.Le resultatest unensemble,arbitrairementgrand,delignesdansunetable,et le langagenedisposepasdestructurepratiquepour representercet ensemble.On peut pensera tout mettredansun tableaua deux dimensions(c’estd’ailleurs possibleavec PHP), mais se posealors un problemed’occupationmemoiresi le resultatestvraimentgrand(plusieursmegaoctetsparexemple).

La techniquehabituellementutiliseeestdeparcourirleslignesuneauneavecuncurseuretd’appliquerle traitementa chaqueligne individuellement.Celaevited’avoir a chargertout le resultatenmemetemps.

Page 20: Environnement MySQL/PHP

60 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

Ici on utilise unedesfonctionsfetch qui correspondenta l’implantation de cettenotion de curseurdansMySQL.

$film = mysql fetch object ($resultat);

La fonction mysqlfetch object prendune ligne dansle resultat(initialementon commenceavec lapremiere ligne) et positionnele curseursur la ligne suivante.Donc a chaqueappelon progressed’uneetapedansle parcoursdu resultat.Quandtoutesleslignesont ete parcourues,la fonctionrenvoie0.

Aveccettefonction,chaqueligne estrenvoyeesousla formed’un objet, quenousreferenconsaveclavariable$film dansl’exemple.Nousauronsl’occasionde revenir sur ceconcept,maispour l’instant ilsuffit deconsiderersimplementqu’un objetestun groupedevaleurs,chacuneetantidentifieeparun nomd’attribut.

Dansnotrecascesnomssontnaturellementlesnomsdesattributsde la tableFilmSimple. On accedea chaqueattribut avecl’operateur’- � ’. Donc$film- � titre estle titre du film, $film- � nomMESlenomdu metteurenscene,etc.

L’affectationdu resultatdemysqlfetch object a la variable$film envoie elle-memeunevaleur, quiest0 quandle resultata ete parcouruentotalite 2. D’ou la boucled’affichagedesfilms:

while ($film = mysql_fetch_object ($resultat)){

echo "$film->titre, paru en $film->annee, r ealis e ". "par $film->prenomMES $film->nomMES.<BR>\n";

}

Onpeutremarquer, dansl’instructionecho ci-dessus,l’introduction devariablesdirectementdansleschaınesdecaracteres.Autre remarqueimportante: on utilise deuxcommandesderetoura la ligne, �

BR�et \n . Ellesn’ont pasdu tout la memefonction,et il estinstructif dereflechirauroledechacune.

– la balise �BR� estinclusedansle documentHTML produit.Elle indiqueaunavigateurqu’un saut

delignedoit etreeffectueapresla presentationdechaquefilm ;

– le caractere \n indiquequ’un sautde ligne doit etreeffectueedansle texte HTML, et pasdanslapresentationdudocumentqu’enfait le navigateur. Ce\n n’a enfait aucuneffet surcettepresentationpuisquenousavonsvu quele formatagedutexteHTML peutetrequelconque.Enrevancheil permetderendrecetexte,produitautomatiquement,plusclair a lire si on doit y rechercheruneerreur.

Voici le texteHTML produitparle script,tel qu’onpeutle consulteravecla commandeView sourcedunavigateur. Si on n’avait pasmis un \n , touslesfilms seraientdisposessuruneseuleligne!

Exemple13 ResMYPHP1.html: Resultat(texteHTML) duscript<HTML><HEAD><TITLE>Connexion a MySQL</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<H1>Interrogation de la table FilmSimple</H1>

Alien, paru en 1979, r ealis e par Ridley Scott.<BR>Vertigo, paru en 1958, r ealis e par Alfred Hitchcock.<BR>Psychose, paru en 1960, r ealis e par Alfred Hitchcock.<BR>Kagemusha, paru en 1980, r ealis e par Akira Kurosawa.<BR>Volte-face, paru en 1997, r ealis e par John Woo.<BR>Titanic, paru en 1997, r ealis e par James Cameron.<BR>Sacrifice, paru en 1986, r ealis e par Andrei Tarkovski.<BR></BODY></HTML>

2. Voir l’annexe C et la partiesurlesexpressionspourplusd’explications.

Page 21: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 61

3.3.2 Formulair esd’interr ogation

UnedesforcesdePHPestsonintegrationnaturelleaveclesformulairesHTML. Plusbesoin,contrai-rementa cequenousavonsvu dansla partieconsacreea la programmationCGI, dedecrypterdeschaınesdecaracteresauformatcomplexe,puisqueleschampsdu formulairesontdirectementfournissousformedevariablePHP. Deplus,l’utilisation deSQLa la placed’un parcourslaborieuxdufichiernousdonnedescommandesa la fois beaucoupplussimpleset pluspuissantes.

Voici unevariantedu formulairequi nousavait permisde declencherun programmeCGI ecrit en C(exemple8). Vouspouvezle testerdirectementsurnotresite.

Exemple14 ExForm3.html: Le formulairedel’exemple8, avecscript PHP<HTML><HEAD>

<TITLE>Formulaire pour script PHP/MySQL</TITLE><LINK REL=stylesheet HREF=’films.css’ TYPE=’text/css’>

</HEAD><BODY>

<H1>Formulaire pour script PHP/MySQL</H1>

<FORMACTION="ExMyPHP2.php" METHOD=POST>

Ce formulaire vous permet d’indiquer des param etres pourla recherche de films :

<P>Titre : <INPUT TYPE=TEXT SIZE=20 NAME= ’titre’ VALUE=’%’><BR>Le caract ere ’%’ remplace n’importe quelle cha ıne.<P>Annee debut : <INPUT TYPE=TEXT SIZE=4 NAME=’anMin’ VALUE=1900>Annee fin : <INPUT TYPE=TEXT SIZE=4 NAME=’anMax’ VALUE=2100> <P>

<B>Comment combiner ces crit eres. </B>ET <INPUT TYPE=RADIO NAME=’comb’ VALUE=’ET’ CHECKED>OU <INPUT TYPE=RADIO NAME=’comb’ VALUE=’OU’> ?<P><INPUT TYPE=SUBMIT VALUE=’Rechercher’>

</FORM>

</BODY></HTML>

Il y a deuxdifferencesnotables.

1. aulieu d’appelerun programmeCGI, l’attribut ACTIONfait referencea un scriptPHP;2. moins visible, mais tout aussiimportant: on peut maintenantentrerdansle champtitre non

seulementun titre defilm complet,maisaussidestitrespartiels,completespar le caractere’%’ quisignifie,pourSQL,unechaınequelconque.

Donc on peut,par exemple,recherchertous les films commenc¸ant par ’Ver’ en entrant’Ver%’, outouslesfilms contenantun caractereblancavec ’% %’. Le fichier ci-dessousestle scriptPHPassocie auformulaireprecedent(acompareravecle programmeC duchapitre2!). Pourplusdeconcision,nousavonsomistouslestestsportantsurla connexion et l’executiondela requeteSQLqui peuvent– devraient– etrerepriscommedansl’exemple12.

Exemple15 ExMyPHP2.php: Le scriptassocie au formulairedel’exemple14<HTML><HEAD><TITLE>R esultat de l’interrogation par formulaire</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

Page 22: Environnement MySQL/PHP

62 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

<H1>Resultat de l’interrogation par formulaire</H1>

<?phprequire ("Connect.php");

echo "<B>Titre = $titre anMin = $anMin anMax=$anMax\n";echo "Combinaison logique : $comb<P></B>\n";

if ($comb == ’ET’)$requete = "SELECT * FROMFilmSimple "

. "WHEREtitre LIKE ’$titre’ "

. "AND annee BETWEEN$anMin and $anMax";else

$requete = "SELECT * FROMFilmSimple ". "WHEREtitre LIKE ’$titre’ ". "OR (annee BETWEEN$anMin and $anMax)";

$connexion = mysql_pconnect (SERVEUR, NOM, PASSE);mysql_select_db (BASE, $connexion);$resultat = mysql_query ($requete, $connexion);while ( ($film = mysql_fetch_object ($resultat)))

echo "$film->titre, paru en $film->annee, r ealis e ". "par $film->prenomMES $film->nomMES.<BR>\n";

?></BODY></HTML>

Les variables$titre , $anMin , $anMax et $comb sontdefiniesdesl’entreedu script.En testantla valeurde $comb, qui peut etre soit ’ET’, soit ’OU’, on determinequel est l’ordre SQL a effectuer.Cetordreutilise deuxcomparateurs,LIKE et BETWEEN. LIKE estun operateurdepatternmatching: ilrenvoie vrai si la variable$titre dePHPpeutetrerendueegalea l’attribut titre enremplacantdans$titre le caractere’%’ parn’importequellechaıne.

La requeteSQL estplaceedansunechaınedecaracteresqui estensuiteexecutee.

$requete = "SELECT * FROMFilmSimple ". "WHEREtitre LIKE ’$titre’ ". "AND annee BETWEEN$anMin and $anMax";

Dansl’instruction ci-dessus,on utilise la concatenationdechaınes(’.’) pourdisposerdemanierepluslisible lesdifferentespartiesdela requete.On exploiteensuitela capacitedePHPa reconnaıtre l’insertiondevariablesdansunechaıne(graceauprefixe$) et a remplacercesvariablesparleurvaleur. Ensupposantquel’on a saisiVertigo , 1980et 2000danscestrois champs,la variable$requete serala chaınedecaracteressuivante:

SELECT * FROMFilmSimple WHEREtitre LIKE ’Vertigo’AND annee BETWEEN1980 AND 2000

Il fauttoujoursencadrerunechaınedecaracterescomme$titre pardesapostrophessimples(’) carMySQL nesauraitpasfairela differenceentreVertigo et un attribut dela table.De pluscettechaınedecaracterespeuteventuellementcontenirdesblancs,cequi poseraitdesproblemes.Lesapostrophessimplessontacceptesauseind’unechaıneencadreepardesapostrophesdoubles,et reciproquement.

Remarque: Quesepasse-t-ilsi le titre du film contientlui memedesapostrophessimples,comme,parexemple,L’affiche rouge ? Et bienPHPprefixe par \ , pour les donneesprovenantde formulaires,tous les caracteresqui peuvent poserprobleme.La chaıne transmiseseradoncL\’affiche rouge ,et MySQL interpreteracorrectementce guillemet commefaisantpartie de la chaıne et pascommeundelimiteur. CecomportementdePHPestactiveparl’option magic quote gpc qui devrait normalement

Page 23: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 63

etreaon dansle fichierdeconfigurationphp.ini (voir annexeA). SinonlesfonctionsaddSlashesetstripS-lashespermettentd’ajouteroudessupprimerlescaracteresd’echappementdansunechaınedecaracteres.

En revanche,les apostrophessont inutiles pour les numeriquescomme$anMin et $anMax qui nepeuvent etreconfondusavec desnomsd’attribut et ne soulevent doncpasde problemed’interpretation.Il faut quandmemenoterquenousne faisonsaucuncontrole sur les valeurssaisies,et qu’un utilisateurmalicieuxqui placedescaracteresdanslesdates,ou transmetdeschaınesvides,causeraquelquessoucisacescript(vouspouvezd’ailleursessayer, surnotresite).

Une derniere remarque: ce script PHPestassocie au formulaire14 puisqu’il attenddesparametresque le formulaire a justementpour objectif de collecteret transmettre.Cetteassociationest cependantassezsouplepour que tout autremoyen de passerdesparametresau script soit acceptee.Par exemplel’introductiondesvaleursdansl’URL, sousla formeci-dessous,esttout a fait valable.

ExMyPHP2.php?titre=Vert%&anMin=1980 &anMax=2000 &comb=OR

Pourtout script,on peutdoncenvisagerdesepasserdu formulaireenutilisant la methodeci-dessus,pluslaborieuse,maisaussiparfoisplussouple.Il estpossibleparexemplederecupererla description(sousformeHTML) dufilm Vertigoavecl’URL http://us.imdb.com/Title?Vertigo, qui fait directementappelaunprogrammeCGI dusite imdb.com. Celasignifiequel’on n’a pasdegarantiesurla provenancedesdonneessoumisesa un script,et qu’ellesn’ont pasforcementete soumisesauxcontrolesdu formulaireprevupouretreassocie a cescript.

3.3.3 Formulair esde misesa jour

L’interactionavecunsitecomprenantunebasededonneesimpliquela possibilited’effectuerdesmisesa jour surcettebase.Un exempletrescourantest l’inscription d’un visiteurafin de lui accorderun droitd’utilisationdusite.Laencorelesformulairesconstituentla methodenormaledesaisiedesvaleursaplacerdansla base.

Nousdonnonsci-dessousl’exemplede la combinaisond’un formulaireet d’un script PHPpour ef-fectuerdesinsertions,modificationsou destructionsdansla basede donneesdesfilms. Cet exempleestl’occasiond’etudierquelquestechniquesavanceesdedefinition detablesavecMySQL et decompleterlepassagedesparametresentrele formulaireet PHP.

Une table plus complete

L’exempleutilise uneversionpluscompletedela tablestockantlesfilms.

Exemple16 FilmComplet.sql: Fichier decreationdeFilmComplet

# Cr eation d’une table ’FilmComplet’

USE Films;

CREATE TABLE FilmComplet(titre VARCHAR(30),

annee INTEGER,nomMES VARCHAR(30),prenomMES VARCHAR(30),anneeNaissance INTEGER,pays ENUM("FR", "US", "DE", "JP"),genre SET ("C", "D", "H", "S")resume TEXT,

);

Page 24: Environnement MySQL/PHP

64 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

La table FilmComplet comprendquelquesnouveauxattributs, dont trois utilisent des types dedonneesparticuliers.

1. l’attribut pays estuntypeenumere: la valeur– unique– quepeutprendrecetattribut doit apparteniraun ensembledonneexplicitementaumomentdela creationdela tableavecle typeENUM;

2. l’attribut genre estun typeensemble: il peutprendreuneou plusieursvaleursparmicellequi sontenumereesavecle typeSET;

3. enfin l’attribut resume estune longuechaınede caracteresde type TEXT dont la taille peutallerjusqu’a65 535caracteres.

Cestrois typesdedonneesnefont paspartiede la normeSQL. En particulier, unedesreglesdebasedansun SGBD relationnelest qu’un attribut, pour une ligne donnee,ne peut prendreplus d’une seulevaleur. Le type SET de MySQL permetde s’affranchir – partiellement– de cettecontrainte.On a doncdecide ici qu’un film pouvait appartenira plusieursgenres.

Le formulair e

Le formulairepermettantd’effectuerdesmisesa jour sur la base(en fait seulementsur la tableFilm-Complet) estdonneci-dessous.

Exemple17 ExForm4.html: Formulairedemisea jour<HTML><HEAD><TITLE>Formulaire complet</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<FORM ACTION="ExMyPHP3.php" METHOD=POST>

Titre : <INPUT TYPE=TEXT SIZE=20 NAME="titre"><BR>Annee : <INPUT TYPE=TEXT SIZE=4 MAXLENGTH=4NAME="annee" VALUE="2000"><P>Comedie : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’C’>Drame : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’D’>Histoire : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’H’>Suspense : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’S’><P>

France : <INPUT TYPE=RADIO NAME=’pays’ VALUE=’FR’ CHECKED>Etats-Unis : <INPUT TYPE=RADIO NAME=’pays’ VALUE=’US’>Allemagne : <INPUT TYPE=RADIO NAME=’pays’ VALUE=’DE’>Japon : <INPUT TYPE=RADIO NAME=’pays’ VALUE=’JP’>

<P>

Metteur en sc ene (pr enom - nom) :<INPUT TYPE=TEXT SIZE=20 NAME="prenom"><INPUT TYPE=TEXT SIZE=20 NAME="nom"> <BR>

Annee de naissance : <INPUT TYPE=TEXT SIZE=4 MAXLENGTH=4NAME="anneeNaissance" VALUE=2000>

<P>Resume : <TEXTAREANAME=’resume’ COLS=30 ROWS=3>Resume du film

</TEXTAREA>

<H1>Votre choix</H1><INPUT TYPE=SUBMIT VALUE=’Ins erer’ NAME=’inserer’ ><INPUT TYPE=SUBMIT VALUE=’Modifier’ NAME=’modifier’ ><INPUT TYPE=SUBMIT VALUE=’Detruire’ NAME=’detruire’ ><INPUT TYPE=RESETVALUE=’Annuler’>

Page 25: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 65

</FORM>

</BODY></HTML>

Il estassezprochedeceluidel’exemple6, avecquelquesdifferencesnotables.Toutd’abordle nomduchampgenre estgenre[] .

Comedie : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’C’>Drame : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’D’>Histoire : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’H’>Suspense : <INPUT TYPE=CHECKBOXNAME=’genre[]’ VALUE=’S’>

Pour comprendrel’utilit e de cettenotation,il faut se souvenir que les parametresissusdu formu-laire sontpassesau script sur le serveur sousla forme de pairesnom=valeur. Ici on utilise un champCHECKBOXpuisqu’onpeutaffecterplusieursgenresa un film. Si on cliquesuraumoinsdeuxdesvaleursproposees,parexemple � � Histoire � � et � � Suspense� � , la chaınetransmiseauserveuraurala formesuivante:...&genre[]=H&genre[]=S&...

Pourle scriptPHPexecuteparle serveur, celacorrespondauxdeuxinstructionssuivantes:

$genre[] = ’H’;$genre[] = ’S’;

Imaginonsun instantque l’on utilise un nom de variable$genre , sansles crochets[]. Alors pourPHPla deuxiemeaffectationviendraitannulerla premiereet $genre n’aurait qu’uneseulevaleur, ’S’.La notationaveccrochetsindiqueque$genre esten fait un tableau, doncuneliste de valeurs.Mieux:PHPincrementeautomatiquementl’indice pourchaquenouvelle valeurplaceedansun tableau.Lesdeuxinstructionsci-dessuscreentun tableauavecdeuxentrees,indiceesrespectivementpar0 et 1, et stockantlesdeuxvaleurs’H’ et ’S’.

Uneautreparticularite du formulaireestl’utilisation deplusieursboutonsSUBMIT, chacunassocie aun nomdifferent.

<INPUT TYPE=SUBMIT VALUE=’Ins erer’ NAME=’inserer’ ><INPUT TYPE=SUBMIT VALUE=’Modifier’ NAME=’modifier’ ><INPUT TYPE=SUBMIT VALUE=’Detruire’ NAME=’detruire’ >

Quandl’utilisateurcliquesurundesboutons,uneseulevariablePHPestcreee,dontle nomcorresponda celui du boutonutilise. Le script peut tirer parti de ce mecanismepour determinerle type d’action aeffectuer.

Le script PHP

La troisiemecomposantedecettepetiteapplicationdemisea jour estle scriptPHP.

Exemple18 ExMyPHP3.php: Le scriptdemisea jour deFilmComplet<HTML><HEAD><TITLE>R esultat de la mise- a-jour par formulaire</TITLE><LINK REL=stylesheet HREF="films.css" TYPE="text/css"></HEAD><BODY>

<H1>Resultat de la mise- a-jour par formulaire</H1>

<?phprequire ("Connect.php");

// Test du type de mise a jour effectu ee

Page 26: Environnement MySQL/PHP

66 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP

echo "<HR><H2>\n";if (isset($inserer)) echo "Insertion du film $titre";elseif (isset($modifier)) echo "Modification du film $titre";elseif (isset($detruire)) echo "Destruction du film $titre";echo "</H2><HR>\n";

// Affichage des donn ees du formulaire

echo "Titre: $titre <BR> annee: $annee<BR>Pays: $pays<BR>\n";for ($i=0; $i < count ($genre); $i++){

$chaineGenre .= $separateur . $genre[$i];$separateur = ",";

}echo "Genres = $chaineGenre<BR>";echo "Resume = $resume<P>\n";echo "Mis en sc ene par $prenom $nom\n";

// Connexion a la base, et cr eation de l’ordre SQL

$connexion = mysql_pconnect (SERVEUR, NOM, PASSE);mysql_select_db (BASE, $connexion);

if (isset($inserer))$requete = "INSERT INTO FilmComplet (titre, annee, "

. "prenomMES, nomMES, anneeNaissance, pays, "

. "genre, resume) VALUES (’$titre’, $annee, "

. "’$nom’, ’$prenom’, $anneeNaissance, "

. " ’$pays’, ’$chaineGenre’, ’$resume’) ";if (isset($modifier))

$requete = "UPDATE FilmComplet SET annee=$annee, ". "prenomMES = ’$prenom’, nomMES=’$nom’, ". "anneeNaissance=$anneeNaissance, pays=’$pays’, ". "genre = ’$chaineGenre’, resume=’$resume’ ". " WHEREtitre = ’$titre’ ";

if (isset($detruire))$requete = "DELETE FROMFilmComplet WHERE titre = ’$titre’";

// Execution de l’ordre SQL

$resultat = mysql_query ($requete, $connexion);echo "<HR>La requ ete $requete a et e effectu ee.\n";

?></BODY></HTML>

Cescriptprocedeenplusieursetapes,chacunedonnantlieu auneinsertiondansla pageHTML qui estfournieenretourauserveur.

Toutd’abordonregardequelleestlavariabledefinie,soit$inserer , soit$modifier , soit$detruire ,etonendeduitle typedemisea jour effectue.Onl’affichealorspourinformerl’utilisateurquesademandea ete priseencompte.Commeindique precedemment,la variable$inserer estdefinieseulementsi leboutoncorrespondantaeteutilise.Onutilisela fonctionissetdePHPpourtesterl’existenced’unevariable.

if (isset($inserer)) echo "Insertion du film $titre";elseif (isset($modifier)) echo "Modification du film $titre";elseif (isset($detruire)) echo "Destruction du film $titre";

La constructionif-elseif permetdecontrolersuccessivementlesdifferentesvaleurspossibles.Onpourraitaussiutiliser unestructureswitch , ce qui permettraiten outrede reagirau casou aucunedesvariablesci-dessusn’estdefinie.

Page 27: Environnement MySQL/PHP

3.3. ACCESA MYSQL AVEC PHP 67

On affiche ensuiteles valeursprovenantdu formulaire.La variable$genre est traitee de maniereparticuliere.

for ($i=0; $i < count ($genre); $i++){

$chaineGenre .= $separateur . $genre[$i];$separateur = ",";

}echo "Genres = $chaineGenre<BR>";

Rappelonsque$genre estuntableau,dontchaqueelementcorrespondaundeschoixdel’utilisateur.La fonctioncountpermetdeconnaıtrele nombred’elements,puisla bouclefor estutiliseepourparcourirun aun ceselements.

Au passage,on cree la variable$chaineGenre , un chaıne de caracteresqui contientla liste descodesdegenres,separespardesvirgules,selonle formatattenduparMySQL. Si, parexemple,onachoisi

� � Histoire � � et � � Suspense� � $chaineGenre contiendra”H,S”.Enfinon construitla requeteINSERT, UPDATEou DELETEselonle cas.

Discussion

Le script precedenta beaucoupde defautsqui le rendentimproprea une veritableutilisation. Unepremierecategoriede problemesdecoulede la conceptionde la basede donneeselle-meme.Il est parexemplepossibled’insererplusieursfois le memefilm, unemisea jour peutaffecterplusieursfilms, il fautindiquera chaquesaisiel’anneedenaissancedu metteurenscenememes’il figuredeja dansla base,etc.Nousdecrironsdansle chapitre4 uneconceptionplusrigoureusequi permetd’evitercesproblemes.

Si on se limite a la combinaisonHTML/PHP en laissantpour l’instant de cote la baseMySQL, lesfaiblessesduscriptsontdedeuxnatures.

Pasde controles. Aucuntestn’esteffectuesurlesvaleursdesdonnees,etenparticulierdeschaınesvidespeuvent etretransmisespour tous les champs.De plus la connexion a MySQL, et l’executiondesrequetes,peuventechouerpourdesquantitesderaisons: cetecheceventueldevrait etrecontrole.

Une ergonomierudimentair e. En serestreignanta desscriptstressimples,on a limit e du memecoupla qualite de l’interface.Par exempleon aimeraitqueles formulairessoientpresentesavec un ali-gnementcorrectdeschamps.Plusimportant: il seraitsouhaitable,au momentde mettrea jour lesinformationsd’un film, dedisposercommevaleurpardefautdesvaleursdeja saisies

Cesproblemespeuventseresoudreenajoutantdu codePHPpoureffectuerdescontroles,ou encom-plexifiant la partieHTML. Il estclair quel’on aboutitrapidementa desscriptstreslongset difficilementlisibles. Il devient alors indispensablede recourir a unestructurationdu codepermettantde repartir lestachesenunitesindependantes.

Page 28: Environnement MySQL/PHP

68 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP