// Universelle Datenbank Funktion für Prepared Statements function SQLResults($datenbank, $sql, $typen, $parameter, $debug = false) { if ($debug) { // Aufruf-Herkunft ermitteln $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $caller = isset($trace[1]) ? ($trace[1]['file'] ?? '?') . ':' . ($trace[1]['line'] ?? '?') . ' → ' . ($trace[1]['function'] ?? '?') . '()' : ($trace[0]['file'] ?? '?') . ':' . ($trace[0]['line'] ?? '?'); // Parameter in SQL einsetzen (nur zur Anzeige) $sqlDebug = $sql; foreach ($parameter as $wert) { $ersatz = $wert === null ? 'NULL' : (is_numeric($wert) ? $wert : "'" . addslashes($wert) . "'"); $sqlDebug = preg_replace('/\?/', $ersatz, $sqlDebug, 1); } } // Zeitmessung Prepare $startPrepare = microtime(true); $stmt = $datenbank->prepare($sql); if (!$stmt) { error_log("Prepare fehlgeschlagen: {$datenbank->error} | SQL: $sql"); return false; } $dauerPrepare = round((microtime(true) - $startPrepare) * 1000, 2); if ($typen !== '' && !empty($parameter)) { if (!$stmt->bind_param($typen, ...$parameter)) { error_log("Bind fehlgeschlagen: {$stmt->error}"); return false; } } // Zeitmessung Execute $startExecute = microtime(true); if (!$stmt->execute()) { error_log("Execute fehlgeschlagen: {$stmt->error}"); return false; } $dauerExecute = round((microtime(true) - $startExecute) * 1000, 2); $resultObj = $stmt->get_result(); if ($debug) { $logDatei = "{$_SERVER['DOCUMENT_ROOT']}/verwaltung/austausch/sql_debug.log"; $eintrag = implode(PHP_EOL, [ '=== SQL DEBUG ===', 'Zeit : ' . date('Y-m-d H:i:s'), "Aufruf von : $caller", "SQL (roh) : $sql", "Typen : $typen", 'Parameter : ' . implode(', ', array_map(fn($p) => var_export($p, true), $parameter)), "SQL (voll) : $sqlDebug", "Ausführung : Prepare: $dauerPrepare ms > Execute: $dauerExecute ms >> Gesamt: " . $dauerPrepare + $dauerExecute . " ms", 'Treffer : ' . ($resultObj ? $resultObj->num_rows : $stmt->affected_rows), '=================', ]) . PHP_EOL . PHP_EOL; file_put_contents($logDatei, $eintrag, FILE_APPEND); } // Bei UPDATE/INSERT/DELETE gibt get_result() false zurück – kein Fehler if ($resultObj === false) { return $stmt->affected_rows >= 0; } return $resultObj; } // Funktion zur Generierung der kanonischen URL function getCanonicalUrl(array $allowedParams = []) { // Nur HTTPS ausgeben $scheme = 'https://'; // Domain $host = $_SERVER['HTTP_HOST']; // Pfad ohne Query $uri = strtok($_SERVER['REQUEST_URI'], '?'); // Wenn index.php vorkommt -> auf Ordner reduzieren if (substr($uri, -10) === '/index.php') { $uri = substr($uri, 0, -10); } // Erlaubte Parameter filtern $filtered = array_intersect_key($_GET, array_flip($allowedParams)); // Querystring neu erzeugen $query = http_build_query($filtered); return "$scheme$host$uri" . ($query ? "?$query" : ''); } /** Navigation, aktuelle Wahl */ function isActiveTop(array $patterns): string { $url = strtolower($_SERVER['REQUEST_URI'] ?? ''); foreach ($patterns as $p) { $p = strtolower($p); if ($p === '') continue; if (str_starts_with($url, $p)) { return ' nav-active'; } } return ''; } /** * Erzeugt eine SEO-saubere Canonical-URL aus der aktuellen Anfrage * * - Base-URL automatisch (Scheme + Host + Path) * - Nur erlaubte GET-Parameter übernehmen (Whitelist) * - Tracking-Parameter werden ignoriert * * @param array rules [ 'param' ] * @return string|null */ function canonical_url(array $allowedParams = []): ?string { $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? null; if (!$host) return null; $path = strtok($_SERVER['REQUEST_URI'], '?'); $baseUrl = $scheme . '://' . $host . $path; $params = []; foreach ($allowedParams as $key => $value) { // 1. Bestimme den Namen des Parameters // Wenn ['person'], dann ist $key = 0 und $value = 'person' // Wenn ['person' => 'irgendwas'], dann ist $key = 'person' $paramName = is_int($key) ? $value : $key; // 🔥 FIX: Sicherstellen, dass $paramName ein String ist und kein Array! // Das verhindert den Fatal Error beim Zugriff auf $_GET if (!is_string($paramName)) { continue; } // 2. Prüfen, ob der Parameter in der URL existiert if (isset($_GET[$paramName])) { $getVal = $_GET[$paramName]; // Falls jemand ?person[]=... schickt (ein Array im GET) if (is_array($getVal)) { continue; } $getVal = trim((string) $getVal); // 3. Validierung der Werte if ($getVal === '') continue; // Paginierung-Spezialfall (Seite 1 weglassen) if (($paramName === 'p' || $paramName === 'page') && $getVal === '1') { continue; } $params[$paramName] = $getVal; } } if (empty($params)) { return $baseUrl; } // Parameter alphabetisch sortieren (Wichtig für SEO) ksort($params); return $baseUrl . '?' . http_build_query($params); } // Variablen für den Session Zugriff setzen falls nicht gesetzt $_SESSION['rechte'] ??= ''; $_SESSION['benutzer'] ??= ''; $_SESSION['suchbegriff'] ??= ''; $_SESSION['id_benutzer'] ??= ''; $_SESSION['v_auswahl1'] ??= ''; $_SESSION['v_auswahl'] ??= ''; $_SESSION['wahl'] ??= ''; $_SESSION['lat'] ??= ''; $_SESSION['lng'] ??= ''; $_SESSION['id_kat'] ??= ''; $_SESSION['bedingung'] ??= ''; $_SESSION['farbe'] ??= 'orange3'; $_SESSION['datum'] ??= ''; $_SESSION['jahr'] ??= ''; $_SESSION['monat'] ??= ''; $_SESSION['tag'] ??= ''; $_SESSION['anzeige'] ??= ''; $_SESSION['form'] = 'boxed'; $_SESSION['naturdenkmal'] ??= ''; $_SESSION['autor'] ??= ''; $_SESSION['verlag'] ??= ''; $_SESSION['beschreibung'] ??= ''; $_SESSION['inhaltsverzeichnis'] ??= ''; $_SESSION['bayern'] ??= ''; $_SESSION['anz_suche'] ??= ''; $_SESSION['id_verlag'] ??= ''; $_SESSION['zeitraum'] ??= ''; $_SESSION['grabanlage'] ??= ''; //$_SESSION['umkreis'] ??= 1.0; $wochentag_kurz = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; $wochentag_lang = [0 => "Sonntag", 1 => "Montag", 2 => "Dienstag", 3 => "Mittwoch", 4 => "Donnerstag", 5 => "Freitag", 6 => "Samstag"]; $monat_lang = [0 => "", 1 => "Januar", 2 => "Februar", 3 => "März", 4 => "April", 5 => "Mai", 6 => "Juni", 7 => "Juli", 8 => "August", 9 => "September", 10 => "Oktober", 11 => "November", 12 => "Dezember"]; $monat_kurz = [0 => "", 1 => "Jan", 2 => "Feb", 3 => "Mär", 4 => "Apr", 5 => "Mai", 6 => "Jun", 7 => "Jul", 8 => "Aug", 9 => "Sep", 10 => "Okt", 11 => "Nov", 12 => "Dez"]; $leer_datum = "0000-00-00 00:00:00"; // Matomo stats auswertung $cache_file = "$inc/verwaltung/austausch/matomo_stats_cache.json"; $matomo_stats = ['besucher_tag' => 0, 'aufrufe_heute' => 0]; if (is_readable($cache_file)) { $data = file_get_contents($cache_file); $decoded = json_decode($data, true); if (json_last_error() === JSON_ERROR_NONE) { $matomo_stats = $decoded; } } // Matomo Stats Ende ------ // Benutzer und Rechte prüfen function isAdmin(): ?bool { return $_SESSION['rechte'] === 'admin'; } function isBenutzer(): ?bool { return $_SESSION['rechte'] === 'benutzer'; } function checkLogin() { if ($_SESSION['benutzer'] == '') { header("Location: /index.php"); // nicht erlaubt, zurück zur Startseite exit; } } /** * Prüft ob ein Datumswert ein gültiges Bild-Datum enthält. * * Gibt false zurück wenn der Wert leer oder das MySQL-Nulldatum ist. * * @param string|null $datum Datumswert (z. B. aus einer Datenbank) * @return bool true wenn ein gültiges Datum vorhanden, sonst false * * @example * isBild('2024-03-15 10:30:00'); // true * isBild('0000-00-00 00:00:00'); // false * isBild(''); // false * isBild(null); // false */ function isBild(?string $datum): ?bool { return !empty($datum) && $datum !== '0000-00-00 00:00:00'; } /** * Liest einen Integer-Wert aus dem GET-Parameter und validiert ihn. * * Liest den angegebenen GET-Parameter aus, prüft ob er ein gültiger * Integer ist und ob er im erlaubten Bereich liegt. Bei ungültigem oder * fehlendem Wert wird der Standardwert zurückgegeben. * * @param string $key Name des GET-Parameters * @param int|null $min Minimalwert (inklusiv), oder null für kein Limit * @param int|null $max Maximalwert (inklusiv), oder null für kein Limit * @param int|null $default Rückgabewert bei ungültiger oder fehlender Eingabe * @return int|null Validierter Integer oder Standardwert * * @example * // GET: ?page=3 * getInt('page'); // 3 * getInt('page', 1, 100); // 3 * getInt('page', 1, 2); // null (außerhalb des Bereichs) * getInt('page', 1, 2, 1); // 1 (außerhalb → Default) * * // GET: ?page=abc * getInt('page', default: 1); // 1 (ungültig → Default) * * // GET: (kein Parameter) * getInt('page', default: 1); // 1 (fehlt → Default) */ function getInt( string $key, ?int $min = null, ?int $max = null, ?int $default = null ): ?int { $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT); // Falls nicht gesetzt oder ungültig if ($value === false || $value === null) { return $default; } // Bereich prüfen if ( ($min !== null && $value < $min) || ($max !== null && $value > $max) ) { return $default; } return $value; } /** * Liest einen String aus dem GET-Parameter und validiert ihn. * * Liest den angegebenen GET-Parameter aus und prüft ihn optional auf * Länge, Muster (Regex) und erlaubte Werte. Bei ungültigem oder * fehlendem Wert wird der Standardwert zurückgegeben. * * @param string $key Name des GET-Parameters * @param int|null $minLength Minimale Zeichenanzahl (inklusiv), oder null für kein Limit * @param int|null $maxLength Maximale Zeichenanzahl (inklusiv), oder null für kein Limit * @param string|null $regex Regulärer Ausdruck den der Wert erfüllen muss, oder null * @param array|null $allowed Liste erlaubter Werte (strenger Vergleich), oder null * @param string|null $default Rückgabewert bei ungültiger oder fehlender Eingabe * @param bool $trim Whitespace am Anfang/Ende entfernen (Standard: true) * @return string|null Validierter String oder Standardwert * * @example * // GET: ?name=Hans * getString('name'); // "Hans" * getString('name', 2, 50); // "Hans" * getString('name', 10); // null (zu kurz) * * // GET: ?status=active * getString('status', allowed: ['active', 'inactive']); // "active" * getString('status', allowed: ['pending']); // null (nicht erlaubt) * * // GET: ?code=AB-123 * getString('code', regex: '/^[A-Z]{2}-\d{3}$/'); // "AB-123" * * // GET: ?search= Hallo * getString('search', trim: true); // "Hallo" * getString('search', trim: false); // " Hallo " * * // GET: (kein Parameter) * getString('name', default: 'Anonym'); // "Anonym" */ function getString( string $key, ?int $minLength = null, ?int $maxLength = null, ?string $regex = null, ?array $allowed = null, ?string $default = null, bool $trim = true ): ?string { if (!isset($_GET[$key]) || !is_string($_GET[$key])) { return $default; } $value = $trim ? trim($_GET[$key]) : $_GET[$key]; $length = mb_strlen($value); if ( ($minLength !== null && $length < $minLength) || ($maxLength !== null && $length > $maxLength) ) { return $default; } if ($regex !== null && !preg_match($regex, $value)) { return $default; } if ($allowed !== null && !in_array($value, $allowed, true)) { return $default; } return $value; } /** * Liest einen Float-Wert aus dem GET-Parameter und validiert ihn. * * Liest den angegebenen GET-Parameter aus, prüft ob er ein gültiger * Float ist und ob er im erlaubten Bereich liegt. Bei ungültigem oder * fehlendem Wert wird der Standardwert zurückgegeben. * * @param string $key Name des GET-Parameters * @param float|null $min Minimalwert (inklusiv), oder null für kein Limit * @param float|null $max Maximalwert (inklusiv), oder null für kein Limit * @param float|null $default Rückgabewert bei ungültiger oder fehlender Eingabe * @return float|null Validierter Float-Wert oder Standardwert * * @example * // GET: ?price=19.99 * getFloat('price'); // 19.99 * getFloat('price', 0.0, 100.0); // 19.99 * getFloat('price', 0.0, 10.0); // null (außerhalb des Bereichs) * getFloat('price', 0.0, 10.0, 0.0); // 0.0 (außerhalb → Default) * * // GET: ?price=abc * getFloat('price', null, null, 1.0); // 1.0 (ungültig → Default) * * // GET: (kein Parameter) * getFloat('price', null, null, 5.0); // 5.0 (fehlt → Default) */ function getFloat( string $key, ?float $min = null, ?float $max = null, ?float $default = null ): ?float { // FILTER_FLAG_ALLOW_THOUSAND könnte optional ergänzt werden, // falls Inputs wie "1.234,56" erwartet werden. $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_FRACTION); // Falls nicht gesetzt oder kein gültiger Float if ($value === false || $value === null) { return $default; } // Bereich prüfen if ( ($min !== null && $value < $min) || ($max !== null && $value > $max) ) { return $default; } return $value; } // HTML Sonderzeichen umwandeln function h($v) { return htmlspecialchars($v ?? ''); } /** * Summary of date_deutsch * @param mixed $date * @return string * Zu tun: Falsche Eingaben wie ein leeren String abfangen! */ function date_deutsch($date): ?string { if ($date instanceof DateTimeInterface) { return $date->format('d.m.Y'); } if (!is_string($date)) { return null; } $date = trim($date); if ($date === '') { return null; } if (!preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $matches)) { return null; } $year = (int) $matches[1]; $month = (int) $matches[2]; $day = (int) $matches[3]; if (!checkdate($month, $day, $year)) { return null; } return sprintf('%02d.%02d.%04d', $day, $month, $year); } // Bildpfad ermitteln // Input: "2024-01-17 10:08:13" // Output: https://fotoagentur-muenchen.de/fotoarchiv/2024/01/240117_100813_2.jpg // Input: "0000-00-00 00:00:00" // Output: https://stadtgeschichte-muenchen.de/strassen/bilder/kein_bild.png // Korrekte URL für Zugriff auf das Fotoarchiv erstellen function bild_link($bilddatum) { $datum_muster = '/^([1-2][0-9]{3})-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/'; if (preg_match($datum_muster, $bilddatum)) { return "https://fotoagentur-muenchen.de/fotoarchiv/" . substr($bilddatum, 0, 4) . "/" . substr($bilddatum, 5, 2) . "/" . substr($bilddatum, 2, 2) . substr($bilddatum, 5, 2) . substr($bilddatum, 8, 2) . "_" . substr($bilddatum, 11, 2) . substr($bilddatum, 14, 2) . substr($bilddatum, 17, 4); } } // Alte Bilder sind auf der stadtgeschichte-muenchen.de function bild_alt($bilddatum) { $datum_muster = '/^([1-2][0-9]{3})-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/'; if (preg_match($datum_muster, $bilddatum)) { return "/bilder/bilder/" . substr($bilddatum, 0, 4) . "/" . substr($bilddatum, 5, 2) . "/" . substr($bilddatum, 2, 2) . substr($bilddatum, 5, 2) . substr($bilddatum, 8, 2) . "_" . substr($bilddatum, 11, 2) . substr($bilddatum, 14, 2) . substr($bilddatum, 17, 4); } else { return '/images/kein_bild.png'; } } function istHochformat($pfad_bild): ?bool { // Überprüfen, ob die Datei existiert if (!file_exists($pfad_bild)) { return false; } [$width, $height] = getimagesize($pfad_bild); return $height > $width; } /** * Summary of date_sql * @param mixed $date * @return string */ function date_sql($date) { // Set default value if null or empty if (empty($date)) { return '0000-00-00'; } // Ensure valid format using regex (DD.MM.YYYY) if (!preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $date)) { return '0000-00-00'; // Return default invalid date format } // Convert date format $date_exp = explode(".", $date); return "{$date_exp[2]}-{$date_exp[1]}-{$date_exp[0]}"; } /* Beispiele echo date_sql("23.03.2025"); // Outputs: 2025-03-23 echo date_sql(""); // Outputs: 0000-00-00 echo date_sql(null); // Outputs: 0000-00-00 echo date_sql("10/12/2024"); // Outputs: 0000-00-00 */ /** * Extrahiert die Jahreszahl aus verschiedenen Eingabeformaten. * * Unterstützte Formate: * - Jahreszahl (z. B. "2024") * - Deutsches Datum (z. B. "15.3.2024" oder "05.12.2024") * - ISO-Datum (z. B. "2024-03-15") * * @param mixed $input Eingabewert (String, Zahl oder null) * @return int|null Jahreszahl als Integer oder null bei ungültiger Eingabe * * @example * extractYear(2024); // 2024 * extractYear("2024"); // 2024 * extractYear("15.3.2024"); // 2024 * extractYear("2024-03-15"); // 2024 * extractYear(null); // null * extractYear("abc"); // null */ function extractYear($input): ?int { if ($input === null) { return null; } $value = is_string($input) ? trim($input) : (string) $input; if ($value === '') { return null; } // Nur Jahreszahl übergeben if (preg_match('/^\d{4}$/', $value)) { return (int) $value; } // Datum im Format TT.MM.JJJJ verarbeiten if (preg_match('/^\d{1,2}\.\d{1,2}\.\d{4}$/', $value)) { $date = DateTime::createFromFormat('j.n.Y', $value); return $date ? (int) $date->format('Y') : null; } // ISO-Datum (JJJJ-MM-TT) unterstützen if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { $date = DateTime::createFromFormat('Y-m-d', $value); return $date ? (int) $date->format('Y') : null; } return null; } function distance($lat1, $lon1, $lat2, $lon2) { $radius = 6371; // Radius of the earth in km $dLat = deg2rad($lat2 - $lat1); $dLon = deg2rad($lon2 - $lon1); $a = sin($dLat / 2) * sin($dLat / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon / 2) * sin($dLon / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); return $radius * $c; // Distance in km; } /* * Berechnet die Bounding Box für eine Umkreissuche. * @param float $lat Breitengrad * @param float $lng Längengrad * @param float $radius Umkreis in Kilometern * @return string für WHERE Argument in SQL-Abfrage */ function BBoxSql($lat, $lng, $radius) { // 1 Grad Breitengrad entspricht ca. 111.12 km $latOffset = $radius / 111.12; // Der Längengrad-Versatz ist abhängig vom Breitengrad (wird zu den Polen hin kleiner) $lngOffset = $radius / (111.12 * cos(deg2rad($lat))); $minlat = $lat - $latOffset; $maxlat = $lat + $latOffset; $minlng = $lng - $lngOffset; $maxlng = $lng + $lngOffset; return "lat BETWEEN $minlat AND $maxlat AND lng BETWEEN $minlng AND $maxlng"; } /* function navigation_old($seite, $seiten) { # Anzeigen der Links für die einzelnen Seiten if ($seiten > 0) { $navigation = ""; return $navigation; } return "Keine Datensätze vorhanden!"; } */ // Übergabe der aktuellen Seite und der Anzahl der Seiten // Rückgabe des html codes über die $navigation Variable // Beispiel für die Einbettung des codes: // echo "
$navigation
"; // Diesen Ausdruck kann man vor eine Tabelle setzen, danach oder eben oben und unten function navigation($seite, $seiten) { if ($seiten <= 1) { return "Keine Datensätze oder nur eine Seite vorhanden!"; } $navigation = ""; return $navigation; } // Funktion für die Erstellung von den ABC...Z Buttons // $wahl - Hier wird der Buchstabe zum hervorheben übermittelt // $titel - Hier wird der Titel für die Seite übermittelt // $liste - enthält die vollständige Liste von A bis Z mit class Definitionen // und wird auf der Seite mit echo $liste; ausgegeben function auswahl($wahl, $titel = NULL) { $liste = null; $ausgewählt = "btn btn-ar btn-primary btn-sm btn-hover-red"; // Ausgewählter Button wird hervorgehoben $normal = "btn btn-ar btn-default btn-sm btn-hover-red"; // Normaler Button foreach (range('A', 'Z') as $w) { $btn = $w == $wahl ? $ausgewählt : $normal; $liste .= <<$w HTML; } return $liste; } function test($test) { $db_stadtgeschichte_db = db_sg(); $includes = null; $rusage = null; $benutzer = get_current_user(); $mem_usage = memory_get_usage(true); foreach (get_included_files() as $i) { $includes .= "$i;
"; } foreach (getrusage() as $x => $y) { $rusage .= "$x =>$y
"; } $dbstat = $db_stadtgeschichte_db->stat(); // Tabelle für SESSION erstellen (mit kleinerer Schriftart 'small') $sessTable = ''; foreach ($_SESSION as $key => $value) { $safeKey = htmlspecialchars($key); $safeValue = htmlspecialchars(is_array($value) ? json_encode($value) : (string) $value); $sessTable .= ""; } $sessTable .= '
$safeKey$safeValue
'; // Umschließendes DIV für Scrollbar und kleinere Schrift // 'max-height' definiert, ab wann gescrollt wird echo '
'; $table = <<
Benutzer $benutzer
Includes
$includes
Datenbank
$dbstat
SESSION $sessTable
TABLE; echo $table; echo '
'; // Ende des Scroll-Containers } // Datenbankverbindungen function db_sg() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $db_stadtgeschichte_db = null; // 2. MySQLi Fehler-Reporting aktivieren (Hilfreich für Debugging) // Dies wirft eine Exception bei Verbindungsfehlern, die wir abfangen mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($db_stadtgeschichte_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $db_stadtgeschichte_db = new mysqli('p:localhost', 'db_stadtgeschichte', '1956Santino1956!x!', 'db_stadtgeschichte'); // Konfiguration nur bei erfolgreicher Verbindung $db_stadtgeschichte_db->set_charset('utf8mb4'); $db_stadtgeschichte_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $db_stadtgeschichte_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { // 4. Fehlerbehandlung bei Verbindungsversagen (z.B. "Too many connections") // Fehler protokollieren (ersetzen Sie dies durch Ihre bevorzugte Protokollierung) error_log("Stadtgeschichte DB Verbindungsfehler: " . $e->getMessage()); // Den Verbindungs-Slot auf NULL zurücksetzen und NULL zurückgeben // Dies verhindert, dass nachfolgender Code versucht, eine geschlossene/fehlerhafte Verbindung zu verwenden. $db_stadtgeschichte_db = null; // Optional: Zeigen Sie eine benutzerfreundliche Fehlermeldung an und beenden Sie das Skript, // damit keine fehlerhaften Daten ausgegeben werden. // die('Datenbankdienst momentan nicht verfügbar.'); } } // 5. Rückgabe der Verbindung (kann NULL sein, wenn die Verbindung fehlschlug) return $db_stadtgeschichte_db; } function db_fotoagentur() { static $fotoagentur_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); if ($fotoagentur_db === null) { try { $fotoagentur_db = new mysqli('p:localhost', 'fotoagentur', '1956Santino1956', 'fotoagentur'); // Konfiguration nur bei erfolgreicher Verbindung $fotoagentur_db->set_charset('utf8mb4'); $fotoagentur_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $fotoagentur_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Fotoagentur DB Verbindungsfehler: " . $e->getMessage()); $fotoagentur_db = null; } } return $fotoagentur_db; } function db_geschichte() { // Statische Variable für persistente Verbindung (Speicher-Optimierung) static $geschichte_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); if ($geschichte_db === null) { try { $geschichte_db = new mysqli('p:localhost', 'geschichte', '1956Santino1956', 'geschichte'); // Konfiguration nur bei erfolgreicher Verbindung $geschichte_db->set_charset('utf8mb4'); $geschichte_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $geschichte_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Geschichte DB Verbindungsfehler: " . $e->getMessage()); $geschichte_db = null; } } return $geschichte_db; } function db_literatur() { // Statische Variable für persistente Verbindung static $literatur_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); if ($literatur_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $literatur_db = new mysqli('p:localhost', 'literatur', '1956Santino1956', 'literatur'); // Konfiguration nur bei erfolgreicher Verbindung $literatur_db->set_charset('utf8mb4'); $literatur_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $literatur_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Literatur DB Verbindungsfehler: " . $e->getMessage()); $literatur_db = null; } } return $literatur_db; } function db_friedhof() { // Statische Variable für persistente Verbindung static $friedhof_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); if ($friedhof_db === null) { try { $friedhof_db = new mysqli('p:localhost', 'friedhof', '1956Santino1956', 'friedhof'); // Konfiguration nur bei erfolgreicher Verbindung $friedhof_db->set_charset('utf8mb4'); $friedhof_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $friedhof_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Friedhof DB Verbindungsfehler: " . $e->getMessage()); $friedhof_db = null; } } return $friedhof_db; } function db_litera() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $litera_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($litera_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $litera_db = new mysqli('p:localhost', 'litera', '1956Santino1956!!', 'litera'); // Konfiguration nur bei erfolgreicher Verbindung $litera_db->set_charset('utf8mb4'); $litera_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $litera_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Litera DB Verbindungsfehler: " . $e->getMessage()); $litera_db = null; } } return $litera_db; } function db_hartbrunner() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $hartbrunner_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($hartbrunner_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $hartbrunner_db = new mysqli('p:localhost', 'hartbrunner', '1956Santino1956', 'hartbrunner'); // Konfiguration nur bei erfolgreicher Verbindung $hartbrunner_db->set_charset('utf8mb4'); $hartbrunner_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $hartbrunner_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Hartbruner DB Verbindungsfehler: " . $e->getMessage()); $hartbrunner_db = null; } } return $hartbrunner_db; } function db_archiv() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $archiv_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($archiv_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $archiv_db = new mysqli('p:localhost', 'archiv', '1956Santino1956', 'archiv'); // Konfiguration nur bei erfolgreicher Verbindung $archiv_db->set_charset('utf8mb4'); $archiv_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $archiv_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Archiv DB Verbindungsfehler: " . $e->getMessage()); $archiv_db = null; } } return $archiv_db; } function db_bayern() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $bayern_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($bayern_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $bayern_db = new mysqli('p:localhost', 'bayern', '1956Santino1956', 'bayern'); // Konfiguration nur bei erfolgreicher Verbindung $bayern_db->set_charset('utf8mb4'); $bayern_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $bayern_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { // Fehler protokollieren (ersetzen Sie dies durch Ihre bevorzugte Protokollierung) error_log("Bayern DB Verbindungsfehler: " . $e->getMessage()); $bayern_db = null; } } return $bayern_db; } function db_buch() { // 1. Statische Variable für persistente Verbindung (Speicher-Optimierung) static $buch_db = null; mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 3. Prüfen, ob die Verbindung bereits hergestellt wurde if ($buch_db === null) { try { // Verbindung herstellen (mit persistenter Verbindung 'p:localhost') $buch_db = new mysqli('p:localhost', 'buch_muenchen', '1956Santino1956', 'buch_muenchen'); // Konfiguration nur bei erfolgreicher Verbindung $buch_db->set_charset('utf8mb4'); $buch_db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); $buch_db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); } catch (mysqli_sql_exception $e) { error_log("Buch DB Verbindungsfehler: " . $e->getMessage()); $buch_db = null; } } return $buch_db; }