TUTORIELS 
Introduction au module DBI de Perl

Page 1 | 2

Première approche du module d'abstraction de base de données du langage Perl, avec le développement d'un mini-moteur de recherche.
 (27 janvier 2003)
 

Récupérer et afficher des données
L'étape suivante consiste (logiquement) à intégrer les données de la base (le script que nous venons de vous présenter ne faisant en pratique pas grand chose...). Voici un script beaucoup plus complet, qui reçoit un nom de l'utilisateur, le cherche dans la base de données, et en sort toutes les informations qu'il trouve:

(fichier perl-dbi-search.pl)
#!/usr/bin/perl
use DBI;

my $db = 'DBI:mysql:magasin:196.112.13.1';
my $utilisateur = 'xavier';
my $motdepasse = 'lnh';

my $dbconnect = DBI->connect($db, $utilisateur, $motdepasse) or
die "Connexion à la base impossible: " . DBI->errstr;

my $sth = $dbconnect->prepare('SELECT id,prix FROM produits WHERE nom = ?') or die "Préparation de la requête impossible: " . $dbconnect->errstr;

print "Entrez un nom de produit> ";

while ($nom = <>)
  {
  chomp $nom;
  $dbexe->execute($nom) or die "Requête impossible: " . $dbexe->errstr;

  while (@data = $dbexe->fetchrow_array())
    {
    my $id = $data[0];
    my $prix = $data[1];
    print "($id) $nom: $prix Euros\n";
    }
  if ($dbexe->rows == 0)
    {
    print "`$nom' ne donne pas de résultats.\n\n";
    }
  $dbexe->finish;
  print "\nEntrez un nom de produit> ";
  }
$dbconnect->disconnect;

De nombreuses différences se présentent dans ce script. Voyons-les tour à tour...

L'utilisation de or die nous permet d'arrêter le programme et de récuperer les codes d'erreurs en cas d'échec, et de les présenter à l'utilisateur de manière (on l'espère) un peu plus lisible. Le code d'erreur est donné par la méthode DBI->errstr.

Une nouvelle méthode de l'objet DBI: DBI->prepare() permet de "préparer" une requête SQL. En pratique on pourrait très bien ici aussi faire appel à do(), mais il faut savoir prendre de bonne habitudes, et l'utilisation de do() en combinaison à de grosses requêtes SQL amène une perte des performances. La "préparation" de la requête permet de palier cela. Notez le "?" dans la requête: il représente l'emplacement où viendra se mettre la variable que l'on fournira à la requête. On peut mettre plusieurs "?" dans une requête, il faut juste s'assurer que les variables sont envoyées dans le bon ordre...

C'est ensuite la méthode DBI->execute() qui se charge de lancer la requête préparée et d'y inclure la variable donnée en argument (ici, $nom). Nous avons auparavant utilisé l'opérateur chomp() afin d'éliminer tout caractère de fin de ligne contenu dans $nom...

while ($nom = <>) nous permet de faire boucler le programme tant qu'il n'aura pas entré une valeur (ne serait-ce qu'un espace): <> indique que Perl doit lire une donnée depuis la console.
Une fois cette formalité accomplie, nous utilisons la méthode fetchrow_array() pour placer une à une dans @data les valeurs renvoyées par la base. On les assigne ensuite à des variables (les valeurs étant renvoyées dans l'ordre, il est préférable de ne pas faire de SELECT * pour ne pas avoir de mauvaises suprises...), et on les affiches via print().

if (dbexe->row == 0) nous permet de tester l'absence de résultats, et d'agir en conséquence.
Une fois tout cela terminé, on indique à la base que la recherche d'information est terminé avec DBI->finish, ce qui met à zéro le pointeur de $dbexe. On affiche un nouveau prompteur si l'utilisateur veut lancer une nouvelle recherche. Il lui suffit d'entrer un espace pour sortir de la boucle, auquel cas on déconnecte la base avec DBI->disconnect: notre programme est terminé.
Nous fermons la connexion à la base comme nous l'avons vu.

Nous terminons ainsi notre première approche de DBI.

Page 1 | 2

 
[ Xavier Borderie JDNet
 
Accueil | Haut de page