PHP 3-MySQL
Rapport d'exercice
Pierre Crevoisier, 29 juin 1998
Staf 14, D.Schneider
Motivation | Projet | Définition | Réalisation | Difficultés rencontrées | Références
Motivation L'approche de la gestion des bases de données est depuis longtemps inscrit à mon projet d'apprentissage. Les technologies SGBD liées et à leur interfaçage avec un navigateur Web constituent en effet l'un des points-clefs du futur des réseaux.
Il est en effet important de dissocier le site et son contenu potentiel, la conception de l'interface et l'élaboration-maintenance-gestion de l'information. En l'occurrence, l'avantage du Web est de permettre une adaptation du client grâce à des technologies non-propriétaires pour établir des passerelles avec des technologies qui, elles, sont généralement propriétaires.
Projet
A l'origine, je souhaitais réaliser une base de données de "compétences techniques" au sein de TECFA de manière à permettre à chacun, soit d'offrir une expertise, soit de la solliciter. L'idée date de la fin de l'automne dernier, lorsqu'une partie des membres de la promotion manifestait le besoin de bénéficier du soutien des plus "avancés" pour se familiariser avec certains outils... A l'époque, j'avais tenté une première démarche mais le manque de disponibilité et de "maîtrise technologique" m'avaient incité à remettre le projet à des jours plus... sereins.
Celui-ci est toujours d'actualité et l'initiative pourrait être relancée (pensons aussi à la nouvelle promotion qui débarquera en octobre prochain!). Au-delà, cette "hot-line distribuée" pourrait constituer l'un des éléments du futur "campus virtuel".
J'ai ici choisi une première "prise en main": un carnet d'adresses-ressources que je pourrais consulter, compléter, mettre à jour, à distance. Deux éléments ont dicté ce choix:
  • le "contenu" préexistait au projet; je devais "simplement" (sic) parvenir à transférer les données dans une base MySQL;
  • il y avait un intérêt pratique à concevoir cet outil de travail;
Définition
PHP 3 est un langage de scripting HTML server-side. Il permet un affichage "conditionnel" de codes HTML de contenu intégré au fichier-source ou provenant de bases de données. Ce dernier point est d'ailleurs l'atout majeur de PHP, renforcé par le grand nombre de système de bases de données supportées: Oracle, Adabas D, Sybase, FilePro, mSQL 1.x and 2.x, Velocis, MySQL, Solid, dBase, Generic ODBC, Unix dbm, PostgreSQL ainsi que tous les système de bases de données avec interface ODBC.
L'intérêt de PHP est sa transparence et sa relative simplicité: le langage emprunte sa syntaxe et ses méthodes à Java, Perl et C, la complexité en moins...
Réalisation
J'ai utilisé la technique, désormais assez bien rodée, du "observer-copier-coller-adapter". A noter que ce n'est sans doute pas la manière la plus opportune pour développer une expertise, mais la méthode est assez efficace lorsqu'il s'agit de parvenir à un premier résultat fonctionnel.

Première phase: l'analyse
Ainsi, ma première démarche a été de "décortiquer" les codes proposés par P.Jermann dans la "demo MySQL-php". Pas-à-pas, j'ai dressé l'inventaire des appels de fonctions, les paramètres choisis et les instructions. Chaque document .php me permettait de comparer la source et son affichage sur la navigateur de manière à me familiariser avec la structure de l'intégration des codes PHP et HTML.

Deuxième phase: les micro-tests
Elle a consisté à "bidouiller" le script d'origine. J'ai donc ajouté des portions de codes simples (p.ex les fonctions 'include' ou 'echo'). L'usage de la fonction 'echo' m'a également permis d'afficher le contenu d'une variable à différentes étapes du script. Cette phase de la démarche est pour moi extrêmement importante dans l'élaboration mentale que je peux me faire de l'outil.

Troisième phase: MySQL
Il s'agissait ici de comprendre les commandes de bases pour accéder à une base de données en mode terminal, créer une table, un fichier de commandes externe (afin d'éviter les erreurs de scripting en ligne), soumettre celui-ci à MySQL, etc. Quoiqu'incomplet, le "mysql_tutorial" a été particulièrement utile.
Le travail le plus délicat, à ce stade, a été le transfert des données de ma base d'adresses. Les contraintes syntaxiques de MySQL ne laissent en effet passer aucun écart et plusieurs tentatives ont été nécessaires pour réussir le transfert. La consultation du manuel MySQL en ligne m'a permis de trouver la commande ad hoc ('load data infile').

Quatrième phase: intégration en consultation
Dans la mesure où je possédais une table, le premier test d'intégration a été de réaliser un document php me permettant de la consulter. Pour ce faire, j'ai adapté le fichier "dump_results" de la demo de P.Jermann.
Le résultat n'a pas été probant! En activant le script, je recevais systématiquement un message d'interdiction d'accès... à la base si je choisissais le login "nobody", au serveur si j'utilisais mon login+password pour accéder à la base!

Cinquième phase: contournement du problème
Hypothèse no 1: un problème d'autorisation au niveau du serveur ou de la base de données. Hypothèse no2: une erreur de paramétrage de ma commande d'accès...
La solution au problème, je l'ai trouvée en explorant d'autres ressources PHP sur Internet. C'est l'exemple de script "Guestbook" de Shane Caraveo qui m'a permis de contourner l'obstacle (malheureusement, je ne parviens plus à retrouver l'URL de ce document...). Fort bien documenté, le travail de Caraveo permettait une analyse détaillée du script. Il a donc été très simple de l'adapter, de créer la table idoine sous MySQL (le fichier de commandes figure dans la documentation de S.Caraveo) et d'en tester le fonctionnement... Résultat positif! La seconde hypothèse était la bonne. En remplaçant les commandes et les paramètres de mon script "dump" (et l'aide de P.Jermann pour la mise au net!), le contenu de ma base "adresses" pouvait être consulté... avec un bémol singulier: au-delà de 500 enregistrements, le navigateur se "plantait"!^

Sixième phase: les fonctionnalités
Je parvenais donc à la dernière étape: intégrer les fonctionnalités essentielles. Un script de recherche, un script d'édition d'enregistrement et un script d'effacement . Compte tenu du travail réalisé précédemment, cette phase a été relativement aisée. Une surprise toutefois: l'édition d'un enregistrement et le renvoi dans la base créait un nouvel enregistrement, porteur du même ID... Le bug provenait d'une erreur de définition de ma table: le champ ID n'avait pas été défini comme une "primary key"!
Pour corriger l'erreur, la procédure suivante a été effectuée: 'dump' de la table, suppression de la version bug, édition du fichier 'dump' (contenant le fichier de commande de création de table ET les données), réimportation du fichier de commande.
Une dernière fonctionnalité a été implémentée par P.Jermann: celui-ci m'a paramétré un fichier htaccess permettant de protéger l'accès à la base par un login+password.

Résultat
Pour l'heure, la version beta fonctionne. Au-delà de la maquette, plusieurs corrections devront encore être apportées: mise en page, création de 'listes' pour remplacer certains champs 'texte', affiner les scripts d'affichage des données (option listing, option 'fiche individuelle', etc.), barre de navigation mieux conçue, script de confirmation d'effacement (!), etc.

Difficultés rencontrées
Elles sont déjà en partie décrites dans la procédure de réalisation. Il reste que la difficulté majeure a été l'attention nécessaire à la rédaction des scripts. Pour parler simplement, je pourrais dire qu'il n'est pas toujours évident de repérer l'absence d'un signe de ponctuation nécessaire, d'un délimiteur ou d'un intégrateur... Cela d'autant plus que je travaille sur traitement de texte (bête mais pas méchant ;), dépourvu des facilités offertes par un véritable environnement de développement.
Du bon usage des manuels ensuite: si les ressources (manuels, références de langage, etc.) ne manquent pas, force est de constater qu'elles ne sont pas toujours d'une limpidité exemplaire. Regret de profane: que la description de commandes ne soient pas accompagnées systématiquement d'exemples

Un exemple de casse-tête pour débutant (même motivé)? Allons-y:

  • LOAD DATA INFILE 'text_file_name.text' [REPLACE | IGNORE] INTO TABLE table_name [FIELDS [TERMINATED BY ',' [OPTIONALLY] ENCLOSED BY '"' ESCAPED BY '\\' ]] [LINES TERMINATED BY '\n'] [(Field1, Field2...)]

Vous en voulez d'autres?...

Références
Je me suis essentiellement basé sur les documents et ressources suivantes:
Motivation | Projet | Définition | Réalisation | Difficultés rencontrées | Références