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 !
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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.
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!
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
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
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).
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.
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
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.
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.
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
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.
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 ...).
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’
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.
50 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP
Remarque: MySQL accepteles apostrophesdoubles(”), maisce n’est pasconformea la normeSQLANSI. Il estpreferabledeprendrel’habituded’utiliser systematiquementlesapostrophessimples.
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 ’ ’;
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
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.
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.
– 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.
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 .
mysql> SELECT titre, annee-> FROM FilmSimple-> WHERE annee > 1980;
+------------+-------+| titre | annee |
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.
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
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.
phpMyAdminestun outil entierementecrit en PHPqui fournit uneinterfacesimpleet trescompletepouradministrerunebaseMySQL. La plupartdescommandesdel’utilitaire mysqlpeuvents’effectuerparl’intermediairedephpMyAdmin,lesoperationspossiblesdependantbiensur desdroitsdel’utilisateurquiseconnectea la base.Voici unelistedesprincipalespossibilites:
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.
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.
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.
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.
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.
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
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.
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.
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.
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();
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.
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.
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
– 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.
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.
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>
62 CHAPITRE3. ENVIRONNEMENTMYSQL/PHP
<H1>Resultat de l’interrogation par formulaire</H1>
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
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.
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.
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.
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&...
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.
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
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";
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.
3.3. ACCESA MYSQL AVEC PHP 67
On affiche ensuiteles valeursprovenantdu formulaire.La variable$genre est traitee de maniereparticuliere.
Au passage,on cree la variable$chaineGenre , un chaıne de caracteresqui contientla liste descodesdegenres,separespardesvirgules,selonle formatattenduparMySQL. Si, parexemple,onachoisi
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.