🛠️ JsonSQL-Demo: Table Repair (tableAnalyseRepair)

🧪 Feld email aus Zeile 0 entfernt (Simuliert).
🧪 Feld firstname aus Zeile 3 entfernt (Simuliert).
🧪 Feld lastname aus Zeile 3 entfernt (Simuliert).
🧪 Zusatzfeld debug in Zeile 1 eingefügt (Simuliert).
🧪 Zusatzfeld demo in Zeile 1 eingefügt (Simuliert).

🛠️ Demo: Table Repair für repairanalyze_demo

Diese Seite repariert alle Datensätze gemäß system.json: Fehlende Pflichtfelder werden ergänzt, unerlaubte Felder entfernt und die Reihenfolge der Felder wird an die Systemdefinition angepasst.

⚠️ Es wurden 4 fehlerhafte Einträge gefunden:
# Fehlende Felder Zusätzliche Felder Auszug (sortiert nach Systemdefinition)
1 email {"firstname":"Erika","lastname":"Mustermann","email":null,"phone":"0154 345 67","created_at":"2025-06-16 19:31:19"}...
2 debug, demo {"firstname":"Max","lastname":"Muster","email":"max@example.com","phone":"0123 456 78","created_at":"2025-06-16 19:31:19...
3 foo {"firstname":"Anna","lastname":"Beispiel","email":"anna@example.com","phone":"089 123 456","created_at":"2025-06-16 19:3...
4 firstname, lastname bar {"firstname":null,"lastname":null,"email":"karl@example.com","phone":"","created_at":"2025-06-16 19:31:19"}...

📋 Aktuelle Datensätze (nach Systemdefinition sortiert):

System Datei:repairanalyze_demo.system.json

{
    "fields": {
        "firstname": {
            "dataType": "string",
            "required": true,
            "length": 50
        },
        "lastname": {
            "dataType": "string",
            "required": true,
            "length": 50
        },
        "email": {
            "dataType": "string",
            "required": true,
            "length": 64
        },
        "phone": {
            "dataType": "string",
            "length": 64
        },
        "created_at": {
            "dataType": "datetime",
            "auto_create_timestamp": true
        }
    },
    "allowAdditionalFields": true,
    "validateOnUpdate": true,
    "repairanalyze_demo": "allowAdditionalFields"
}

JsonSQL Datei: repairanalyze_demo.json

[
    {
        "firstname": "Erika",
        "lastname": "Mustermann",
        "email": null,
        "phone": "0154 345 67",
        "created_at": "2025-06-16 19:31:19"
    },
    {
        "firstname": "Max",
        "lastname": "Muster",
        "email": "max@example.com",
        "phone": "0123 456 78",
        "created_at": "2025-06-16 19:31:19"
    },
    {
        "firstname": "Anna",
        "lastname": "Beispiel",
        "email": "anna@example.com",
        "phone": "089 123 456",
        "created_at": "2025-06-16 19:31:19"
    },
    {
        "firstname": null,
        "lastname": null,
        "email": "karl@example.com",
        "phone": "",
        "created_at": "2025-06-16 19:31:19"
    }
]
Fehlende Daten ergänzt & Felder sortiert

Im Rahmen der automatischen Reparatur der Tabelle wurden folgende Maßnahmen durchgeführt:

  • Fehlende Felder ergänzt:
    Alle Datensätze wurden auf erforderliche Felder gemäß Systemdefinition geprüft. Fehlende Felder wurden automatisch ergänzt. Als Wert wurde jeweils der Standardwert (default) aus der Systemdefinition übernommen – sofern vorhanden, andernfalls wurde das Feld auf null gesetzt.
  • Felder sortiert:
    Die Reihenfolge der Felder in jedem Datensatz wurde angepasst und entspricht nun exakt der Systemdefinition (system.json). Zusätzliche Felder befinden sich, falls erlaubt, nun am Ende jedes Datensatzes.
  • Optionale Maßnahmen:
    Wenn aktiviert, wurden nicht definierte Felder entfernt. Dadurch entsprechen alle Datensätze exakt dem gewünschten Schema.
  • Protokollierung:
    Alle Änderungen wurden protokolliert. Für jeden betroffenen Datensatz wird aufgeführt, welche Felder ergänzt oder entfernt wurden und dass die Reihenfolge der Felder angepasst wurde.

Ergebnis: Alle Datensätze sind nun konsistent, sauber strukturiert und entsprechen exakt der Systemdefinition. Die Daten sind optimal für Export, Schnittstellen oder Weiterverarbeitung vorbereitet.

JsonSQL Datei: repairanalyze_demo.json (Vor der Reparatur)

[
    {
        "firstname": "Erika",
        "lastname": "Mustermann",
        "phone": "0154 345 67",
        "created_at": "2025-06-16 19:31:19"
    },
    {
        "firstname": "Max",
        "lastname": "Muster",
        "email": "max@example.com",
        "phone": "0123 456 78",
        "created_at": "2025-06-16 19:31:19",
        "debug": "X",
        "demo": "true"
    },
    {
        "firstname": "Anna",
        "lastname": "Beispiel",
        "email": "anna@example.com",
        "phone": "089 123 456",
        "created_at": "2025-06-16 19:31:19",
        "foo": "EXTRA"
    },
    {
        "email": "karl@example.com",
        "phone": "",
        "created_at": "2025-06-16 19:31:19",
        "bar": "!!!"
    }
]

<?php
/**
 * ============================================================
 * 🧪 JsonSQL Demo #AnalyzeTable – Validierung gegen Systemtabelle
 * ============================================================
 * 
 * Zweck:
 * Analysiert eine Tabelle auf fehlende oder zu viele Felder im Vergleich
 * zur system.json-Konfiguration und zeigt die Probleme an.
 * 
 * Datei: demo_analyzeTable.php
 * Pfad: demos/demo_analyzeTable.php
 * 
 * Autor: Dscho Teitge (https://teitge.de)
 * Stand: <?= date('Y-m-d') ?>
 * ============================================================
 */

$pageTitle = "🛠️ JsonSQL-Demo: Table Repair (tableAnalyseRepair)";
$pageDescription = "In dieser JsonSQL-Demo werden alle Datensätze einer Tabelle automatisch an die Systemdefinition angepasst: Fehlende Pflichtfelder werden ergänzt, unerlaubte Felder entfernt und die Feldreihenfolge nach <code>system.json</code> vereinheitlicht. Ideal zur Datenbereinigung und Qualitätssicherung.";


require_once __DIR__ . '/../../src/JsonSQL.php';
require_once __DIR__ . '/../includes/header.php';

use Src\JsonSQL;

try {

// Init
$db = new JsonSQL(['demo' => __DIR__ . '/../testdb']);
$db->use('demo');
$table = 'repairanalyze_demo';
$db->truncate($table,true); // Daten & System zurücksetzen

// Systemdefinition
$db->addFieldDefinition('firstname', ['dataType' => 'string', 'required' => true, 'length' => 50]);
$db->addFieldDefinition('lastname', ['dataType' => 'string', 'required' => true, 'length' => 50]);
$db->addFieldDefinition('email', ['dataType' => 'string', 'required' => true, 'length' => 64]);
$db->addFieldDefinition('phone', ['dataType' => 'string', 'length' => 64]);
$db->addFieldDefinition('created_at', ['dataType' => 'datetime', 'auto_create_timestamp' => true]);
$db->setSystemOption($table,'allowAdditionalFields', false);

// Testdatensätze
$testData = [
    [ // ok
        'firstname' => 'Erika',
        'lastname' => 'Mustermann',
        'email' => 'erika@example.com',
        'phone' => '0154 345 67'
    ],
    [ // fehlt lastname
        'firstname' => 'Max',
        'lastname' => 'Muster',        
        'email' => 'max@example.com',
        'phone' => '0123 456 78'
    ],
    [ // hat extra Feld "foo"
        'firstname' => 'Anna',
        'lastname' => 'Beispiel',
        'email' => 'anna@example.com',
        'phone' => '089 123 456',
        'foo' => 'EXTRA'
    ],
    [ // fehlt phone (ok), aber hat bar (extra)
        'firstname' => 'Karl',
        'lastname' => 'Überraschung',
        'email' => 'karl@example.com',
        'bar' => '!!!'
    ]
];

foreach ($testData as $entry) {
    try {
        $db->insert($entry);
    } catch (Exception $e) {
        echo "<div class='alert alert-warning'>Insert-Fehler: " . $e->getMessage() . "</div>";
    }
}


/**
 * Simuliert das Entfernen eines Feldes aus einem Datensatz (z. B. um einen Pflichtfeldfehler zu erzeugen)
 */
function simulateMissingField(JsonSQL $db, string $field, int $rowIndex = 0): void {
    $data = $db->loadTable();
    if (isset($data[$rowIndex][$field])) {
        unset($data[$rowIndex][$field]);
        file_put_contents($db->getCurrentTableFile(), json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        echo "<div class='alert alert-info'>🧪 Feld <code>$field</code> aus Zeile $rowIndex entfernt (Simuliert).</div>";
    }
}

/**
 * Simuliert das Einfügen eines zusätzlichen (nicht erlaubten) Feldes
 */
function simulateExtraField(JsonSQL $db, string $field, $value = 'EXTRA', int $rowIndex = 0): void {
    $data = $db->loadTable();
    if (isset($data[$rowIndex])) {
        $data[$rowIndex][$field] = $value;
        file_put_contents($db->getCurrentTableFile(), json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        echo "<div class='alert alert-info'>🧪 Zusatzfeld <code>$field</code> in Zeile $rowIndex eingefügt (Simuliert).</div>";
    }
}

// 🧪 Manuelle Manipulation zum Testen
simulateMissingField($db, 'email', 0);         // Entfernt 'email' aus erstem Datensatz
simulateMissingField($db, 'firstname', 3);         // Entfernt 'email' aus erstem Datensatz
simulateMissingField($db, 'lastname', 3);         // Entfernt 'email' aus erstem Datensatz
simulateExtraField($db, 'debug', 'X', 1);      // Fügt Feld 'debug' in zweiten Datensatz ein
simulateExtraField($db, 'demo', 'true', 1);      // Fügt Feld 'debug' in zweiten Datensatz ein


$data_before_repair = htmlspecialchars(file_get_contents(__DIR__ . '/../testdb/repairanalyze_demo.json'));

$result = $db->analyzeRepairTable($table, true, true, true, true); // zeigt auch erlaubte Zusatzfelder


$debugger->dump($result,$db);



$db->setTable($table,true); // Tabelle neu laden
$rows = $db->select('*')->get();

?>
<div class="container mt-4">
<h1>🛠️ Demo: Table Repair für <code><?= $table ?></code></h1>
<p class="lead">
  Diese Seite repariert alle Datensätze gemäß <code>system.json</code>: Fehlende Pflichtfelder werden ergänzt, unerlaubte Felder entfernt und die Reihenfolge der Felder wird an die Systemdefinition angepasst.
</p>
  
<?php if (empty($result)): ?>
  <div class="alert alert-success">✅ Alle Datensätze sind vollständig, korrekt und nach Systemdefinition sortiert!</div>
<?php else: ?>
  <div class="alert alert-danger"><strong>⚠️ Es wurden <?= count($result) ?> fehlerhafte Einträge gefunden:</strong></div>
  <table class="table table-bordered table-striped">
    <thead>
      <tr>
        <th>#</th>
        <th>Fehlende Felder</th>
        <th>Zusätzliche Felder</th>
        <?php if (isset($result[0]['wrongOrder'])): ?>
          <th>Reihenfolge</th>
        <?php endif; ?>
        <th>Auszug (sortiert nach Systemdefinition)</th>
      </tr>
    </thead>
    <tbody>
      <?php foreach ($result as $entry): ?>
      <tr>
        <td><?= $entry['row'] ?></td>
        <td><?= implode(", ", $entry['missing'] ?? []) ?></td>
        <td><?= implode(", ", $entry['extra'] ?? []) ?></td>
        <?php if (isset($entry['wrongOrder'])): ?>
          <td><?= !empty($entry['wrongOrder']) ? "❗ Falsch" : "✔️ OK" ?></td>
        <?php endif; ?>
        <td><code><?= htmlspecialchars($entry['excerpt']) ?></code></td>
      </tr>
      <?php endforeach; ?>
    </tbody>
  </table>
<?php endif; ?>

<h4 class="mt-5">📋 Aktuelle Datensätze (nach Systemdefinition sortiert):</h4>
<ul class="list-group">
  <?php foreach ($rows as $row): ?>
    <li class="list-group-item">
      <?= htmlspecialchars($row['firstname'] ?? '?') ?> <?= htmlspecialchars($row['lastname'] ?? '') ?> – <?= htmlspecialchars($row['email'] ?? '') ?>
    </li>
  <?php endforeach; ?>
</ul>





<?php
$scriptContent = file_get_contents(__FILE__);
?>


<!-- Exclude Begin -->
<!-- ===============================
🔍 Anzeige der JSON SQL Dateien
=============================== -->
<div class="container mt-5 mb-3">
  <div class="accordion" id="jsonAccordion">
    <div class="accordion-item">
      <h2 class="accordion-header" id="headingJson">
        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseJson" aria-expanded="false" aria-controls="collapseJson">
          📄 JSON-Dateien anzeigen
        </button>
      </h2>
      <div id="collapseJson" class="accordion-collapse collapse" aria-labelledby="headingJson" data-bs-parent="#jsonAccordion">
        <div class="accordion-body">
          <h4>System Datei:repairanalyze_demo.system.json</h4>
          <pre class="code-block language-json"><code><?php
            echo htmlspecialchars(file_get_contents(__DIR__ . '/../testdb/repairanalyze_demo.system.json'));
          ?></code></pre>

          <h4>JsonSQL Datei: repairanalyze_demo.json</h4>
          <pre class="code-block language-json"><code><?php
            echo htmlspecialchars(file_get_contents(__DIR__ . '/../testdb/repairanalyze_demo.json'));         
          ?></code></pre>    
          <div class="alert alert-info mb-4">
  <h5 class="alert-heading mb-2">Fehlende Daten ergänzt & Felder sortiert</h5>
  <p>
    Im Rahmen der automatischen Reparatur der Tabelle wurden folgende Maßnahmen durchgeführt:
  </p>
  <ul class="mb-2">
    <li>
      <strong>Fehlende Felder ergänzt:</strong>
      <br>
      Alle Datensätze wurden auf erforderliche Felder gemäß Systemdefinition geprüft. Fehlende Felder wurden automatisch ergänzt. 
      Als Wert wurde jeweils der Standardwert (<code>default</code>) aus der Systemdefinition übernommen – sofern vorhanden, andernfalls wurde das Feld auf <code>null</code> gesetzt.
    </li>
    <li>
      <strong>Felder sortiert:</strong>
      <br>
      Die Reihenfolge der Felder in jedem Datensatz wurde angepasst und entspricht nun exakt der Systemdefinition (<code>system.json</code>). 
      Zusätzliche Felder befinden sich, falls erlaubt, nun am Ende jedes Datensatzes.
    </li>
    <li>
      <strong>Optionale Maßnahmen:</strong>
      <br>
      Wenn aktiviert, wurden nicht definierte Felder entfernt. Dadurch entsprechen alle Datensätze exakt dem gewünschten Schema.
    </li>
    <li>
      <strong>Protokollierung:</strong>
      <br>
      Alle Änderungen wurden protokolliert. Für jeden betroffenen Datensatz wird aufgeführt, welche Felder ergänzt oder entfernt wurden und dass die Reihenfolge der Felder angepasst wurde.
    </li>
  </ul>
  <p class="mb-0">
    <span class="fw-semibold">Ergebnis:</span> 
    Alle Datensätze sind nun konsistent, sauber strukturiert und entsprechen exakt der Systemdefinition. Die Daten sind optimal für Export, Schnittstellen oder Weiterverarbeitung vorbereitet.
  </p>
</div>

          
          <h4>JsonSQL Datei: repairanalyze_demo.json (<code>Vor der Reparatur</code>)</h4>
          <pre class="code-block language-json"><code><?php
            echo $data_before_repair;            
          ?></code></pre>                     

        </div>
      </div>
    </div>
  </div>
</div>


<!-- 🔍 Quellcode-Anzeige -->
<div class="container mt-1 mb-3">
    <div class="accordion" id="codeAccordion">
        <div class="accordion-item">
            <h2 class="accordion-header" id="headingCode">
                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCode" aria-expanded="false" aria-controls="collapseCode">
                    📄 Quellcode dieser Demo anzeigen
                </button>
            </h2>
            <div id="collapseCode" class="accordion-collapse collapse" aria-labelledby="headingCode" data-bs-parent="#codeAccordion">
                <div class="accordion-body">
                    <pre class="code-block language-php"><code><?= htmlspecialchars($scriptContent) ?></code></pre>                    
                </div>
            </div>
        </div>
    </div>
</div>
















<?php
require_once __DIR__ . '/../includes/footer.php';
} catch (Exception $e) {
  echo "<div class='alert alert-danger'>Fehler: " . $e->getMessage() . "</div>";
  echo "<pre><code>" . $e->__toString() . "</code></pre>";
}
?>