email
aus Zeile 0 entfernt (Simuliert).firstname
aus Zeile 3 entfernt (Simuliert).lastname
aus Zeile 3 entfernt (Simuliert).debug
in Zeile 1 eingefügt (Simuliert).demo
in Zeile 1 eingefügt (Simuliert).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.
# | Fehlende Felder | Zusätzliche Felder | Auszug (sortiert nach Systemdefinition) |
---|---|---|---|
1 | {"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"}... |
{
"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"
}
[
{
"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"
}
]
Im Rahmen der automatischen Reparatur der Tabelle wurden folgende Maßnahmen durchgeführt:
default
) aus der Systemdefinition übernommen – sofern vorhanden, andernfalls wurde das Feld auf null
gesetzt.
system.json
).
Zusätzliche Felder befinden sich, falls erlaubt, nun am Ende jedes Datensatzes.
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.
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>";
}
?>