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
|