Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Interagir avec une base de données en Perl 5 grâce au module DBI (6/7) : Les autres requêtes

7 août 2022

Nous avons déjà vu les requêtes de sélection. Il est maintenant temps de voir les autres, à savoir les requêtes de type :

  • insertion ;
  • mise à jour ;
  • suppression ;
  • création.

Ne vous inquiétez pas, le plus dur est derrière nous. ;)

Plan

La syntaxe

Afin d’exécuter les requêtes différentes de celles de sélection, nous allons voir qu’il y a une autre syntaxe à utiliser.

Comme pour les requêtes de sélection, je vous propose de travailler sur un exemple. J’ai choisi une requête d’insertion :

INSERT INTO MARQUE (nomMarque) VALUES ('BMW')

Cette requête permet d’ajouter la marque BMW dans notre base de données.

Contrairement aux requêtes de sélection, nous n’allons plus utiliser les fonctions prepare() puis execute afin d’exécuter nos requêtes. En effet, nous allons directement lancer leur exécution via une nouvelle méthode : la méthode do().

La syntaxe n’étant pas bien compliqué, je vous propose de voir immédiatement un exemple pratique :

my $requete = 'INSERT INTO MARQUE (nomMarque) VALUES (\'BMW\')';

$dbd->do($requete)
    or die 'Impossible d\'exécuter la requête : '.$dbd->errstr;

Comme vous pouvez le constater, la méthode do() prend pour paramètre votre requête (comme le faisait la méthode prepare() dans le chapitre précédent).

Ce qu’il faut maintenant savoir, c’est que l’on privilégiera l’utilisation de la méthode do() pour toutes les autres que les requêtes de sélection, comme par exemple les requêtes suivantes :

INSERT INTO MARQUE (nomMarque) VALUES ('BMW');
UPDATE VENTE SET numVendeur = 5 WHERE numVoiture = 15;
DELETE FROM VENTE WHERE numVendeur = 5;
CREATE TABLE...

Compter les lignes

Je dois avouer que vous venez de toucher un point sensible…

En réalité, cette nouvelle syntaxe ne nous le permet pas. Si vous souhaitez compter le nombre de lignes affectées par une requête de suppression ou de mise à jour, vous devrez utiliser la syntaxe des requêtes de sélection.

Je vous propose d’ailleurs de voir immédiatement deux exemples.

Exemple 1

Voici la requête que nous allons exécuter dans cet exemple :

UPDATE VENTE SET numVendeur = 5 WHERE numVoiture = 15

Comme il n’y pas de nouveauté, je vous propose de jeter immédiatement un coup d’œil au code :

my $requete = 'UPDATE VENTE SET numVendeur = 5 WHERE numVoiture = 15';

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;

print 'Ligne(s) modifiée(s) : '.$prep->rows;

Lors de l’exécution de ce script, vous devriez alors obtenir l’affichage :

> perl requete.pl
Ligne(s) modifiée(s) : 1

Exemple 2

Voici la requête que nous allons exécuter dans cet exemple :

UPDATE VENTE SET numVendeur = 2 WHERE numVendeur = 5

Voyons immédiatement le code source :

my $requete = 'UPDATE VENTE SET numVendeur = 2 WHERE numVendeur = 5';

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;

print "Ligne(s) modifiée(s) : ".$prep->rows;

Lors de l’exécution de ce script, vous devriez alors obtenir l’affichage :

> perl requete.pl
Ligne(s) modifiée(s) : 2

Pour résumer

Je vous propose de faire un petit résumé de ce que nous avons vu jusqu’ici.

Les requêtes de sélection

Pour tout ce qui est requête de sélection, il conviendra de privilégier la syntaxe utilisant les méthodes prepare() et execute :

#!/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;

Les autres requêtes

Sans compter le nombre de lignes

Pour toutes les autres requêtes (DELETE, INSERT, UPDATE, DROP, CREATE …), il conviendra d’utiliser la syntaxe utilisant la méthode do() :

#!/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 = 'DELETE FROM VENTE WHERE numVendeur = 5';

$dbd->do($requete)
    or die 'Impossible d\'exécuter la requête : '.$dbd->errstr;

$dbd->disconnect;

En comptant le nombre de lignes

Si vous voulez absolument afficher le nombre de lignes affectées, Pour tout ce qui est requête de sélection, il conviendra de privilégier la syntaxe utilisant les méthodes prepare() et execute :

#!/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 = 'DELETE FROM VENTE WHERE numVendeur = 5';

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;

print 'Ligne(s) modifiée(s) : '.$prep->rows;

$prep->finish;

$dbd->disconnect;

Le prochain chapitre étant un gros morceau, je vous conseille de prendre une petite pause afin de vérifier que vous avez bien assimilé ce que nous avons vu jusqu’ici !

Commentaires