浏览代码

Bilder werden wieder lokal gespeichert

erdo 1 月之前
父节点
当前提交
d403c95d9e
共有 4 个文件被更改,包括 73 次插入27 次删除
  1. 48 14
      admin.php
  2. 8 8
      gesamtliste.php
  3. 10 4
      gespielte_spiele.php
  4. 7 1
      index.php

+ 48 - 14
admin.php

@@ -35,23 +35,52 @@ if (isset($_POST['save_game'])) {
     $r_id = (int)$_POST['game_reihe_id'];
     $t_id = ($_POST['game_typ_id'] == '0') ? null : (int)$_POST['game_typ_id'];
     $l_id = ($_POST['game_level_id'] == '0') ? null : (int)$_POST['game_level_id'];
-    $ean = (!isset($_POST['ean']) || $_POST['ean'] === '') ? null : $_POST['ean'];
-    $url = !empty($_POST['url']) ? $_POST['url'] : 'https://via.placeholder.com/300x180';
+    
+    // EAN BEREINIGUNG: NUR LEERZEICHEN ENTFERNEN
+    $eanRaw = $_POST['ean'] ?? '';
+    $eanClean = str_replace(' ', '', (string)$eanRaw);
+    $ean = ($eanClean === '') ? null : $eanClean;
+    
+    $urlInput = trim($_POST['url']);
 
     try {
+        $pdo->beginTransaction();
+
         if ($id > 0) {
-            $stmt = $pdo->prepare("UPDATE spiele SET game_reihe_id=?, titel=?, game_typ_id=?, game_level_id=?, ean=?, bild_url=? WHERE id=?");
-            $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $url, $id]);
-            $msg = "Spiel aktualisiert!";
+            $stmt = $pdo->prepare("UPDATE spiele SET game_reihe_id=?, titel=?, game_typ_id=?, game_level_id=?, ean=? WHERE id=?");
+            $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $id]);
+            $spiel_id = $id;
         } else {
-            $stmt = $pdo->prepare("INSERT INTO spiele (game_reihe_id, titel, game_typ_id, game_level_id, ean, bild_url) VALUES (?,?,?,?,?,?)");
-            $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean, $url]);
-            $msg = "Neues Spiel angelegt!";
+            $stmt = $pdo->prepare("INSERT INTO spiele (game_reihe_id, titel, game_typ_id, game_level_id, ean) VALUES (?,?,?,?,?)");
+            $stmt->execute([$r_id, $_POST['titel'], $t_id, $l_id, $ean]);
+            $spiel_id = $pdo->lastInsertId();
+        }
+
+        // BILD-DOWNLOAD LOGIK (Nur bei externen URLs)
+        if (!empty($urlInput) && strpos($urlInput, 'http') === 0) {
+            $ext = pathinfo(parse_url($urlInput, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'jpg';
+            // Dateiname basiert auf bereinigter EAN (oder ID)
+            $fileName = (!empty($eanClean) ? $eanClean : "game_" . $spiel_id) . "." . $ext;
+            $destPath = IMG_PATH . $fileName;
+
+            $imgData = @file_get_contents($urlInput);
+            if ($imgData && file_put_contents($destPath, $imgData)) {
+                $pdo->prepare("UPDATE spiele SET bild_url=? WHERE id=?")->execute([$fileName, $spiel_id]);
+            }
+        } elseif (!empty($urlInput)) {
+            // Falls bereits ein Dateiname oder lokaler Pfad übergeben wurde
+            $pdo->prepare("UPDATE spiele SET bild_url=? WHERE id=?")->execute([$urlInput, $spiel_id]);
         }
-    } catch (PDOException $e) { $error = "Fehler: " . $e->getMessage(); }
+
+        $pdo->commit();
+        $msg = ($id > 0) ? "Spiel aktualisiert!" : "Neues Spiel angelegt!";
+    } catch (PDOException $e) { 
+        $pdo->rollBack();
+        $error = "Fehler: " . $e->getMessage(); 
+    }
 }
 
-// STAMMDATEN HINZUFÜGEN (Duplikat-Check)
+// STAMMDATEN LOGIK (Bleibt unverändert)
 if (isset($_POST['add_reihe'])) {
     $c = $pdo->prepare("SELECT id FROM game_reihe WHERE name=?"); $c->execute([$_POST['name']]);
     if ($c->fetch()) { $error = "Reihe existiert bereits!"; }
@@ -96,7 +125,6 @@ $spiele  = $pdo->query("SELECT s.*, r.name as r_name FROM spiele s LEFT JOIN gam
     <title>Admin Dashboard</title>
     <style>
         :root { --accent: #e67e22; --bg: #f4f7f6; --card: #fff; --text: #333; --border: #ddd; }
-        .dark-theme { --bg: #1a1a1a; --card: #2d2d2d; --text: #eee; --border: #444; }
         body { font-family: 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 20px; }
         .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }
         .nav-tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid var(--border); }
@@ -144,12 +172,17 @@ $spiele  = $pdo->query("SELECT s.*, r.name as r_name FROM spiele s LEFT JOIN gam
     </form>
 
     <table>
-        <thead><tr><th>Bild</th><th>Reihe</th><th>Titel</th><th>Typ / Level</th><th>EAN</th><th>Bild-URL</th><th>Aktion</th></tr></thead>
+        <thead><tr><th>Bild</th><th>Reihe</th><th>Titel</th><th>Typ / Level</th><th>EAN</th><th>Bild / Link</th><th>Aktion</th></tr></thead>
         <?php foreach($spiele as $s): ?>
         <tr>
             <form method="POST">
             <input type="hidden" name="id" value="<?=$s['id']?>">
-            <td><img src="<?=htmlspecialchars($s['bild_url'])?>" class="img-preview" onerror="this.src='https://via.placeholder.com/45';"></td>
+            <td>
+                <?php 
+                    $src = (strpos($s['bild_url'], 'http') === 0) ? $s['bild_url'] : IMG_URL . $s['bild_url'];
+                ?>
+                <img src="<?=htmlspecialchars($src)?>" class="img-preview" onerror="this.src='https://via.placeholder.com/45';">
+            </td>
             <td><select name="game_reihe_id" id="r_<?=$s['id']?>" onchange="filter(<?=$s['id']?>)"><?php foreach($reihen as $r): ?><option value="<?=$r['id']?>" <?=$s['game_reihe_id']==$r['id']?'selected':''?>><?=$r['name']?></option><?php endforeach; ?></select></td>
             <td><input type="text" name="titel" value="<?=htmlspecialchars($s['titel'])?>"></td>
             <td>
@@ -206,7 +239,8 @@ function openTab(evt, name) {
     evt.currentTarget.classList.add('active');
 }
 function filter(id) {
-    let r_val = document.getElementById('r_'+id).value;
+    let r_el = document.getElementById('r_'+id); if(!r_el) return;
+    let r_val = r_el.value;
     ['t_'+id, 'l_'+id].forEach(sid => {
         let sel = document.getElementById(sid); if(!sel) return;
         sel.querySelectorAll('option').forEach(o => {

+ 8 - 8
gesamtliste.php

@@ -1,4 +1,5 @@
 <?php
+require_once 'config.php'; // NEU: Für IMG_URL
 require_once 'db_config.php';
 
 // Filter-Werte abrufen
@@ -79,7 +80,6 @@ $typen = $pdo->query("SELECT * FROM game_typ ORDER BY bezeichnung ASC")->fetchAl
         .game-thumb:hover { transform: scale(1.1); border-color: var(--accent); }
 
         .lvl-badge { padding: 4px 10px; border-radius: 20px; color: white; font-size: 11px; font-weight: bold; text-transform: uppercase; }
-        /* Dynamische Klassen für Level-Farben */
         .lvl-Einsteiger { background: #27ae60; } 
         .lvl-Fortgeschrittene { background: #2980b9; } 
         .lvl-Profi { background: #c0392b; }
@@ -147,13 +147,17 @@ $typen = $pdo->query("SELECT * FROM game_typ ORDER BY bezeichnung ASC")->fetchAl
                 $lvlName = $row['level_name'] ?: 'unknown';
                 $typ = $row['typ_name'] ?: 'Standard';
                 $reihe = $row['reihe_name'] ?: 'Sonstige';
+
+                // MINIMALE ÄNDERUNG: Pfad-Logik für Bilder
+                $b = $row['bild_url'];
+                $imgSrc = empty($b) ? 'https://via.placeholder.com/60?text=?' : (strpos($b, 'http') === 0 ? $b : IMG_URL . $b);
             ?>
             <tr>
                 <td>
-                    <img src="<?= htmlspecialchars($row['bild_url']) ?>" 
+                    <img src="<?= htmlspecialchars($imgSrc) ?>" 
                          class="game-thumb" 
-                         onclick="openModal('<?= htmlspecialchars($row['bild_url']) ?>')"
-                         onmouseover="showPreview(event, '<?= htmlspecialchars($row['bild_url']) ?>')" 
+                         onclick="openModal('<?= htmlspecialchars($imgSrc) ?>')"
+                         onmouseover="showPreview(event, '<?= htmlspecialchars($imgSrc) ?>')" 
                          onmouseout="hidePreview()"
                          onerror="this.src='https://via.placeholder.com/60?text=?'">
                 </td>
@@ -204,7 +208,6 @@ $typen = $pdo->query("SELECT * FROM game_typ ORDER BY bezeichnung ASC")->fetchAl
 <img id="hoverPreview" class="image-preview" src="">
 
 <script>
-    // Theme Switcher
     function toggleTheme() {
         const isDark = document.documentElement.classList.toggle('dark-theme');
         localStorage.setItem('theme', isDark ? 'dark' : 'light');
@@ -215,7 +218,6 @@ $typen = $pdo->query("SELECT * FROM game_typ ORDER BY bezeichnung ASC")->fetchAl
         document.getElementById('theme-icon').innerText = '☀️';
     }
 
-    // Modal & Preview Logik
     const modal = document.getElementById("imgModal");
     const modalImg = document.getElementById("modalContent");
     function openModal(url) { modal.style.display = "flex"; modalImg.src = url; hidePreview(); }
@@ -232,14 +234,12 @@ $typen = $pdo->query("SELECT * FROM game_typ ORDER BY bezeichnung ASC")->fetchAl
     }
     document.addEventListener('mousemove', (e) => { if(preview.style.display==='block') updatePos(e); });
 
-    // Live-Suche
     function filterTable() {
         let val = document.getElementById("searchInput").value.toUpperCase();
         let tr = document.getElementById("exitTable").getElementsByTagName("tr");
         for (let i = 1; i < tr.length; i++) tr[i].style.display = tr[i].innerText.toUpperCase().includes(val) ? "" : "none";
     }
 
-    // Sortierung
     function sortTable(n) {
         var table = document.getElementById("exitTable");
         var rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;

+ 10 - 4
gespielte_spiele.php

@@ -1,5 +1,6 @@
 <?php
-include 'db_config.php'; 
+require_once 'config.php'; // NEU: Damit IMG_URL bekannt ist
+require_once 'db_config.php'; 
 
 // --- 1. DATEN LADEN ---
 $allTeams = $pdo->query("SELECT * FROM spieler ORDER BY name ASC")->fetchAll();
@@ -60,7 +61,7 @@ foreach ($results as $row) {
         }
 
         body { font-family: 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); padding: 15px; transition: 0.3s; margin: 0; }
-        .container { max-width: 1400px; margin: 0 auto; } /* Container verbreitert */
+        .container { max-width: 1400px; margin: 0 auto; }
 
         header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; border-bottom: 2px solid var(--accent); padding-bottom: 8px; }
         h1 { color: var(--accent); margin: 0; font-size: 1.4rem; }
@@ -73,7 +74,6 @@ foreach ($results as $row) {
 
         .reihe-divider { grid-column: 1 / -1; margin: 25px 0 10px; padding: 8px 15px; background: var(--reihe-bg); color: white; border-radius: 6px; font-size: 0.9rem; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; }
 
-        /* Raster verkleinert für mehr Karten nebeneinander */
         .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 15px; }
         
         .item { background: var(--card); border-radius: 8px; border: 1px solid var(--border); box-shadow: 0 2px 8px rgba(0,0,0,0.1); overflow: hidden; display: flex; flex-direction: column; }
@@ -130,7 +130,13 @@ foreach ($results as $row) {
             
             <?php foreach ($games as $gameId => $data): ?>
                 <div class="item">
-                    <img src="<?= htmlspecialchars($data['bild_url']) ?>" onerror="this.src='https://via.placeholder.com/240x140?text=EXIT'">
+                    <?php 
+                        // BILD URL REPARIEREN
+                        $b = $data['bild_url'];
+                        $imgSrc = empty($b) ? 'https://via.placeholder.com/240x140?text=EXIT' : (strpos($b, 'http') === 0 ? $b : IMG_URL . $b);
+                    ?>
+                    <img src="<?= htmlspecialchars($imgSrc) ?>" onerror="this.src='https://via.placeholder.com/240x140?text=EXIT'">
+                    
                     <div class="stats">
                         <span class="game-title"><?= htmlspecialchars($data['titel']) ?></span>
                         <span class="game-subtitle"><?= htmlspecialchars($data['typ_name'] ?: '') ?></span>

+ 7 - 1
index.php

@@ -1,4 +1,5 @@
 <?php
+require_once 'config.php'; // NEU: Damit IMG_URL bekannt ist
 require_once 'db_config.php';
 
 // --- 1. DATEN LADEN (REIHEN FÜR DEN FILTER) ---
@@ -136,7 +137,12 @@ function getStarRating($val) {
                 <?php foreach ($exitGames as $game): ?>
                     <div class="swiper-slide">
                         <div class="card">
-                            <img src="<?= htmlspecialchars($game['bild_url']) ?>" onerror="this.src='https://via.placeholder.com/300x160?text=Kein+Cover'">
+                            <?php 
+                                // ANPASSUNG: Pfadbereinigung
+                                $b = $game['bild_url'];
+                                $imgSrc = (empty($b)) ? 'https://via.placeholder.com/300x160?text=Kein+Cover' : (strpos($b, 'http') === 0 ? $b : IMG_URL . $b);
+                            ?>
+                            <img src="<?= htmlspecialchars($imgSrc) ?>" onerror="this.src='https://via.placeholder.com/300x160?text=Kein+Cover'">
                             <div class="content">
                                 <span class="reihe-label"><?= htmlspecialchars($game['reihe_name']) ?></span>
                                 <h2><?= htmlspecialchars($game['titel']) ?></h2>