OUJOOD.COM
Introduction
La clause WHERE en SQL est un élément clé pour filtrer les données dans une base de données. Elle est utilisée avec les commandes SELECT, UPDATE et DELETE pour sélectionner ou modifier uniquement les lignes répondant à des critères spécifiques. Dans ce tutoriel, nous allons explorer son utilisation dans un projet Node.js avec MySQL.
Configurer MySQL avec Node.js
1. Installer MySQL
Pour commencer, installez le module MySQL avec la commande suivante :
npm install mysql
2. Créer une connexion à la base de données
Configurez une connexion à votre base de données MySQL :
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "votre_mot_de_passe",
database: "ma_base"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connecté à la base de données !");
});
Explication : Ce code crée une connexion à la base de données MySQL. L'objet mysql.createConnection permet de se connecter à une base locale appelée ma_base avec l'utilisateur root. Si la connexion échoue, une erreur sera levée et affichée dans la console.
Syntaxe de la clause WHERE
Voici la structure générale de la clause WHERE :
SELECT colonne1, colonne2 FROM table WHERE condition;
condition : Peut inclure des opérateurs comme =, >, <, BETWEEN, LIKE, ou IN.
Les opérateurs courants
| Opérateur | Description |
|---|---|
| = | Égal à |
| > | Supérieur à |
| < | Inférieur à |
| >= | Supérieur ou égal à |
| <= | Inférieur ou égal à |
| != | Différent de |
| LIKE | Recherche d’un motif |
| IN | Correspond à une liste de valeurs |
| BETWEEN | Entre deux valeurs incluses |
Exemple : Filtrer les données avec WHERE
Voici un exemple simple pour récupérer les employés avec un salaire supérieur à 30 000 :
var qry = "SELECT nom, salaire FROM employes WHERE salaire > 30000;";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Sortie attendue :
[
{ "nom": "Alice", "salaire": 35000 },
{ "nom": "Bob", "salaire": 40000 }
]
Explication : Dans cet exemple, la requête SQL utilise la clause WHERE pour filtrer les résultats et ne sélectionner que les employés dont le salaire est supérieur à 30 000. La méthode con.query envoie cette requête à la base de données et les résultats sont affichés dans la console.
Combiner des conditions avec AND et OR
Vous pouvez combiner plusieurs conditions en utilisant les opérateurs AND et OR. Exemple :
var qry = "SELECT nom, poste FROM employes WHERE salaire > 30000 AND poste = 'Manager';";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Sortie attendue :
[
{ "nom": "Caroline", "poste": "Manager" }
]
Explication : Cette requête SQL combine deux conditions : salaire > 30000 et poste = 'Manager' en utilisant l'opérateur AND. Seuls les employés qui remplissent les deux conditions seront récupérés dans les résultats.
Utiliser BETWEEN pour des plages de valeurs
Pour vérifier si une valeur se trouve dans une plage définie :
var qry = "SELECT nom, salaire FROM employes WHERE salaire BETWEEN 25000 AND 35000;";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Sortie attendue :
[
{ "nom": "David", "salaire": 30000 },
{ "nom": "Eve", "salaire": 27000 }
]
Explication : La clause BETWEEN est utilisée ici pour filtrer les employés dont le salaire est compris entre 25 000 et 35 000. Cela permet de spécifier une plage de valeurs, ce qui est pratique pour des critères de sélection plus précis.
Rechercher avec LIKE
Le mot-clé LIKE est utilisé pour rechercher un motif particulier dans une chaîne de caractères :
var qry = "SELECT nom FROM employes WHERE nom LIKE 'A%';";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Sortie attendue :
[
{ "nom": "Alice" },
{ "nom": "Alan" }
]
Explication : Le mot-clé LIKE permet de rechercher une correspondance de motifs dans les chaînes de caractères. Ici, le motif 'A%' signifie que le nom des employés commence par la lettre A, suivi de n'importe quel nombre de caractères.
Utiliser IN pour une liste de valeurs
Pour vérifier si une valeur fait partie d’une liste :
var qry = "SELECT nom FROM employes WHERE nom IN ('Alice', 'Bob', 'Eve');";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Sortie attendue :
[
{ "nom": "Alice" },
{ "nom": "Bob" },
{ "nom": "Eve" }
]
Explication : L'opérateur IN permet de vérifier si une valeur est présente dans une liste de valeurs spécifiques. Ici, la requête sélectionne les employés dont le nom figure dans la liste spécifiée : 'Alice', 'Bob', 'Eve'.
Conclusion et bonnes pratiques
- Sanitisation des entrées : Toujours vérifier et nettoyer les données des utilisateurs pour éviter les injections SQL.
- Tests fréquents : Effectuez des tests sur vos requêtes pour garantir leur performance et leur exactitude.
Échappement des Valeurs de la Requête
Lorsqu'on travaille avec une base de données, il est essentiel de protéger son application contre les attaques par injection SQL. Cela consiste à échapper correctement les valeurs des requêtes avant leur exécution. MySQL offre des méthodes efficaces pour cela.
Pourquoi l'Échappement est Important ?
Sans échappement, un utilisateur malveillant pourrait injecter du code SQL directement dans vos requêtes, compromettant ainsi la sécurité de vos données. Par exemple :
var nomUtilisateur = "' OR '1'='1";
var qry = "SELECT * FROM employes WHERE nom = '" + nomUtilisateur + "';";
// Cette requête devient : SELECT * FROM employes WHERE nom = '' OR '1'='1';
Explication : La condition ' OR '1'='1' retourne toujours TRUE, permettant à l'attaquant d'accéder à toutes les données des employés.
Comment échapper les valeurs en MySQL avec Node.js ?
Le module mysql offre deux méthodes principales pour échapper les valeurs : mysql.escape et les requêtes paramétrées.
1. Utilisation de mysql.escape
Voici un exemple simple avec mysql.escape :
var mysql = require('mysql');
var nomUtilisateur = "' OR '1'='1";
var nomEchappe = mysql.escape(nomUtilisateur);
var qry = "SELECT * FROM employes WHERE nom = " + nomEchappe + ";";
con.query(qry, function(err, results) {
if (err) throw err;
console.log(results);
});
Explication : La fonction mysql.escape échappe automatiquement les caractères spéciaux dans la valeur nomUtilisateur, empêchant ainsi toute injection SQL.
2. Utilisation des Requêtes Paramétrées
Les requêtes paramétrées sont une méthode encore plus sûre et recommandée. Voici un exemple :
var nomUtilisateur = "' OR '1'='1";
var qry = "SELECT * FROM employes WHERE nom = ?;";
con.query(qry, [nomUtilisateur], function(err, results) {
if (err) throw err;
console.log(results);
});
Explication :
- Le point d'interrogation (
?) dans la requête agit comme un espace réservé pour la valeur du paramètre. - La méthode
con.queryéchappe automatiquement le contenu denomUtilisateur. - Cela garantit que la valeur est utilisée uniquement comme donnée et non comme partie de la commande SQL.
Avantages des Méthodes Paramétrées
- Évite automatiquement les erreurs d'échappement manuel.
- Compatible avec plusieurs types de bases de données et bibliothèques SQL.
- Recommandé par les bonnes pratiques de sécurité.
Bonnes Pratiques pour Sécuriser vos Requêtes SQL
- Évitez d'utiliser la concaténation de chaînes : Préférez toujours les requêtes paramétrées.
- Sanitisez les entrées utilisateur : Vérifiez et nettoyez toutes les données avant de les utiliser.
- Utilisez des comptes utilisateur restreints : Configurez des comptes avec des droits limités sur votre base de données.