# 🔧 TROUBLESHOOTING - CRÉATION DE MODULES

Ce document liste TOUS les problèmes rencontrés lors de la création des modules et leurs solutions.

---

## ❌ PROBLÈME #1 : Parse Error - Échappement PHP

### Erreur
```
Parse error: syntax error, unexpected single-quoted string "Asie", expecting "]" in MODULE_2_COMPLET.php on line 199
```

### Cause
Utilisation de `''` (deux guillemets simples consécutifs) dans les tableaux PHP au lieu de `\'` (backslash quote).

```php
// ❌ MAUVAIS - Cause Parse Error
$exemples = [
    [
        'description' => 'Les pays d''Europe',  // ERREUR !
        'sql' => 'SELECT * WHERE continent = ''Europe'''  // ERREUR !
    ]
];
```

### Solution
Utiliser `\'` (backslash) pour échapper les apostrophes dans les tableaux PHP :

```php
// ✅ BON - Échappement correct
$exemples = [
    [
        'description' => 'Les pays d\'Europe',
        'sql' => 'SELECT * WHERE continent = \'Europe\''
    ]
];

// ✅ ALTERNATIVE - Utiliser des guillemets doubles
$exemples = [
    [
        "description" => "Les pays d'Europe",
        "sql" => "SELECT * WHERE continent = 'Europe'"
    ]
];
```

### Règle d'or
- **Dans les tableaux PHP** : `\'` (backslash quote)
- **Pour l'insertion SQL** : `''` (double quote simple) via `str_replace("'", "''", $text)`

---

## ❌ PROBLÈME #2 : Leçon non trouvée (404)

### Erreur
```
Leçon non trouvée
La leçon que vous recherchez n'existe pas ou n'est pas encore disponible.
```

### Cause
Les slugs dans la sidebar (`html/page/layout/sidebar.php`) ne correspondent pas aux slugs réellement insérés en base de données.

**Exemple** :
- Sidebar : `cours.php?slug=tri-multiple`
- Base de données : `slug = 'order-by-tri'`

### Solution
1. Vérifier les slugs réels en base :
```bash
php check_slugs.php
```

2. Mettre à jour la sidebar avec les VRAIS slugs :
```bash
php generate_sidebar_module.php 2
```

3. Copier le code généré dans `html/page/layout/sidebar.php`

---

## ❌ PROBLÈME #3 : Fichier corrompu par sed

### Erreur
```
Parse error: unexpected token "="
```

### Cause
Utilisation de `sed` pour remplacer `''` par `\'` a corrompu le fichier entier.

```bash
# ❌ COMMANDE DANGEREUSE
sed -i "s/= ''/'= \\'/g; s/''/\\'/g" MODULE_2_COMPLET.php
```

### Solution
**NE JAMAIS utiliser sed pour corriger les échappements PHP !**

- Soit créer le fichier correctement dès le départ
- Soit utiliser un éditeur de texte avec rechercher/remplacer
- Soit recréer le fichier from scratch

---

## ❌ PROBLÈME #4 : Contenu HTML trop volumineux

### Erreur
```
ORA-xxxxx: String literal too long
```

### Cause
ORDS a une limite de ~3000 caractères par INSERT. Un contenu HTML de 4500+ caractères dépasse cette limite.

### Solution
Réduire la taille du contenu HTML :
- Simplifier les explications (garder 400+ mots mais en HTML concis)
- Supprimer les espaces inutiles
- Éviter les longs exemples de code dans le HTML
- Mettre les exemples de code dans la table COURS_EXEMPLES

```php
// ❌ TROP LONG
$contenu = <<<HTML
<div>
    <h2>Titre très long avec beaucoup d'explications...</h2>
    <section>
        <p>Paragraphe 1 avec 500 mots...</p>
        <p>Paragraphe 2 avec 500 mots...</p>
        <pre><code>Exemple de code très long...</code></pre>
        <!-- ... 4500 caractères au total -->
    </section>
</div>
HTML;

// ✅ BON - Concis mais complet
$contenu = <<<HTML
<div class="lecon-content">
    <h2>Titre</h2>
    <section>
        <h3>Introduction</h3>
        <p>Explication claire et concise (200 mots).</p>
    </section>
    <section>
        <h3>Syntaxe</h3>
        <pre><code>SELECT ... FROM ...</code></pre>
    </section>
</div>
HTML;
```

---

## ❌ PROBLÈME #5 : IDs non récupérés

### Erreur
```
Undefined array key 'lecon_id'
```

### Cause
Tentative d'utiliser `CURRVAL` avec ORDS (ne fonctionne pas).

### Solution
Récupérer l'ID par SELECT après COMMIT avec le slug :

```php
// ❌ MAUVAIS - CURRVAL ne fonctionne pas avec ORDS
$db->executeDML($insert_lecon);
$lecon_id = $db->executeQuery("SELECT SEQ_COURS_LECON.CURRVAL FROM DUAL")['data'][0]['currval'];

// ✅ BON - SELECT avec slug
$db->executeDML($insert_lecon);
$db->executeDML("COMMIT");
$result = $db->executeQuery("SELECT lecon_id FROM COURS_LECONS WHERE slug = 'mon-slug' AND module_id = 2");
$lecon_id = $result['data'][0]['lecon_id'];  // Clés en MINUSCULES !
```

---

## ❌ PROBLÈME #6 : Colonnes inexistantes

### Erreur
```
ORA-00904: "DESCRIPTION": invalid identifier
```

### Cause
Utilisation de colonnes qui n'existent pas dans les tables.

### Solution
Vérifier les colonnes exactes avec :

```bash
php data/seeds/show_structures.php
```

**Colonnes RÉELLES** :

```sql
COURS_EXEMPLES:
- exemple_id
- lecon_id
- titre
- explication        -- PAS 'description' !
- code_sql
- resultat_attendu
- ordre_affichage

COURS_EXERCICES:
- exercice_id
- lecon_id
- titre
- enonce            -- PAS 'description' !
- difficulte
- solution_sql
- ordre_affichage
-- PAS de colonne 'points' !
```

---

## ✅ CHECKLIST ANTI-ERREURS

Avant de créer un module, vérifier :

- [ ] Échappement PHP : `\'` dans les tableaux, jamais `''`
- [ ] Contenu HTML < 2500 caractères
- [ ] Slugs uniques et cohérents
- [ ] Colonnes exactes (pas de 'description' ni 'points')
- [ ] Récupération ID par SELECT après COMMIT
- [ ] Clés en minuscules : `['lecon_id']` pas `['LECON_ID']`

Après création :

- [ ] Exécuter le script
- [ ] Vérifier les stats finales
- [ ] Générer code sidebar : `php generate_sidebar_module.php X`
- [ ] Copier dans sidebar.php
- [ ] Tester les URLs
- [ ] Vérifier affichage dans l'interface

---

## 🛠️ SCRIPTS HELPER

```bash
# Vérifier les slugs
php check_slugs.php

# Générer le code sidebar
php generate_sidebar_module.php 2

# Vérifier structures tables
php data/seeds/show_structures.php

# Exécuter un module
php data/seeds/MODULE_2_COMPLET.php
```

---

## 📚 RÉFÉRENCES

- Guide complet : `GUIDE_CREATION_MODULES.md`
- Module de référence : `data/seeds/MODULE_1_COMPLET.php`
- Sidebar : `html/page/layout/sidebar.php`
