Zum Inhalt springen
365CMS

Core – Datenbank & Schema

Version 3.4.00 (Changelog bis 3.4.08)Status StableStand 2026-10-02
Auf dieser Seite
  1. English (summary)
  2. Deutsch
  3. Datenbankschicht (CMS\Database)
  4. Schema-Verwaltung
  5. Basistabellen (SchemaManager)
  6. Bedarfsweise angelegte Tabellen
  7. Wichtige Optionen in cms_settings
  8. Hinweise für Entwickler
  9. Verwandte Dokumente

English (summary)

365CMS uses MySQL ≥ 5.7 or a current MariaDB (InnoDB, utf8mb4; the update preflight checks the server version ≥ 5.7) through the PDO wrapper CMS\Database (native prepared statements, ATTR_EMULATE_PREPARES = false). All tables carry the prefix DB_PREFIX (default cms_). The base schema (45 tables) is defined in CMS\SchemaManager::getSchemaQueries(); CMS\MigrationManager::run() applies idempotent CREATE/ALTER migrations once per schema version (SCHEMA_VERSION = 'v22', flag file CMS/cache/db_schema_v22.flag). Further tables are created on demand by the services and admin modules that own them. Settings use the key/value table cms_settings.

Deutsch

Datenbankschicht (CMS\Database)

Methode Zweck
Database::instance() Singleton, Verbindung aus DB_HOST, DB_NAME, DB_USER, DB_PASS, DB_CHARSET
prepare($sql), execute($sql, $params) parametrisierte Abfragen (Typen werden explizit gebunden)
query($sql) nur für vertrauenswürdige SQL ohne Parameter
get_row(), get_var(), get_results(), get_col() WordPress-ähnliche Lesehelfer (Objekte)
insert($table, $data), update($table, $data, $where), delete($table, $where) Schreibhelfer ohne Präfix im Tabellennamen; Bezeichner werden validiert
insert_id(), affected_rows() Ergebnisse
getPrefix() / prefix($table) Präfix bzw. vollständiger Tabellenname
tableExists(), columnExists() Schema-Prüfungen
repairTables() Schema-Flag löschen, Tabellen anlegen, Spalten migrieren
getPdo() direkter PDO-Zugriff für Sonderfälle

Fehler werden ohne Zugangsdaten protokolliert; im Debug-Modus erfasst Debug::query() Telemetrie.

Schema-Verwaltung

Klasse Aufgabe
SchemaManager Basisschema (createTables()), Standard-Admin bei Erstinstallation, Laufzeit-Ergänzungen (password_resets, site_tables, ai_quota_usage, orders, Spalte audit_log.severity)
MigrationManager Versionsprüfung gegen db_schema_version, ALTER-Migrationen (u. a. EN-Spalten für Seiten/Beiträge), einmal je Version
DatabaseUpdateRunner manueller Lauf aus /admin/updates bzw. update.php, setzt installed_cms_version, installed_cms_schema_version, db_schema_version

Basistabellen (SchemaManager)

Benutzer & Zugang

Tabelle Spalten
users id, username, email, password, display_name, role, status, created_at, updated_at, last_login
user_meta id, user_id → users (CASCADE), meta_key, meta_value
roles id, name, display_name, description, capabilities, member_dashboard_access, sort_order, …
sessions id, user_id, ip_address, user_agent, payload, last_activity, expires_at
passkey_credentials id, user_id, credential_id, public_key, sign_count, aaguid, attestation_fmt, name, created_at, last_used_at
password_resets id, email, token, expires_at, created_at
login_attempts, failed_logins Anmeldeversuche (Rate-Limit, Sicherheitsalarme)
blocked_ips id, ip_address, reason, expires_at, permanent, …
user_groups id, name, slug, description, role_id, plan_id, is_active, …
user_group_members id, user_id, group_id, joined_at

Inhalte

Tabelle Spalten
pages id, slug, slug_en, title (+ title_en), content (+ content_en), excerpt, status, hide_title, show_title_toc, featured_image, meta_title, meta_description, author_id, category_id, created_at, updated_at, published_at, content_updated_at
page_revisions id, page_id, title, title_en, slug, slug_en, content, content_en, excerpt, status, author_id, content_updated_at, created_at
posts id, title (+ title_en), slug, slug_en, content (+ content_en), excerpt (+ excerpt_en), featured_image, status, author_id, author_display_name, author_display_url, post_template, post_meta_json, category_id, tags, views, allow_comments, meta_title, meta_description, created_at, updated_at, published_at, content_updated_at
post_revisions Snapshot je Speichern (Titel, Slugs, Inhalte DE/EN, Status, Kategorie, Tags, Autor-Anzeige, Datumswerte)
post_categories id, name, slug, slug_en, description, parent_id, sort_order, replacement_category_id, created_at
post_tags id, name, slug, slug_en, description, post_count, created_at
post_tag_rel, post_category_rel Zuordnungen (CASCADE auf posts)
comments id, post_id, user_id, author, author_email, author_ip, content, status (pending/approved/spam/trash), post_date, modified_at
landing_sections id, type, data (JSON), sort_order
site_tables id, table_name, table_slug, description, columns_json, rows_json, settings_json (auch Hub-Sites)
media id, filename, filepath, filetype, filesize, title, alt_text, caption, uploaded_by, uploaded_at
custom_fonts id, name, slug, format, file_path, css_path, source (upload/google-fonts-local)

Mitglieder & Kommunikation

Tabelle Spalten
messages id, sender_id, recipient_id, subject, body, is_read, read_at, parent_id, deleted_by_sender, deleted_by_recipient, created_at
notifications id, user_id, type, title, message, url, is_read, read_at, created_at
favorites id, user_id, post_id, created_at

Abos & Bestellungen

Tabelle Spalten
subscription_plans Preise, Limits (limit_*), Plugin-Freigaben (plugin_*), Features (feature_*), is_active, sort_order
user_subscriptions user_id, plan_id, status, billing_cycle, start_date, end_date, next_billing_date, cancelled_at
subscription_usage user_id, resource_type, current_count, last_updated
orders order_number, user_id, plan_id, Beträge, currency, status, payment_method, billing_cycle, Adressdaten, contact_data

System, Plugins, Themes

Tabelle Spalten
settings id, option_name (eindeutig), option_value, autoload
plugins, plugin_meta Plugin-Registry und Metadaten (aktive Plugins zusätzlich in Option active_plugins)
theme_customizations theme_slug, setting_category, setting_key, setting_value, user_id
cache cache_key, cache_value, expires_at
activity_log user_id, action, entity_type, entity_id, description, ip_address, user_agent, metadata
audit_log user_id, category, action, entity_type, entity_id, description, ip_address, user_agent, metadata, severity
security_log action, ip_address, request_uri, user_agent, rule_matched, user_id, extra
page_views page_id, page_slug, page_title, user_id, session_id, ip_address (anonymisiert), user_agent, referrer, visited_at
core_web_vitals page_path, device_type, connection, viewport, ttfb_ms, lcp_ms, inp_ms, cls, recorded_at
mail_log recipient, subject, status, transport, provider, message_id, error_message, meta, source
mail_queue recipient, subject, body, headers, status, attempts, max_attempts, available_at, sent_at, lockedat, attachment*, error_category, last_error
ai_quota_usage scope_name, period_key, user_id, provider_id, request_count, character_count

Bedarfsweise angelegte Tabellen

Tabelle Angelegt von Zweck
seo_meta SEO\SeoMetaRepository SEO-Felder je Seite/Beitrag
seo_dashboard_trends SeoTrendService SEO-Kennzahlen-Verlauf
redirect_rules, not_found_logs RedirectService Weiterleitungen, 404-Protokoll
firewall_rules SecurityRuntimeService Firewall-Regeln
spam_blacklist AntispamModule Anti-Spam-Blacklist
cookie_categories, cookie_services CookieManagerModule Consent-Kategorien und Dienste
privacy_requests MemberService, PrivacyRequestsModule, DeletionRequestsModule DSGVO-Anfragen
role_permissions RolesModule, includes/functions/roles.php Capability-Overrides je Rolle
menus, menu_items MenuEditorModule Navigationsmenüs
error_reports ErrorReportService Fehlerberichte aus dem Admin
feature_usage FeatureUsageService Nutzung von Admin-Funktionen
monitoring_trends MonitoringTrendService Antwortzeit-, Speicher-, Cron-Verlauf
import_log, import_meta, import_items Plugin cms-importer WordPress-Import

Wichtige Optionen in cms_settings

Option Inhalt
db_schema_version, installed_cms_version, installed_cms_schema_version Versionsstände
active_plugins JSON-Liste aktiver Plugin-Slugs
active_theme aktives Theme
site_name, site_url, language, … allgemeine Einstellungen (../admin/system-settings/SYSTEM.md)
seo_*, perf_*, firewall_*, antispam_*, cookie_*, member_*, legal_*, cms_loginpage_* Einstellungen der jeweiligen Bereiche
Gruppen über SettingsService (mail, core_modules, ai.*, cron, …) gruppierte, teils verschlüsselte Werte (enc:/json:)

Hinweise für Entwickler

  • Tabellennamen immer über getPrefix() bilden, nie hart codieren.
  • Eigene Plugin-Tabellen idempotent mit CREATE TABLE IF NOT EXISTS beim Aktivieren anlegen und bei dsgvo_delete_data personenbezogene Daten löschen.
  • Für Spaltenergänzungen columnExists() prüfen und ALTER TABLE … ADD COLUMN nur bei Bedarf ausführen.
  • Keine Werte in SQL interpolieren – Platzhalter ? verwenden.

Verwandte Dokumente

ARCHITECTURE.md · CORE-CLASSES.md · ../admin/system-settings/UPDATES.md

Bereit für ein CMS, das mitdenkt?

Installieren Sie 365CMS auf Ihrem Server und legen Sie in wenigen Minuten los.