MySQL et Perl, le mariage de raison

ArticleCategory:

Applications

AuthorImage:

Georges Tarbouriech

TranslationInfo:[Author and translation history]

original in en Georges Tarbouriech 

en to fr Georges Tarbouriech 

AboutTheAuthor

Georges est un vieil utilisateur d'Unix. Il appr�cie tous ces produits qui ont contribu� � r�pandre les solutions bas�es sur le logiciel libre dans le domaine professionnel.

Abstract:

MySQL et Perl font partie du paysage depuis d�j� longtemps. Ils sont toujours largement utilis�s m�me si la "mode" est en train de changer. Cet article parle de ces deux produits utilis�s conjointement soit sur Internet, soit sur votre r�seau local. L'exemple propos� concerne les syst�mes Unix, libres ou non, m�me s'il peut �tre adapt� � d'autres "syst�mes" largement r�pandus.
Ce qu'est cet article : un petit tour d'horizon de ce que l'on peut faire avec ce couple, en insistant sur la facilit� d'utilisation, la rapidit�, la fiabilit�, la s�curit�...
Ce que cet article n'est pas : ni un tutoriel MySQL ou Perl, ni une pr�sentation approfondie de MySQL ou Perl.
Par cons�quent, nous y verrons MySQL au travail en liaison avec Perl, sans oublier "qu'il y a plus d'une fa�on de le faire".

ArticleIllustration:

MySQL and Perl

ArticleBody:[The article body]

Quid de ce couple sympathique ?

MySQL est un Syst�me de Gestion de Bases de Donn�es Relationnelles (SGBDR) disponible sur http://www.mysql.com. Il est publi� sous licence GNU GPL gratuitement en fonction de l'usage pour lequel il est pr�vu. V�rifiez la politique de licence sur le site de MySQL. Il fonctionne en tant que client ou serveur sur de nombreuses plate-formes. D'autres SGBDR libres existent et nous ne ferons aucune comparaison puisque le choix de MySQL pour cet article est purement arbitraire. De m�me nous ne comparerons pas avec les "gros" produits commerciaux tels qu'Informix, Oracle, Sybase... Pr�cisons toutefois que MySQL est probablement l'un des SGBD les plus utilis�s sur Internet. Pour cet article nous avons choisi (toujours arbitrairement) la version 3.23.36. Au moment d'�crire ces lignes, la derni�re version stable est la 3.23.46 et la version exp�rimentale est la tant attendue version 4.0. Tout ceci peut �tre t�l�charg� sous forme de code source � compiler ou sous forme de paquetage.
Pour utiliser MySQL avec Perl, vous aurez besoin d'autre chose : les modules DBI de Perl. Vous devez au moins t�l�charger DBI, Msql-Mysql-modules, Data-Dumper et Data-ShowTable.
Nous ne parlerons pas de leur installation puisqu'elle est �vidente et que les distributions vous fournissent tout ce que vous avez besoin de savoir.
Perl signifie Practical Extraction and Report Language. Au tout d�but il �tait destin� � la manipulation de document (analyse, extraction...) mais il est rapidement devenu beaucoup plus que �a. Vous pouvez pratiquement tout faire avec Perl, depuis les t�ches d'administration aux scripts cgi, en passant par de v�ritables applications et bien s�r, l'interfa�age de bases de donn�es.
Perl fait partie de nombreuses (sinon toutes) distributions Unix, qu'elles soient libres ou non. La version stable actuelle est la 5.6.1 et l'exp�rimentale est la 5.7.2 au moment d'�crire ces lignes. Pour cet article nous utiliserons la bonne vieille 5.005_03. Si Perl n'est pas install� sur votre machine (comment est-ce possible ?), vous pouvez l'obtenir sur http://www.perl.com. Perl propose des tonnes de modules pour pratiquement tout. Vous pouvez les obtenir � partir de la section CPAN de ce m�me site : une mine d'or !
Dernier point et non le moindre, pour travailler avec les deux outils r�unis, surprise : il vous faut un serveur web ! Apache semble le bon choix puisqu'il fait partie de nombreuses distributions Unix. Si vous ne l'avez pas (o� avez-vous trouv� votre distribution ?), il est disponible � http://www.apache.org.

L'exemple utilis�

Vous avez sans doute remarqu� que LinuxFocus est un magazine multilingue. Ca signifie que lorsque vous �tes un �diteur, vous devez g�rer le statut des nouveaux articles, leur traduction. En d'autres termes, qui fait quoi, quand... Actuellement, il y a environ 200 articles, traduits en moyenne en 5 langues. Ce qui fait un millier d'articles (que je suis bon !) et �a augmente tous les mois ! Tout cela doit �tre archiv�, format�, r�capitul�... Comment croyez-vous que cette gestion fonctionne ? Gr�ce � Perl, bien s�r.
Notre �diteur en chef, Guido Socher, a �crit de nombreux programmes en Perl pour nous faciliter la t�che. Il a �galement �crit un tutoriel Perl en trois parties ainsi que la pr�sentation d'un livre sur Perl. Voir la partie "R�f�rences" � la fin de l'article.
Javi, l'�diteur Espagnol, a �crit un programme pour g�rer l'avancement des traductions... en Perl.
Atif, l'un de nos auteurs �toile, vient du royaume de Perl, et c'est pour cela que sa langue maternelle... est Perl. Accessoirement, il a �galement contribu� � MySQL, en am�liorant un outil d'administration web. Voir �galement la partie R�f�rences.
Tout cela pour dire que si vous cherchez un paradis Perl... rejoignez LinuxFocus.
Comme je suis l'un des �diteurs Fran�ais... et que je suis plut�t paresseux, j'ai cr�e ma propre base de donn�es LinuxFocus en utilisant, devinez quoi : MySQL et Perl !

Cr�ation de la base

Cela suppose que MySQL a �t� correctement install�, que des utilisateurs ont �t� cr�es et ont �t� prot�g�s par des mots de passe. L'installation n'entre pas dans le cadre de cet article et la documentation d'excellente qualit� fournie avec MySQL vous dira tout.
D�marrez le serveur MySQL � l'aide du script mysql.server, puisqu'il invoque le d�mon safe_mysqld auquel vous pouvez passer des options. Connectez-vous au serveur en tapant

mysql -h host -u user -p

. Si le serveur est sur votre machine, -h host est inutile.
Apr�s avoir tap� le mot de passe, vous �tes connect� au serveur (enfin, vous devriez !). Et vous pouvez maintenant cr�er votre base de donn�es.
Au prompt mysql, tapez

CREATE DATABASE lf;

Il s'agit de notre exemple (lf pour LinuxFocus) et il est �vident que vous donnez le nom de votre choix � votre propre base. Ensuite, garantissez certaines permissions aux utilisateurs autoris�s, en supposant que vous ayez le droit de le faire (c'est-�-dire que l'utilisateur connect� poss�de des droits d'administrateur). Si vous souhaitez qu'un utilisateur puisse g�rer la base, vous pouvez lui en donner les privil�ges en tapant

GRANT ALL ON lf.* TO username;

S�lectionnez la base que vous venez de cr�er en tapant

USE lf

. Cr�ez une table en fonction de vos besoins. Dans notre exemple, nous d�finissons une table nomm�e trissue

CREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));

. V�rifions qu'elle correspond bien � ce que l'on attend avec :

USE lf
SHOW TABLES;
DESCRIBE trissue;

C'est tout.
Maintenant, il nous faut des donn�es. Pour int�grer des donn�es dans une table vide, le moyen le plus simple consiste � utiliser un fichier texte avec des tabulations en guise de s�parateurs. Lorsque votre texte est pr�t, tapez :

LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;

Si votre fichier texte est correct, la table est maintenant peupl�e. Vous pouvez le v�rifier par :

SELECT * FROM trissue;

Ceci devrait afficher une longue liste. Vous pouvez d�s lors retrouver n'importe quelle donn�e � l'aide de requ�tes.
Jusque l�, �a va.
Nous n'avons utilis� que MySQL qui nous a permis de tout faire. Alors, que vient faire Perl l�-dedans ?

Perl au travail

Perl va nous aider � automatiser les requ�tes, � afficher les r�sultats dans un navigateur web, etc. Encore une fois, ceci implique que les modules Perl ont �t� correctement install�s pour permettre l'utilisation de MySQL en liaison avec Perl.
Nous allons maintenant �crire des scripts Perl utilis�s en tant que scripts cgi. Ils vont nous permettre de m�ler Perl et HTML pour interroger la base et formater le r�sultat.
Nous ne traiterons que d'un simple exemple de script, nous autorisant � rechercher tous les articles d'un m�me auteur. Nous afficherons les num�ros des articles, la cat�gorie, le titre, les noms des traducteurs des diff�rentes langues (uniquement celles des projets �tablis), et le mois de parution de l'article.
Vous pouvez utiliser ce script comme mod�le pour votre usage personnel, mais sachez que cet exemple n'est pas un programme particuli�rement s�curis�. Vous pouvez obtenir une version un peu plus comment�e =>ici<=.

#!/usr/bin/perl -Tw
# D'abord, disons qu'il s'agit d'un script Perl "Tainted".
#
# Ceci est un commentaire
# consultation de la base
#
# Utilisons le module Perl DBI
use DBI;

# en tant que cgi :
use CGI qw(param());

print <<END_of_start;

Content-type: text/html

<html>
<title>LFAuthors main db</title>

<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">

# Voici le titre du bouton de la page de lancement
<input type="submit" value=" LFAuth ">
</form>
</TD>
</TR>
</TABLE>

Nous demandons maintenant au script d'interroger la base

<center><H2>Search by author</H2></center>

<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\"
value=\"Search...\"></form></center>


END_of_start


if (param("author") ne '') {
$author = param("author");

$autsrch.='"';
$autsrch.=$author;
$autsrch.='"';

# Nous nous connectons � la base nomm�e lf en tant qu'utilisateur untel

$dbh = DBI->connect("DBI:mysql:lf","untel",'');

$sth = $dbh->prepare("
select *
from trissue
where
author = $autsrch
");

$sth->execute;

Nous demandons maintenant au script de pr�parer et d'afficher les r�sultats de la requ�te. Soit le champ de recherche est vide et le contenu de la base est affich� en totalit�, soit nous recherchons un nom et chaque article correspondant � cet auteur sera affich�. Si vous avez des milliers d'enregistrements dans votre base, je vous d�conseille l'affichage de la totalit� du contenu !

print <<END_suite;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>

END_suite

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";


} else {

# Connexion � la base

$dbh = DBI->connect("DBI:mysql:lf","untel",'');


# Recherche

$sth = $dbh->prepare("
select *
from trissue
");

$sth->execute;


# Affichage du r�sultat


print <<SUITE;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>

SUITE

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

}
print "</TABLE>";
print "<BR>";

}
print end_html;
$sth->finish;


# D�connexion

$dbh->disconnect;

exit;


Voici le r�sultat obtenu dans un navigateur :

query


C'est tout fini !

Du c�t� s�curit�

De toute �vidence, si vous souhaitez proposer un service de base de donn�es sur votre site, vous devez s�curiser l'ensemble. Bien s�r, nous ne fournirons pas de m�thode pas � pas pour s�curiser votre site ou votre serveur de bases de donn�es. Toutefois, il est important d'insister sur ce qui est basique.
En bref, lorsque vous proposez des services sur Internet, la premi�re chose � faire consiste � s�curiser votre serveur web. Ceci est tr�s loin du cadre de cet article. Si vous voulez en savoir plus sur le sujet, il existe une �norme documentation. Un bon endroit pour commencer n'est autre que le Linux Documentation Project.
L'�tape suivante concerne le serveur de bases de donn�es. Lorsque vous installez un outil tel que MySQL, n'oubliez pas de lire le chapitre s�curit� du manuel. Encore une fois, le travail de base concerne les mots de passe des utilisateurs : ne laissez jamais un compte sans mot de passe, particuli�rement celui de root (qui devrait �tre diff�rent de celui de la machine). L'autre point important concerne les permissions : n'autorisez pas tout � tout le monde. Cela para�t �vident... et c'est la raison pour laquelle nombreux sont ceux qui l'oublient !
Pour aller un peu plus loin, pourquoi ne pas "chrooter" la base ? Lisez l'article de Mark "Chrooter tous les services" dans ce num�ro. Il y parle d'une autre base mais ce qu'il dit peut �tre appliqu� � MySQL.
Une autre mesure de s�curit� concerne la circulation des donn�es. Ce n'est pas une mauvaise id�e d'envoyer et de recevoir les donn�es par un canal s�curis�. Vous pouvez lire l'article Par le tunnel pour plus ample information.
Enfin, l'essentiel, la programmation s�curis�e est l'une des cl�s. Perl est un langage extraordinaire mais il est tr�s facile de faire de grosses erreurs de programmation avec lui. Un autre article de LinuxFocus vous dira ce qu'il faut faire, particuli�rement avec Perl. Jetez un oeil (et m�me les deux) l�. C'est le dernier article de la s�rie sur la programmation s�curis�e et il concerne plus sp�cialement les scripts cgi. A lire absolument !
Alors, bien s�r, tout ceci suppose que votre syst�me est d�j� s�curis�, sans trous de s�curit� bien connus, avec tous les derniers correctifs, et avec de nombreux outils de s�curit� obligatoires tels qu'un NIDS (Network Intrusion Detection System) comme snort (http://www.snort.org), un pare-feu, des scanners de ports et de s�curit� (nmap, nessus), etc.
Si vos moyens vous le permettent, vous pouvez aussi avoir un serveur diff�rent pour chaque service propos� : un serveur web, un serveur de bases de donn�es... et leur miroir pour garantir une haute disponibilit�. Ainsi de suite ! Ce n'est jamais fini, puisque la s�curit� n'est jamais aboutie. Vous essayez seulement de r�duire les risques... et ils sont tous les jours plus gros. Vous voil� avertis.

Quoi d'autre ?

Comme Il Y a toujours Plus d'Une Fa�on de Le Faire (TIMTOWDI c'est quand m�me plus parlant que IYPUFDLF), vous pouvez choisir celle qui vous convient le mieux. Il existe de nombreux SGBDR ainsi que de nombreux langages pour communiquer avec eux. L'id�e derri�re cet article �tait de montrer que MySQL et Perl fonctionnent vraiment bien ensemble.
Certes, le choix �tait enti�rement subjectif : j'adore MySQL pour sa relative petite taille, parce qu'il fonctionne sous de nombreux OS, qu'il est rapide, fiable... J'appr�cie �galement beaucoup le travail de l'�quipe de MySQL, sans oublier les nombreux contributeurs. Et ce que pr�f�re : ces gens n'ont pas essay� de r�inventer la roue. Ils ont conserv� la simplicit�.
Pour ce qui est de Perl, tout a �t� dit : que pourrais-je ajouter ? Je crois vraiment qu'il est impossible de travailler sans lui, que vous soyez administrateur r�seau, d�veloppeur ou que sais-je. La communaut� Perl est l'un des si�ges du partage des connaissances. Un magazine existe, nomm� le Perl Journal, qui est maintenant int�gr� au magazine SysAdmin, tous les deux num�ros. Si vous voulez vous abonner, visitez http://www.samag.com.
Puisque nous parlons de beau travail, voici l'habituelle partie hors-sujet. Vous, lecteurs de LinuxFocus, n'avaient sans doute pas remarqu� le petit nombre de personnes investies dans le magazine. Pourtant, vous pouvez le lire dans de nombreuses langues. Avez-vous remarqu� que certaines �quipes travaillent presque toujours avec une ou deux personnes qui font tout ? Ils sont traducteurs, webmestres, etc. Regardez du c�t� de l'�quipe Russe ou de l'�quipe Turque : vous verrez que la plupart des articles sont traduits par Kirill ou Erdal. Jetez un oeil sur les projets en cours de d�veloppement, tels que le Portugais ou l'Arabe : m�me r�sultat ! J'aimerais les f�liciter pour l'�norme travail r�alis�. Merci � vous tous : la communaut� du logiciel libre peut vous �tre reconnaissante.
Pardon pour la digression, mais je crois qu'il fallait que ce soit dit.
Pour en revenir au sujet, terminons par quelques mots sur le logiciel libre. Les gens de MySQL et de Perl m�ritent un grand merci. Ils nous fournissent des outils extraordinaires, presque toujours gratuitement. Pourtant ces outils sont souvent aussi "bons" que les v�ritables produits commerciaux (sinon meilleurs), ils sont fr�quemment mis � jour, tr�s bien document�s et vous pouvez les utiliser sur la plupart des syst�mes Unix. Connaissez-vous un �quivalent ailleurs ? J'ai bien peur que non !
Cet article ne vous apprendra sans doute pas grand chose, mais s'il vous donne envie d'essayer ces produits, il n'aura pas �t� inutile.
Quand je vous dis qu'on vit une �poque formidable !

R�f�rences

Perl mongers

Le tutorial Perl de Guido :

Perl I
Perl II
Perl III

Revue du livre Programmation Professionnelle de Perl :

Programmation avec Perl

La contribution d'Atif � MySQL.

Une revue de MySQL sur LinuxFocus : vieil article encore d'actualit� :

MySQL

Un vieux tutoriel SQL en deux parties sur LinuxFocus :

SQL Partie I
SQL Partie II