📖 1. Introduction à Web SQL Database
Web SQL Database est une API permettant de stocker des données dans une base de données relationnelle SQL côté client (navigateur).
❌ Web SQL
- Déprécié depuis 2010
- Support limité aux navigateurs basés sur WebKit (Chrome, Safari, Edge)
- Non supporté par Firefox
✅ IndexedDB (alternative)
- Standards modernes
- Supporté par tous les navigateurs
- Plus performant et flexible
🛠️ 2. Méthodes principales
openDatabase()
Crée ou ouvre une base de données
transaction()
Gère les transactions (groupes d'opérations)
executeSql()
Exécute une requête SQL
// Structure de base
const db = openDatabase(nom, version, description, taille, callback);
db.transaction(function(tx) {
tx.executeSql(requeteSQL, parametres, successCallback, errorCallback);
});
📂 3. Opening Database
La méthode openDatabase() permet de créer ou d'ouvrir une base de données existante.
// Syntaxe
const db = openDatabase(
'maBase', // Nom de la base
'1.0', // Version
'Description de la base', // Description
5 * 1024 * 1024, // Taille (5 Mo)
function(db) { // Callback de création
console.log('Base créée');
}
);
📌 Paramètres
- name : Nom de la base de données (unique)
- version : Numéro de version (chaîne)
- displayName : Description lisible
- estimatedSize : Taille estimée en octets (généralement 5Mo)
- creationCallback : Fonction appelée lors de la création
📝 Démo : Ouvrir/Créer une base
🔍 4. Executing Queries
La méthode executeSql() permet d'exécuter des requêtes SQL à l'intérieur d'une transaction.
db.transaction(function(tx) {
// Créer une table
tx.executeSql(
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)',
[],
function() { console.log('Table créée'); },
function(error) { console.log('Erreur:', error); }
);
});
📌 Syntaxe executeSql
- sqlStatement : La requête SQL (avec des ? pour les paramètres)
- arguments : Tableau des paramètres
- successCallback : Fonction appelée en cas de succès
- errorCallback : Fonction appelée en cas d'erreur
📝 5. INSERT Operation
Insertion de données dans une table via la commande SQL INSERT.
db.transaction(function(tx) {
// Insertion simple
tx.executeSql(
'INSERT INTO users (name, email) VALUES (?, ?)',
['Jean Dupont', 'jean@email.com'],
function(tx, result) {
console.log('ID inséré:', result.insertId);
console.log('Lignes affectées:', result.rowsAffected);
},
function(error) {
console.log('Erreur INSERT:', error);
}
);
});
📝 Démo : Insérer des données
📖 6. READ Operation
Lecture des données via la commande SQL SELECT.
db.transaction(function(tx) {
tx.executeSql(
'SELECT * FROM users',
[],
function(tx, results) {
const len = results.rows.length;
for(let i = 0; i < len; i++) {
const row = results.rows.item(i);
console.log(row.name, row.email);
}
},
function(error) {
console.log('Erreur SELECT:', error);
}
);
});
📌 Objet results
- rows.length : Nombre de lignes retournées
- rows.item(i) : Récupère la ligne à l'index i
- rowsAffected : Nombre de lignes affectées (pour INSERT/UPDATE/DELETE)
- insertId : ID auto-généré (pour INSERT)
📝 Démo : Lire les données
🎯 7. Exemple complet : Gestionnaire de contacts
<!DOCTYPE html>
<html>
<head>
<title>Gestionnaire de contacts</title>
<style>
body { font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; }
input, button { padding: 8px; margin: 5px; }
.contact { border-bottom: 1px solid #ddd; padding: 10px; }
</style>
</head>
<body>
<h1>📒 Gestionnaire de contacts</h1>
<div>
<input type="text" id="nom" placeholder="Nom">
<input type="text" id="telephone" placeholder="Téléphone">
<button id="ajouter">➕ Ajouter</button>
</div>
<div id="listeContacts"></div>
<script>
// Ouvrir la base de données
const db = openDatabase('contacts', '1.0', 'Liste de contacts', 2 * 1024 * 1024);
// Créer la table
db.transaction(function(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS contacts (id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT, telephone TEXT)');
});
// Ajouter un contact
document.getElementById('ajouter').onclick = function() {
const nom = document.getElementById('nom').value;
const telephone = document.getElementById('telephone').value;
db.transaction(function(tx) {
tx.executeSql('INSERT INTO contacts (nom, telephone) VALUES (?, ?)', [nom, telephone],
function() { afficherContacts(); },
function(error) { console.log('Erreur:', error); }
);
});
document.getElementById('nom').value = '';
document.getElementById('telephone').value = '';
};
// Afficher les contacts
function afficherContacts() {
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM contacts', [], function(tx, results) {
const html = [];
for(let i = 0; i < results.rows.length; i++) {
const c = results.rows.item(i);
html.push(`<div class="contact">
<strong>${c.nom}</strong> - ${c.telephone}
<button onclick="supprimer(${c.id})">❌ Supprimer</button>
</div>`);
}
document.getElementById('listeContacts').innerHTML = html.join('') || 'Aucun contact';
});
});
}
// Supprimer un contact
window.supprimer = function(id) {
db.transaction(function(tx) {
tx.executeSql('DELETE FROM contacts WHERE id = ?', [id], afficherContacts);
});
};
afficherContacts();
</script>
</body>
</html>
📝 Démo : Gestionnaire de contacts complet
⚠️ 8. Limitations et compatibilité
📌 Support navigateurs
- ✅ Chrome : Supporté
- ✅ Safari : Supporté (iOS, macOS)
- ✅ Edge : Supporté (basé sur Chromium)
- ❌ Firefox : Non supporté
- ❌ Opera : Supporté (basé sur Chromium)
📌 Alternatives modernes
- IndexedDB : API moderne pour bases de données NoSQL côté client
- localStorage : Pour stockage simple clé/valeur
- PouchDB / Dexie.js : Bibliothèques de haut niveau
// Détection du support Web SQL
if (window.openDatabase) {
console.log('Web SQL est supporté');
// Utiliser Web SQL
} else {
console.log('Web SQL NON supporté, utilisez IndexedDB');
// Fallback vers IndexedDB ou localStorage
}
📝 Tableau récapitulatif
| Méthode | Description | Exemple |
|---|---|---|
openDatabase() |
Crée/ouvre une base | openDatabase('db', '1.0', 'desc', 5*1024*1024) |
transaction() |
Démarre une transaction | db.transaction(function(tx) {...}) |
executeSql() |
Exécute une requête SQL | tx.executeSql('SELECT * FROM table', [], success, error) |
CREATE TABLE |
Crée une table | CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT) |
INSERT INTO |
Insère des données | INSERT INTO users (name) VALUES (?) |
SELECT * FROM |
Lit des données | SELECT * FROM users |
DELETE FROM |
Supprime des données | DELETE FROM users WHERE id = ? |
📌 Quiz de vérification
Question 1 : Quelle méthode permet d'ouvrir une base de données Web SQL ?
openDatabase(nom, version, description, taille, callback)
Question 2 : Quelle est la principale limite de Web SQL Database ?
Web SQL est déprécié et n'est pas supporté par Firefox. Il est remplacé par IndexedDB.
Question 3 : Comment insérer des données avec executeSql ?
tx.executeSql('INSERT INTO table (col1, col2) VALUES (?, ?)', [valeur1, valeur2], successCallback, errorCallback);
Question 4 : Quelle alternative moderne recommandez-vous à la place de Web SQL ?
IndexedDB – une API NoSQL moderne supportée par tous les navigateurs.