Blog technique sur mes expériences de développeur.
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 :
Ne vous inquiétez pas, le plus dur est derrière nous. ;)
Ce cours était originalement publié sur la plateforme OpenClassrooms. La plateforme OpenClassrooms ayant supprimée ce tutoriel en 2020 et le tutoriel étant sous licence CC BY-SA 4.0, je vous propose de le (re)découvrir ici.
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...
Comment compter le nombre de lignes affectées par ces requêtes, alors ?
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.
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
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
Je vous propose de faire un petit résumé de ce que nous avons vu jusqu’ici.
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;
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;
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 !