🚀 Erste JsonSQL-Demo: Hello JsonSQL

🚀 Erste JsonSQL-Demo: hello

Diese Mini-Demo zeigt dir, wie einfach du mit JsonSQL durchstarten kannst – ganz ohne klassische Datenbank wie MySQL oder SQLite.

JsonSQL speichert deine Daten in einfachen .json-Dateien und ermöglicht dir dennoch typische Datenbank-Funktionen wie INSERT, SELECT, UPDATE und DELETE. Ideal für kleine Tools, Adminbereiche, Prototypen oder portable Anwendungen, bei denen du keinen Datenbankserver aufsetzen willst oder kannst.

In dieser Demo lernst du:

Die gesamte Logik läuft direkt im Code – kein SQL-Server, keine Datenbankverbindung, keine Einrichtung notwendig. Du kannst sofort loslegen!

Wenn du also schon immer mal Daten strukturiert speichern wolltest – aber ohne den Overhead klassischer Datenbanken – dann ist JsonSQL genau das Richtige für dich.

📦 Daten in hello.json:

JsonSQL Datei: datetime_demo.json

[
    {
        "ID": 369,
        "Erstellt am": "2025-06-16 14:51:42",
        "Geändert am": "2025-06-16 14:51:42",
        "email": "alice@example.com",
        "name": "Alice"
    },
    {
        "ID": 370,
        "Erstellt am": "2025-06-16 14:51:42",
        "Geändert am": "2025-06-16 14:51:42",
        "email": "bob@example.com",
        "name": "Bob"
    },
    {
        "ID": 371,
        "Erstellt am": "2025-06-16 14:51:42",
        "Geändert am": "2025-06-16 14:51:42",
        "email": "carol@example.com",
        "name": "Carol"
    },
    {
        "ID": 372,
        "Erstellt am": "2025-06-16 14:51:42",
        "Geändert am": "2025-06-16 14:51:42",
        "email": "dave@example.com",
        "name": "Dave"
    }
]

JsonSQL System Datei: datetime_demo.system.json

{
    "fields": {
        "ID": {
            "dataType": "integer",
            "autoincrement": true,
            "autoincrement_step": 1,
            "autoincrement_value": 373
        },
        "Erstellt am": {
            "dataType": "datetime",
            "auto_create_timestamp": true,
            "format": "Y-m-d H:i:s",
            "timezone": "UTC",
            "comment": "automatisch beim Erstellen gesetzt"
        },
        "Geändert am": {
            "dataType": "datetime",
            "auto_modified_timestamp": true,
            "format": "Y-m-d H:i:s",
            "timezone": "UTC",
            "comment": "automatisch bei Änderungen aktualisiert"
        }
    },
    "allowAdditionalFields": true,
    "validateOnUpdate": true
}

<?php
/**
 * ============================================================
 * 🚀 JsonSQL Demo #1 – "Hello JsonSQL"
 * ============================================================
 * 
 * Zweck:
 * Dies ist die erste einfache Demo zur JsonSQL-Klasse. Sie zeigt:
 * - wie man JsonSQL initialisiert,
 * - wie man eine Tabelle erstellt (bzw. leert),
 * - wie man einfache Datensätze einfügt,
 * - wie man Daten abruft und anzeigt.
 * 
 * Zielgruppe:
 * Entwickler:innen, die ohne klassische SQL-Datenbank arbeiten möchten
 * und eine einfache JSON-basierte Alternative suchen.
 * 
 * Hinweis:
 * Die JsonSQL-Klasse arbeitet rein mit Dateien (keine Datenbank nötig!).
 * Tabellen werden als JSON-Dateien gespeichert.
 * 
 * Datei: hello-json-sql.php
 * Pfad: examples/hello-json-sql.php
 * 
 * Setup-Voraussetzung:
 * - src/JsonSQL.php vorhanden
 * - testdb/-Verzeichnis beschreibbar
 * - includes/header.php und footer.php vorhanden
 * 
 * Autor: Dscho Teitge (https://teitge.de)
 * Stand: <?= date('Y-m-d') ?>
 * ============================================================
 */

//  Definition des Titels für header.php
$pageTitle = "🚀 Erste JsonSQL-Demo: Hello JsonSQL";
$pageDescription = "Einfacher Einstieg in JsonSQL: Lerne, wie du ohne klassische Datenbankstruktur Daten speichern und abfragen kannst – ideal für kleine Webprojekte.";


// 💡 Pfad zur JsonSQL-Klasse definieren
$JsonSQLpath = __DIR__ . '/../../src/JsonSQL.php';
if (!file_exists($JsonSQLpath)) {
    die("❌ Datei '$JsonSQLpath' nicht gefunden! Bitte sicherstellen, dass die Datei vorhanden ist.");
}
require_once $JsonSQLpath;

// 💡 Lade das gemeinsame Layout (Header, Navigation etc.)
require_once __DIR__ . '/../includes/header.php';

// 💡 Namespace importieren
use Src\JsonSQL;

try {

// ===============================
// ✅ Initialisierung der Datenbank
// ===============================

// Erstelle ein neues JsonSQL-Objekt mit Pfad zur Datenbank (testdb/)
$db = new JsonSQL(['demo' => __DIR__ . '/../testdb']);

// Wähle die Datenbank "demo"
$db->use('demo');

// Tabellenname festlegen
$table = 'hello';

// Tabelle leeren (neu erstellen oder bestehende Inhalte löschen)
$db->truncate($table);


// ===============================
// ✍️ Systemfelder aktivieren
// ===============================
// Diese Felder werden automatisch von JsonSQL bei jedem Insert ergänzt:
//
// - ID: fortlaufende Nummer (Autoincrement), eindeutig für jeden Datensatz
// - Erstellt am: Zeitstempel, wann der Datensatz angelegt wurde
// - Geändert am: Zeitstempel, wann der Datensatz zuletzt verändert wurde
//
// Diese Definition wird automatisch in der system.json der Tabelle gespeichert.
// Wichtig: Die Namen dieser Felder (z. B. "ID" statt "id") kannst du frei wählen.
$db->addAutoincrementField('ID');
$db->addCreatedAtField('Erstellt am');
$db->addUpdatedAtField('Geändert am');


// ===============================
// ✍️ Einfache Demo-Daten einfügen
// ===============================

// 1. Datensatz: Alice
// Einfügen eines einzelnen Datensatzes mit Angabe von Name und E-Mail
$db->from($table)->insert([
  'name' => 'Alice',
  'email' => 'alice@example.com'
]);

// 2. Datensatz: Bob (mit bewusst falscher E-Mail zum späteren Update-Test)
$db->insert([
  'name' => 'Bob',
  'email' => 'bab@example.com' // Tippfehler wird später korrigiert
]);

// 3. und 4. Datensätze: Carol & Dave (Mehrfacheinfügen in einem Rutsch)
// JsonSQL erkennt das automatisch anhand eines Arrays von Arrays
$db->insert([
  [
    'name' => 'Carol',
    'email' => 'carol@example.com'
  ],
  [
    'name' => 'Dave',
    'email' => 'dave@example.com'
  ]
]);


// ===============================
// 📥 Daten aktualisieren (Update)
// ===============================
// Ziel: Die E-Mail-Adresse von Bob korrigieren (bab → bob)
//
// Hinweis: setTable($table, true) lädt die Tabelle neu aus der Datei,
// um sicherzustellen, dass Änderungen (z. B. durch vorherige Inserts)
// auch in der aktuellen Abfrage zur Verfügung stehen.
$db->setTable($table, true); // Autoload true = Tabelle frisch laden

// Suche nach dem Datensatz mit name = 'Bob' und korrigiere die E-Mail
$db->select('*')->from($table)
  ->where([['name', '=', 'Bob']]) // Bedingung als 3er-Array im Array (korrektes Format)
  ->update(['email' => 'bob@example.com']); // Neue, korrekte Adresse


// ===============================
// 📥 Daten abrufen (Select)
// ===============================
// Ziel: Alle aktuell gespeicherten Datensätze ausgeben

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

// ===============================
// 🐞 Debug-Ausgaben (nur sichtbar bei aktiviertem Debug-Modus)
// ===============================

$debugger->addInfoText('JsonSQL Objekt');
$debugger->dump($db);

$debugger->addInfoText('Die fertigen Daten');
$debugger->dump($rows);

$debugger->addInfoText('Die einzelnen Datenzeilen');
?>

<!-- ===============================
🎨 HTML-Ausgabe der Daten
=============================== -->
<div class="container mt-4">
  <h1 class="mb-4">🚀 Erste JsonSQL-Demo: <code>hello</code></h1>

  <p class="lead">
  Diese Mini-Demo zeigt dir, wie einfach du mit <strong>JsonSQL</strong> durchstarten kannst – ganz ohne klassische Datenbank wie MySQL oder SQLite.
  </p>

  <p>
    JsonSQL speichert deine Daten in einfachen <code>.json</code>-Dateien und ermöglicht dir dennoch typische Datenbank-Funktionen wie <code>INSERT</code>, <code>SELECT</code>, <code>UPDATE</code> und <code>DELETE</code>. Ideal für kleine Tools, Adminbereiche, Prototypen oder portable Anwendungen, bei denen du keinen Datenbankserver aufsetzen willst oder kannst.
  </p>

  <p>
    In dieser Demo lernst du:
    <ul>
      <li>🆕 wie du eine neue "Tabelle" erstellst (in Wirklichkeit eine JSON-Datei),</li>
      <li>📝 wie du Datensätze einfügst,</li>
      <li>🔍 und wie du sie anschließend wieder ausliest.</li>
    </ul>
  </p>

  <p>
    Die gesamte Logik läuft direkt im Code – kein SQL-Server, keine Datenbankverbindung, keine Einrichtung notwendig. Du kannst sofort loslegen!  
  </p>

  <p>
    Wenn du also schon immer mal Daten strukturiert speichern wolltest – aber ohne den Overhead klassischer Datenbanken – dann ist <strong>JsonSQL</strong> genau das Richtige für dich.
  </p>

  <div class="alert alert-info mt-4" role="alert">
    📄 <strong>Tipp für Einsteiger:innen:</strong> Am Ende dieser Seite findest du den vollständigen Quellcode dieser Demo zum Aufklappen.<br>
    Er enthält viele Kommentare und ist ideal geeignet, um Schritt für Schritt zu verstehen, wie JsonSQL funktioniert.
  </div>  


  <h4 class="mt-4">📦 Daten in <code>hello.json</code>:</h4>
  <ul class="list-group">
    <?php foreach ($rows as $row):       
      $debugger->dump($row); // Optionaler Debug-Dump jeder Zeile      
    ?>
      <li class="list-group-item">
        <strong><?= htmlspecialchars($row['name']) ?></strong> &mdash; <?= htmlspecialchars($row['email']) ?>
      </li>
    <?php endforeach; ?>
  </ul>
</div>


<?php
$scriptName = basename(__FILE__);

// Entferne die Exclude-Tags aus dem Quellcode, aber lasse den eigenen Codeabschnitt aus
$scriptContent = file_get_contents(__FILE__);

// Verhindern, dass der Codeblock selbst ersetzt wird, indem wir ihn in einen temporären Kommentar umwandeln
$scriptContent = preg_replace('//s', '', $scriptContent);

// Hier verwenden wir einen temporären Platzhalter, um den Code zu umgehen, der ersetzt wird.
$scriptContent = str_replace('', '<!-- Exclude End Temp -->', $scriptContent);

?>





<?php
} catch (\Exception $e) {
    // Fange die Exception und gebe die Fehlermeldung aus
    echo "<div class='alert alert-danger'>
    <i class='bi bi-exclamation-circle'></i> Fehler: <strong>" . $e->getMessage() . "</strong>
  </div>";
    // Ausgabe des gesamten Stack-Trace für detaillierte Fehlersuche
    echo "<pre><code>" . $e->__toString() . "</code></pre>";  // Ausgabe des vollständigen Stack-Trace    
} finally {
    // Dieser Block wird immer ausgeführt, auch wenn eine Exception geworfen wurde
    // ✅ Footer der Seite einfügen
    require_once __DIR__ . '/../includes/footer.php';
}


?>