Maintenant que nous venons de voir comment faire une requête, je vous propose de voir comment exploiter les résultats renvoyés.
Exploiter les résultats
Nous allons voir ici 2 cas, ce qui nous permettra de rencontrer et manipuler différentes fonctions.
- Cas no 1 : il s'agit du cas où vous connaissez le nombre d'arguments.
- Cas no 2 : il s'agit du cas où vous ne connaissez pas le nombre d'arguments.
Cas no 1
Reprenons la requête précédente :
Code : SQL
Puisque nous connaissons la structure de notre table de données, nous pouvons transformer notre requête afin d'en détailler les différents champs que nous voulons sélectionner.
Voici ce que ça donne :
Code : SQL | SELECT numMarque, nomMarque FROM MARQUE
|
Si vous n'êtes pas convaincus que ces 2 requêtes sont équivalentes, je vous invite à les exécuter dans votre SGBD.
Il existe une multitude de manières d'exploiter les données renvoyées par une requête SQL. Je vous propose de voir la méthode la plus courante.
Puisque bien souvent un bout de code vaut mieux que de longues explications, voici tout de suite comment faire :
Code : Perl | while (my($numMarque, $nomMarque) = $prep->fetchrow_array ) {
print $numMarque . '. ' . $nomMarque . "\n";
}
|
Quelques explications : La méthode
execute
renvoie un tableau qui contient toutes les lignes qui ont été sélectionnées par notre requête. La méthode
fetchrow_array
est une fonction qui
renvoie une ligne de ce fameux tableau. C'est d'ailleurs parce que cette fonction nous renvoie un tableau que nous pouvons utiliser une liste pour recueillir nos résultats.
La boucle
while
quant à elle, nous permet de réaliser une boucle sur les lignes du tableau contenant les résultats et ainsi, d'exploiter toutes les lignes et donc tous les résultats sans en oublier.
Si l'on reprend le script précédent, ces 3 lignes se placent juste avant l'instruction
$prep->finish.
Voici tout de suite l'affichage produit par ce script :
Code : Console | > perl requete.pl
1. ZeroMobile
2. Renault
3. Peugeot
4. Ferrari
5. Porsche
6. Fiat
7. Ford
8. Tata Motor
9. Smart
10. Citroen |
Cas no 2
Pour rappel, il s'agit du cas où nous ne connaissons pas le nombre d'arguments.
Reprenons donc notre requête sous sa première forme :
Code : SQL
Dans ce second cas, utiliser une liste pour recueillir les résultats n'a pas de sens, puisque nous ne connaissons pas le nombre de champs renvoyés. Il conviendra alors d'utiliser un tableau.
Bien sûr, l'exploitation sera différente du premier cas. Afin d'afficher les résultats, nous allons être obligés d'utiliser une nouvelle boucle : la boucle
foreach
. Nous allons donc imbriquer 2 boucles afin d'exploiter les résultats de notre requête.
Voyons tout de suite comment faire :
Code : Perl | while (my @data = $prep->fetchrow_array ) {
foreach my $elt (@data) {
print $elt.' ';
}
print "\n";
}
|
En exécutant ce script dans votre terminal, vous devriez alors avoir :
Code : Console | > perl requete.pl
1 ZeroMobile
2 Renault
3 Peugeot
4 Ferrari
5 Porsche
6 Fiat
7 Ford
8 Tata Motor
9 Smart
10 Citroen |
Cette méthode peut se révéler intéressante dans le cas d'une requête SQL ayant énormément de champs dans le
SELECT
afin de rendre le code de votre script plus clair.
Compter le nombre de lignes renvoyées
Avez-vous une idée sur le moyen d'obtenir le nombre de lignes renvoyées par votre requête SQL ?
Vous avez 10 minutes pour y réfléchir !
Tic… Tac… Tic… Tac…
Voyons ensemble les 3 réponses qui reviennent le plus souvent.
- Incrémenter une variable dans la boucle while
.
- Faire une autre requête avec un COUNT(*)
.
- Utiliser une fonction que tu vas nous révéler.
L'idée du compteur à incrémenter dans la boucle
while
n'est pas une mauvaise idée, mais la bonne réponse est bien évidemment la dernière !
En effet, il existe une fonction qui permet de connaître le nombre de lignes retournées par notre requête. La voici sans plus attendre :
Code : Perl
Ainsi, si on ajoute cette ligne à notre script :
Code : Perl | print 'Il existe '.$prep->rows.' marques de voitures.';
|
Nous allons obtenir à l'écran :
Code : Console | Il existe 10 marques de voitures. |
Le script complet
Comme à chaque fois en fin de chapitre, voici le script complet de ce que nous avons vu :
Code : Perl 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #!/usr/bin/perl
use strict;
use DBI;
my $base = 'Zvoitures';
my $hote = '127.0.0.1';
my $login = 'root';
my $mdp = '';
my $dbd = DBI->connect("dbi:mysql:dbname=$base;host=$hote;",$login, $mdp)
or die 'Connexion impossible à la base de données : '.DBI::errstr;
my $requete = 'SELECT * FROM MARQUE';
my $prep = $dbd->prepare($requete)
or die 'Impossible de préparer la requête : '.$dbd->errstr;
$prep->execute
or die 'Impossible d\'exécuter la requête : '.$prep->errstr;
while (my($numMarque, $nomMarque) = $prep->fetchrow_array ) {
print $numMarque.'. '.$nomMarque."\n";
}
print 'Il existe '.$prep->rows.' marques de voitures.';
$prep->finish;
$dbd->disconnect;
|