setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); return $db; } catch (PDOException $e) { die('数据库连接失败: ' . $e->getMessage()); } } // 初始化数据库 function initDB() { $db = getDB(); // 管理员表 $db->exec(" CREATE TABLE IF NOT EXISTS admins ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, avatar TEXT ) "); // 电影院表 $db->exec(" CREATE TABLE IF NOT EXISTS cinemas ( id INTEGER PRIMARY KEY AUTOINCREMENT, place TEXT NOT NULL, name TEXT NOT NULL, address TEXT, color TEXT DEFAULT '#888888' ) "); // 电影表 $db->exec(" CREATE TABLE IF NOT EXISTS movies ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, info TEXT, remark TEXT, poster_path TEXT, ticket_path TEXT, photo_path TEXT, cinema_id INTEGER, watch_date DATE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (cinema_id) REFERENCES cinemas(id) ON DELETE SET NULL ) "); // 观影人表 $db->exec(" CREATE TABLE IF NOT EXISTS persons ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, color TEXT DEFAULT '#888888', avatar TEXT ) "); // 观影关联表 $db->exec(" CREATE TABLE IF NOT EXISTS viewers ( id INTEGER PRIMARY KEY AUTOINCREMENT, movie_id INTEGER NOT NULL, name TEXT, person_id INTEGER, FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE, FOREIGN KEY (person_id) REFERENCES persons(id) ON DELETE SET NULL ) "); // 多照片表 $db->exec(" CREATE TABLE IF NOT EXISTS movie_photos ( id INTEGER PRIMARY KEY AUTOINCREMENT, movie_id INTEGER NOT NULL, photo_path TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE ) "); // ===== 迁移字段 ===== try { $db->exec("ALTER TABLE cinemas ADD COLUMN color TEXT DEFAULT '#888888'"); } catch (PDOException $e) {} try { $db->exec("ALTER TABLE admins ADD COLUMN avatar TEXT"); } catch (PDOException $e) {} try { $db->exec("ALTER TABLE persons ADD COLUMN avatar TEXT"); } catch (PDOException $e) {} try { $db->exec("ALTER TABLE movies ADD COLUMN remark TEXT"); } catch (PDOException $e) {} try { $db->exec("ALTER TABLE viewers ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {} // 新增:管理员关联观影人 try { $db->exec("ALTER TABLE admins ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {} // ===== 迁移旧数据 ===== // 将 viewers.name 迁移到 persons $stmt = $db->query("SELECT DISTINCT name FROM viewers WHERE name != '' AND name IS NOT NULL"); $names = $stmt->fetchAll(PDO::FETCH_COLUMN); foreach ($names as $name) { $chk = $db->prepare("SELECT id FROM persons WHERE name = ?"); $chk->execute([$name]); if (!$chk->fetch()) { $ins = $db->prepare("INSERT INTO persons (name) VALUES (?)"); $ins->execute([$name]); } } $update = $db->prepare("UPDATE viewers SET person_id = (SELECT id FROM persons WHERE persons.name = viewers.name) WHERE person_id IS NULL AND name IS NOT NULL"); $update->execute(); // 默认管理员 $stmt = $db->prepare("SELECT COUNT(*) FROM admins"); $stmt->execute(); if ($stmt->fetchColumn() == 0) { $hashed = password_hash('123456', PASSWORD_DEFAULT); $stmt = $db->prepare("INSERT INTO admins (username, password) VALUES (?, ?)"); $stmt->execute(['admin', $hashed]); } }