Exercice : comptabilité personnelle — version allégée
💶 Présentation
Version simplifiée de l'exercice de comptabilité personnelle : un seul compte, une seule table, mais avec le pointage des transactions — la notion la plus utile à comprendre pour un usage réel avec sa banque.
Objectifs pédagogiques
CRUD complet sur une seule table (Créer / Lire / Modifier / Supprimer)
Comprendre la différence entre deux soldes :
le solde théorique : tout ce qui est enregistré
le solde pointé : uniquement ce que la banque a confirmé sur le relevé
Retrouver le motif POST → redirection → GET déjà vu dans le carnet de contacts
Pourquoi cette version allégée ?
La version complète ajoute les cartes bancaires, la validation mensuelle et les transactions récurrentes — donc plusieurs tables reliées entre elles et une navigation par onglets en session PHP. Cette version-ci se concentre sur un seul concept nouveau à la fois : le pointage. Le multi-comptes et les cartes pourront venir dans un second temps, une fois celle-ci bien assimilée.
Script SQL de création de la base et des données de démonstration
⚙️ Prérequis
Environnement nécessaire
PHP 7.4+ avec l'extension pdo_mysql activée
MariaDB 10.3+ (ou MySQL 5.7+)
Apache, ou simplement le serveur PHP intégré (php -S localhost:8080)
🚀 Installation pas à pas
1. Créer la base de données
mysql-uroot-p<schema_compta.sql
2. Configurer la connexion et le solde de départ
Dans config.php, ajuster les identifiants et le solde initial du compte :
define('DB_USER', 'root');define('DB_PASS', '');define('SOLDE_INITIAL', 1000.00); // à adapter à votre situation
3. Lancer l'application
php-Slocalhost:8080
Puis ouvrir http://localhost:8080/index.php.
🧩 Fonctionnalités
Fonctionnalité
Méthode
Détail
Ajouter une transaction
POST
Libellé, montant, type (revenu/dépense), date
Lister les transactions
GET
Triées par date décroissante
Pointer / dépointer
GET
Simple lien qui bascule l'état (NOT pointe), la ligne passe en vert
Supprimer une transaction
GET
Avec confirmation JavaScript (confirm())
Calcul des deux soldes
—
Recalculés à chaque affichage à partir des données en base
💡 Le point clé : pourquoi deux soldes ?
Comme avec un relevé papier
Quand on tient ses comptes « à la main », on note une dépense dès qu'on la fait — mais elle ne débite le compte en banque que quelques jours plus tard. Le solde théorique correspond à son propre carnet ; le solde pointé correspond à ce que la banque a réellement traité, vérifié ligne à ligne sur le relevé. Les deux soldes ne sont identiques que lorsque tout a été pointé.
Dans le code, cela se traduit simplement par une colonne pointe (0 ou 1) et deux requêtes SQL quasi identiques : la seconde ajoute juste WHERE pointe = 1. C'est une bonne occasion de montrer aux élèves comment une même logique de calcul peut être filtrée différemment selon le besoin.
🔐 Sécurité
Anti-injection SQL : toutes les requêtes utilisent des requêtes préparées PDO
Anti-XSS : toutes les sorties HTML passent par htmlspecialchars()
Motif PRG : les formulaires POST redirigent vers GET pour éviter la re-soumission
Cast entier : les identifiants provenant de l'URL sont castés en (int)
Validation côté serveur : is_numeric() sur le montant, in_array() sur le type (liste blanche)
<?php/** * ============================================================ * config.php — Connexion à la base de données * ============================================================ * * Version « allégée » : un seul compte, pas de table dédiée * pour le représenter. Le solde de départ est simplement une * constante ci-dessous, à adapter au montant réel de départ. * ============================================================ */// --- Paramètres de connexion -----------------------------------define('DB_HOST','localhost');define('DB_NAME','comptabilite_perso_lite');define('DB_USER','root');// ⚠️ à remplacer par un utilisateur dédiédefine('DB_PASS','');// ⚠️ mot de passe MariaDB// --- Solde de départ du compte (avant la première transaction) --define('SOLDE_INITIAL',1000.00);// à adapter à votre situationfunctiongetConnection():PDO{$dsn="mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4";$options=[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,PDO::ATTR_EMULATE_PREPARES=>false,];returnnewPDO($dsn,DB_USER,DB_PASS,$options);}
-- ============================================================-- schema.sql — Comptabilité personnelle (version allégée)-- Un seul compte, une seule table.---- À exécuter une seule fois :-- mysql -u root -p < schema_compta.sql-- ============================================================CREATEDATABASEIFNOTEXISTScomptabilite_perso_liteCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;USEcomptabilite_perso_lite;-- Une seule table suffit : c'est volontaire. Le multi-comptes,-- les cartes et la validation mensuelle viendront plus tard,-- une fois ce modèle simple bien compris.CREATETABLEIFNOTEXISTStransactions(idINTAUTO_INCREMENTPRIMARYKEY,libelleVARCHAR(150)NOTNULL,montantDECIMAL(10,2)NOTNULL,typeENUM('revenu','depense')NOTNULL,date_transactionDATENOTNULL,-- pointe = la transaction a été vérifiée sur le relevé bancaire.-- 0 = pas encore pointée, 1 = pointée.pointeTINYINT(1)NOTNULLDEFAULT0,created_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP)ENGINE=InnoDB;-- Quelques mouvements de démonstrationINSERTINTOtransactions(libelle,montant,type,date_transaction,pointe)VALUES('Salaire',1800.00,'revenu','2026-09-01',1),('Loyer',650.00,'depense','2026-09-02',1),('Courses Carrefour',84.30,'depense','2026-09-05',1),('Abonnement internet',39.90,'depense','2026-09-05',0),('Remboursement CAF',120.00,'revenu','2026-09-10',0),('Restaurant',45.60,'depense','2026-09-12',0);