398 lines
15 KiB
PHP
398 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* Script d'initialisation de la base de données - MH Wilds - Partage de Quêtes à Couronnes
|
|
*/
|
|
|
|
// Activer l'affichage des erreurs pour le débogage
|
|
ini_set('display_errors', 1);
|
|
ini_set('display_startup_errors', 1);
|
|
error_reporting(E_ALL);
|
|
|
|
// Démarrer la session
|
|
session_start();
|
|
|
|
// Définir une constante pour empêcher l'accès direct aux includes
|
|
define('SECURE_ACCESS', true);
|
|
|
|
// Chemins absolus pour éviter les problèmes d'inclusion
|
|
$root_path = dirname(__FILE__);
|
|
|
|
// Inclure les fichiers nécessaires directement
|
|
require_once $root_path . '/includes/config.php';
|
|
require_once $root_path . '/includes/functions.php';
|
|
|
|
// Définir nos propres fonctions de base de données pour ce script
|
|
function get_db_connection() {
|
|
global $root_path;
|
|
$db_path = $root_path . '/data/mhwilds.db';
|
|
|
|
try {
|
|
// Créer le dossier data s'il n'existe pas
|
|
$data_dir = dirname($db_path);
|
|
if (!file_exists($data_dir)) {
|
|
mkdir($data_dir, 0755, true);
|
|
}
|
|
|
|
// Créer une nouvelle connexion PDO à la base de données SQLite
|
|
$db = new PDO('sqlite:' . $db_path);
|
|
|
|
// Configurer PDO pour lever des exceptions en cas d'erreur
|
|
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
// Activer les clés étrangères
|
|
$db->exec('PRAGMA foreign_keys = ON;');
|
|
|
|
return $db;
|
|
} catch (PDOException $e) {
|
|
die("Erreur de connexion à la base de données: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
// Vérifier si un paramètre de confirmation est présent
|
|
$confirmed = isset($_GET['confirm']) && $_GET['confirm'] === 'yes';
|
|
|
|
// Vérifier si un paramètre d'authentification est présent
|
|
$auth_key = isset($_GET['key']) ? $_GET['key'] : '';
|
|
$valid_auth = $auth_key === 'mhwilds2025';
|
|
|
|
if (!$valid_auth) {
|
|
die('Accès non autorisé. Veuillez fournir une clé d\'authentification valide.');
|
|
}
|
|
|
|
// Liste des 29 monstres de Monster Hunter Wilds
|
|
$monsters = [
|
|
['id' => 1, 'name' => 'Chatacabra', 'image' => 'assets/img/Chatacabra.jpg'],
|
|
['id' => 2, 'name' => 'Quematrice', 'image' => 'assets/img/Quematrice.jpg'],
|
|
['id' => 3, 'name' => 'Lala Barina', 'image' => 'assets/img/Lala_Barina.jpg'],
|
|
['id' => 4, 'name' => 'Congalala', 'image' => 'assets/img/Congalala.jpg'],
|
|
['id' => 5, 'name' => 'Balahara', 'image' => 'assets/img/Balahara.jpg'],
|
|
['id' => 6, 'name' => 'Doshaguma', 'image' => 'assets/img/Doshaguma.jpg'],
|
|
['id' => 7, 'name' => 'Uth Duna', 'image' => 'assets/img/Uth_Duna.jpg'],
|
|
['id' => 8, 'name' => 'Rompopolo', 'image' => 'assets/img/Rompopolo.jpg'],
|
|
['id' => 9, 'name' => 'Rey Dau', 'image' => 'assets/img/Rey_Dau.jpg'],
|
|
['id' => 10, 'name' => 'Nerscylla', 'image' => 'assets/img/Nerscylla.jpg'],
|
|
['id' => 11, 'name' => 'Hirabami', 'image' => 'assets/img/Hirabami.jpg'],
|
|
['id' => 12, 'name' => 'Ajarakan', 'image' => 'assets/img/Ajarakan.jpg'],
|
|
['id' => 13, 'name' => 'Nu Udra', 'image' => 'assets/img/Nu_Udra.jpg'],
|
|
['id' => 14, 'name' => 'Doshaguma Gardien', 'image' => 'assets/img/Doshaguma_Gardien.jpg'],
|
|
['id' => 15, 'name' => 'Rathalos Gardien', 'image' => 'assets/img/Rathalos_Gardien.jpg'],
|
|
['id' => 16, 'name' => 'Jin Dahaad', 'image' => 'assets/img/Jin_Dahaad.jpg'],
|
|
['id' => 17, 'name' => 'Odogaron Désastre Gardien', 'image' => 'assets/img/Odogaron_Desastre_Gardien.jpg'],
|
|
['id' => 18, 'name' => 'Xu Wu', 'image' => 'assets/img/Xu_Wu.jpg'],
|
|
['id' => 19, 'name' => 'Arkveld Gardien', 'image' => 'assets/img/Arkveld_Gardien.jpg'],
|
|
['id' => 20, 'name' => 'Zoh Shia', 'image' => 'assets/img/Zoh_Shia.jpg'],
|
|
['id' => 21, 'name' => 'Yian Kut-Ku', 'image' => 'assets/img/Yian_Kut-Ku.jpg'],
|
|
['id' => 22, 'name' => 'Gypceros', 'image' => 'assets/img/Gypceros.jpg'],
|
|
['id' => 23, 'name' => 'Rathian', 'image' => 'assets/img/Rathian.jpg'],
|
|
['id' => 24, 'name' => 'Anjanath Tonnerre Gardien', 'image' => 'assets/img/Anjanath_Tonnerre_Gardien.jpg'],
|
|
['id' => 25, 'name' => 'Rathalos', 'image' => 'assets/img/Rathalos.jpg'],
|
|
['id' => 26, 'name' => 'Gravios', 'image' => 'assets/img/Gravios.jpg'],
|
|
['id' => 27, 'name' => 'Blangonga', 'image' => 'assets/img/Blangonga.jpg'],
|
|
['id' => 28, 'name' => 'Gore Malaga', 'image' => 'assets/img/Gore_Malaga.jpg'],
|
|
['id' => 29, 'name' => 'Arkveld', 'image' => 'assets/img/Arkveld.jpg']
|
|
];
|
|
|
|
// Récupérer les données exemple pour les quêtes et annonces
|
|
$sample_quests = [
|
|
['monster_id' => 1, 'crown_type' => 'small', 'player_name' => 'Hunter123', 'player_id' => 'MHW-1234'],
|
|
['monster_id' => 1, 'crown_type' => 'large', 'player_name' => 'DragonSlayer', 'player_id' => 'MHW-5678'],
|
|
['monster_id' => 2, 'crown_type' => 'small', 'player_name' => 'ThunderLord', 'player_id' => 'MHW-9012']
|
|
];
|
|
|
|
$sample_announcements = [
|
|
['text' => 'Bienvenue sur le site de partage de quêtes à couronnes pour Monster Hunter Wilds !', 'active' => 1]
|
|
];
|
|
|
|
// Si la confirmation n'est pas donnée, afficher une page d'information
|
|
if (!$confirmed) {
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
echo '<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Initialisation de la base de données - MH Wilds</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
background-color: #272420;
|
|
color: #f5f0e6;
|
|
}
|
|
.card {
|
|
background-color: #3a362f;
|
|
border: none;
|
|
}
|
|
.card-header {
|
|
background-color: #e0b968;
|
|
color: #1a1914;
|
|
}
|
|
.btn-primary {
|
|
background-color: #e0b968;
|
|
border-color: #e0b968;
|
|
color: #1a1914;
|
|
}
|
|
.btn-danger {
|
|
background-color: #e05e4e;
|
|
border-color: #e05e4e;
|
|
}
|
|
.btn-secondary {
|
|
background-color: #5a90b1;
|
|
border-color: #5a90b1;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container my-5">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h1 class="h4">Initialisation de la base de données</h1>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="alert alert-warning">
|
|
<p><strong>Attention :</strong> Ce script va initialiser la base de données avec les 29 monstres de Monster Hunter Wilds.</p>
|
|
<p>Si une base de données existe déjà, les données existantes seront <strong>conservées</strong> mais les monstres manquants seront ajoutés.</p>
|
|
</div>
|
|
|
|
<h3>Liste des monstres à initialiser :</h3>
|
|
<ul>';
|
|
|
|
foreach ($monsters as $monster) {
|
|
echo '<li>' . htmlspecialchars($monster['name']) . '</li>';
|
|
}
|
|
|
|
echo '</ul>
|
|
|
|
<p>Ce script va également créer les tables nécessaires si elles n\'existent pas déjà.</p>
|
|
|
|
<div class="mt-4">
|
|
<a href="initdb.php?confirm=yes&key=' . $auth_key . '" class="btn btn-danger">Initialiser la base de données</a>
|
|
<a href="index.php" class="btn btn-secondary ms-2">Annuler</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>';
|
|
exit;
|
|
}
|
|
|
|
// Si on arrive ici, c'est que la confirmation a été donnée
|
|
try {
|
|
// Obtenir une connexion à la base de données
|
|
$db = get_db_connection();
|
|
|
|
// Démarrer une transaction
|
|
$db->beginTransaction();
|
|
|
|
// Créer les tables si elles n'existent pas déjà
|
|
// Table des monstres
|
|
$db->exec("CREATE TABLE IF NOT EXISTS monsters (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
image TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)");
|
|
|
|
// Table des quêtes
|
|
$db->exec("CREATE TABLE IF NOT EXISTS quests (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
monster_id INTEGER NOT NULL,
|
|
crown_type TEXT NOT NULL CHECK(crown_type IN ('small', 'large')),
|
|
player_name TEXT NOT NULL,
|
|
player_id TEXT NOT NULL,
|
|
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (monster_id) REFERENCES monsters(id) ON DELETE CASCADE
|
|
)");
|
|
|
|
// Table des annonces
|
|
$db->exec("CREATE TABLE IF NOT EXISTS announcements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
text TEXT NOT NULL,
|
|
active INTEGER DEFAULT 1,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)");
|
|
|
|
// Table des utilisateurs admin
|
|
$db->exec("CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)");
|
|
|
|
// Insérer l'utilisateur admin par défaut s'il n'existe pas
|
|
$stmt = $db->prepare("INSERT OR IGNORE INTO users (username, password) VALUES (?, ?)");
|
|
$stmt->execute(['admin', '$2y$10$JhrzSCmNKJ9ZethKestSxO76uvauWB4SnUj.QJzpHrbJ3enCNzkhe']);
|
|
|
|
// Insérer les monstres
|
|
$stmt = $db->prepare("INSERT OR IGNORE INTO monsters (id, name, image) VALUES (?, ?, ?)");
|
|
$total_monsters = 0;
|
|
|
|
foreach ($monsters as $monster) {
|
|
$stmt->execute([$monster['id'], $monster['name'], $monster['image']]);
|
|
if ($stmt->rowCount() > 0) {
|
|
$total_monsters++;
|
|
}
|
|
}
|
|
|
|
// Insérer les quêtes et annonces d'exemple seulement s'il n'y a pas déjà des données
|
|
$quests_count = $db->query("SELECT COUNT(*) FROM quests")->fetchColumn();
|
|
$announcements_count = $db->query("SELECT COUNT(*) FROM announcements")->fetchColumn();
|
|
|
|
$sample_data_added = false;
|
|
|
|
if ($quests_count == 0) {
|
|
$stmt = $db->prepare("INSERT INTO quests (monster_id, crown_type, player_name, player_id) VALUES (?, ?, ?, ?)");
|
|
foreach ($sample_quests as $quest) {
|
|
$stmt->execute([$quest['monster_id'], $quest['crown_type'], $quest['player_name'], $quest['player_id']]);
|
|
}
|
|
$sample_data_added = true;
|
|
}
|
|
|
|
if ($announcements_count == 0) {
|
|
$stmt = $db->prepare("INSERT INTO announcements (text, active) VALUES (?, ?)");
|
|
foreach ($sample_announcements as $announcement) {
|
|
$stmt->execute([$announcement['text'], $announcement['active']]);
|
|
}
|
|
$sample_data_added = true;
|
|
}
|
|
|
|
// Valider la transaction
|
|
$db->commit();
|
|
|
|
// Afficher le résultat
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
echo '<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Initialisation réussie - MH Wilds</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
background-color: #272420;
|
|
color: #f5f0e6;
|
|
}
|
|
.card {
|
|
background-color: #3a362f;
|
|
border: none;
|
|
}
|
|
.card-header {
|
|
background-color: #6bc46f;
|
|
color: #1a1914;
|
|
}
|
|
.btn-primary {
|
|
background-color: #e0b968;
|
|
border-color: #e0b968;
|
|
color: #1a1914;
|
|
}
|
|
.alert-success {
|
|
background-color: #6bc46f;
|
|
color: #1a1914;
|
|
border-color: #6bc46f;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container my-5">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h1 class="h4">Initialisation réussie</h1>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="alert alert-success">
|
|
<p><strong>Succès :</strong> La base de données a été initialisée avec succès !</p>
|
|
</div>
|
|
|
|
<h3>Résultats :</h3>
|
|
<ul>
|
|
<li>' . $total_monsters . ' monstres ont été ajoutés (les monstres existants ont été ignorés)</li>';
|
|
|
|
if ($sample_data_added) {
|
|
echo '<li>Les données d\'exemple (quêtes et annonces) ont été ajoutées</li>';
|
|
} else {
|
|
echo '<li>Les données d\'exemple n\'ont pas été ajoutées car il existe déjà des données</li>';
|
|
}
|
|
|
|
echo '</ul>
|
|
|
|
<div class="mt-4">
|
|
<a href="index.php" class="btn btn-primary">Retour à l\'accueil</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>';
|
|
|
|
} catch (Exception $e) {
|
|
// En cas d'erreur, annuler la transaction
|
|
if (isset($db) && $db->inTransaction()) {
|
|
$db->rollBack();
|
|
}
|
|
|
|
// Afficher l'erreur
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
echo '<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Erreur d\'initialisation - MH Wilds</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
background-color: #272420;
|
|
color: #f5f0e6;
|
|
}
|
|
.card {
|
|
background-color: #3a362f;
|
|
border: none;
|
|
}
|
|
.card-header {
|
|
background-color: #e05e4e;
|
|
color: #1a1914;
|
|
}
|
|
.btn-secondary {
|
|
background-color: #5a90b1;
|
|
border-color: #5a90b1;
|
|
}
|
|
.alert-danger {
|
|
background-color: #e05e4e;
|
|
color: #1a1914;
|
|
border-color: #e05e4e;
|
|
}
|
|
pre {
|
|
background-color: #1a1914;
|
|
color: #f5f0e6;
|
|
padding: 10px;
|
|
border-radius: 5px;
|
|
overflow: auto;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container my-5">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h1 class="h4">Erreur d\'initialisation</h1>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="alert alert-danger">
|
|
<p><strong>Erreur :</strong> Une erreur s\'est produite lors de l\'initialisation de la base de données.</p>
|
|
<p>Veuillez vérifier que le dossier "data" est accessible en écriture et que SQLite est activé sur votre serveur.</p>
|
|
</div>
|
|
|
|
<h3>Détails de l\'erreur :</h3>
|
|
<pre>' . htmlspecialchars($e->getMessage()) . '</pre>
|
|
|
|
<div class="mt-4">
|
|
<a href="index.php" class="btn btn-secondary">Retour à l\'accueil</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>';
|
|
} |