Téléscopage de formulaire avec vérification captcha

Petit nouveau ! | 2 Messages

26 mai 2024, 23:29

Bonjour,

Je me tourne vers vous car, l'aide de chatGPT ne m'a pas été d'une grande aide pour détecter mes erreurs (nombreuses mais que j'ai corrigé au fur et à mesure seul). Ne jugez pas mon code qui peut sembler désuet mais le site n'avait pas été mis à jour depuis des années et ça été un gros travail pour virer des technos dépassées et plus fonctionnelles et d'avoir un code qui au moins respecte le plus possible le PHP, le HTML (XHTML Strict), le CSS3... Voici mon souci: mon site se compose de fichiers PHP:
frame.php squelette du site
connect.php pour se connecter à une base de données
captcha.php qui génère le captcha
base_Inc.php pour que la langue du site et son contenu soit adapté à la langue de l'utilisateur/navigateur
lang_main.php contenant certains scripts et surtout des variables contenant respectivement le menu du site, les textes, liens... et 3 formulaires: 1 pour envoyer un mail à l'auteur, 1 pour poster un commentaire, 1 qui permet de choisir le quiz et sa difficulté et 1 qui affiche le quiz du site. sur ces 4 formulaires, les 3 premiers s'appuient sur la validation d'un captcha (classique) mais j'ai des symptômes qui surviennent et me plante 2 des 3 formulaires:
le formulaire de quiz avec choix difficulté: validation + captcha = OK = appelle de la variable $site_main['quiz'] affichage du quiz. une fois les question répondues on valide (sans captcha) ça ouvre un popup indiquant le résultat (en même temps on stocke dans la base de données)

le formulaire d'envoi de mail : validation un popup s'ouvre avec la titulature about:blank et rien ne se passe (et j'ai pas demandé ce popup)sauf si je clique dans le champ du navigateur où est indiqué "https://www.last-chronicle.com/frame.php?Language=FR" j'ai un popup qui indique le mail a été envoyé avec succès

le formulaire pour ajouter un commentaire: une fois la validation effectuée un popup s'ouvre me demandant de répondre à la question 1 puis 2... jusqu'à la 6 où le popup se ferme et rien ne se passe (bizarrement hier j'avais aussi une erreur de variable me disant que la valeur 'difficulty' n'existait pas et j'obtenais l'affichage d'un message relevant de ce script: // Débogage : Vérification de l'existence de la clé $contentKey
if (!isset($site_lang[$contentKey])) {
    echo '<pre>';
    echo 'Clé $contentKey : ' . htmlspecialchars($contentKey) . "\n";
    echo 'Clés disponibles dans $site_lang : ' . "\n";
    print_r(array_keys($site_lang));
    echo '</pre>';
    die('Contenu non disponible. La clé "' . htmlspecialchars($contentKey) . '" n\'existe pas dans $site_lang.');
}
Je subodore qu'il y a un télescopage au niveau des formulaires qui ont pourtant chacun leur id, leur nom et que toutes les variables/valeurs ne sont pas les mêmes pour éviter la confusion.
Image
Image
Image
Je peux fournir les différents fichiers ou code. une fois ce souci résolu je pourrai travailler sur la modernisation du code et sur la partie responsive qui me fait défaut.

page frame.php
<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

session_start();

require_once("base_Inc.php"); //Cette page existe bel et bien
require_once("connect.php"); //Cette page existe bel et bien

$go = filter_input(INPUT_GET, 'go', FILTER_SANITIZE_NUMBER_INT) ?? 'accueil'; // Par défaut, 'accueil'

$includes = [
				'22' => 'score.php'
				];

if (array_key_exists($go, $includes)) {
    include($includes[$go]);
}

// Mapping for displaying content from $site_lang based on $go
$display = [
    '1'  => 'roman',
    '2'  => 'interview',
    '3'  => 'equipe',
    '4'  => 'credits',
    '5'  => 'chronologie',
    '6'  => 'geographie',
    '7'  => 'langues',
    '8'  => 'heraldique',
    '9'  => 'peuples',
    '10' => 'creatures',
    '11' => 'protagonistes',
    '12' => 'genealogie',
    '13' => 'dessins',
    '14' => 'animation',
    '15' => 'videos',
    '16' => 'musiques',
	'17' => 'questionnaire',
	'18' => 'livredor',
	'19' => 'contact',
    '20' => 'boutique',
	'21' => 'quiz',
	//'22' => 'score',
    '30' => 'ogarudh',
    '31' => 'damalior',
    '32' => 'simerii',
    '33' => 'nirverii',
    '41' => 'gaianor',
    '42' => 'magus',
    '43' => 'ogariths',
    '44' => 'elfes',
    '45' => 'simeriens',
    '46' => 'humains',
    '47' => 'nains',
    '48' => 'nirverius',
    '51' => 'damalochs',
    '52' => 'orcs',
    '53' => 'trolls',
    '54' => 'gobelins',
    '55' => 'elfesnoirs',
    '56' => 'magii',
    'default' => 'accueil'
];

// Déterminer la clé de contenu à utiliser
$contentKey = $display[$go] ?? $display['default']; // Use $display mapping to get the correct key

require_once('/home/lastchro/www/Languages/Lang_FR/lang_main.php'); // Assurez-vous que ce fichier définit bien le tableau $site_lang

// Vérifier si le tableau $site_lang est bien chargé
if (!isset($site_lang)) {
    die('Le tableau $site_lang n\'est pas défini.');
}

// Débogage : Vérification de l'existence de la clé $contentKey
if (!isset($site_lang[$contentKey])) {
    echo '<pre>';
    echo 'Clé $contentKey : ' . htmlspecialchars($contentKey) . "\n";
    echo 'Clés disponibles dans $site_lang : ' . "\n";
    print_r(array_keys($site_lang));
    echo '</pre>';
    die('Contenu non disponible. La clé "' . htmlspecialchars($contentKey) . '" n\'existe pas dans $site_lang.');
}

?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
    <title>:: La dernière chronique d'Yrneh - Last Chronicle of Yrneh - La Ultima Cronica de Yrneh - Yrneh ??????? ::</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link href="last.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="css/jquery.ui.css" />
    <link rel="stylesheet" href="css/default.css" />
    <script src="extras/all.js"></script>
    <script src="lib/hash.js"></script>
    <script src="lib/turn.min.js"></script>
    <script src="lib/zoom.min.js"></script>
    <script>
        if (parent !== window) {
            top.location.href = location.href;
        }
		
	function validateForm() {
    var allAnswered = true;
    document.querySelectorAll('tr').forEach((row, index) => {
        if (index > 0) { // Skip header row
            var inputs = row.querySelectorAll('input[type="radio"]');
            var answered = Array.from(inputs).some(input => input.checked);
            if (!answered) {
                alert('Please answer question number ' + index);
                allAnswered = false;
                return false;
            }
        }
    });
    return allAnswered;
}

function openResultWindow() {
    if (validateForm()) {
        var left = (screen.width/2)-(800/2);
        var top = (screen.height/2)-(200/2);
        window.open("", "MsgWindow", "width=800, height=200, scrollbars=yes, top="+top+", left="+left);
        return true;
    }
    return false;
}	
		
	 function closeWindow() {
                window.opener.location.href = 'https://www.last-chronicle.com/frame.php?go=17';
                window.close();
            }	
			
function reloadCaptcha() {
    document.getElementById('captchaImage').src = 'captcha.php?' + Date.now();
}			
    </script>
	<?php if (isset($_SESSION['message'])): ?>
<script>
    alert('<?php echo $_SESSION['message']; ?>');
    <?php unset($_SESSION['message']); // Nettoyer le message de la session après l'affichage ?>
</script>
<?php endif; ?>

</head>
<body>
    <div class="conteneur">
        <div class="header"></div>
        <?php echo $site_lang['menu']; ?>

		<div class="frame">
            <?php 
            // Afficher le contenu si la clé existe dans $site_lang
            if (isset($site_lang[$contentKey])) {
                echo $site_lang[$contentKey]; 
            } else {
                echo 'Contenu non disponible.';
            }
            ?>
		</div>
		
        <div class="footer"></div>
    </div>
</body>
</html>
base_Inc.php
<?php
/******************************************************************************/
/* Last-Chronicle - Conception et programmation par Arnaud Roussel            */
/* (c) 2002-2024 Yrneh - Tous droits réservés                                 */
/******************************************************************************/

// Configuration initiale du chemin de base
//define('HTML_ROOT_PATH', "./");
define('HTML_ROOT_PATH', '/home/lastchro/www/'); // Chemin absolu jusqu'à la racine de votre site

// Liste des langues disponibles sur le site
$Lang_List = ["FR", "JP", "EN", "DE", "RU", "CH", "PT", "ES", "IT", "HE"];

// Démarrage de la session
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// Détermination de la langue à partir du paramètre GET, de la session ou du navigateur
if (isset($_GET['Language']) && in_array($_GET['Language'], $Lang_List)) {
    $language = $_GET['Language'];
} elseif (!empty($_SESSION["UserLanguage"])) {
    $language = $_SESSION["UserLanguage"];
} else {
    $language = getPreferredLanguage($Lang_List);
}

// Si aucune langue valide n'est déterminée, afficher une page de sélection de la langue
if (empty($language)) {
    displayLanguageSelectionPage();
    exit;
}

// Enregistrer la langue déterminée dans la session et définir la constante
$_SESSION["UserLanguage"] = $language;
define('LANGUAGE', $language);
define('HTML_LANG_PATH', HTML_ROOT_PATH . 'Languages/Lang_' . LANGUAGE . '/');




// Afficher le chemin de base et le chemin de la langue pour le débogage
//echo "Chemin de base (HTML_ROOT_PATH): " . HTML_ROOT_PATH . "<br>";
//echo "Chemin complet vers le fichier de langue (HTML_LANG_PATH): " . HTML_LANG_PATH . "<br>";

//echo "Répertoire de travail actuel: " . getcwd() . "<br>";


// Inclusion du fichier de langue
require_once(HTML_LANG_PATH . "lang_main.php");


// Fonctions auxiliaires
function getPreferredLanguage(array $availableLanguages) {
    $pattern = '/^([a-z]{2})/i';
    $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    foreach ($languages as $lang) {
        if (preg_match($pattern, $lang, $matches)) {
            $langPrefix = strtoupper($matches[1]);
            if (in_array($langPrefix, $availableLanguages)) {
                return $langPrefix;
            }
        }
    }
    return null;
}

function displayLanguageSelectionPage() {
    $startUrl = $_SERVER["REQUEST_URI"] . (strpos($_SERVER["REQUEST_URI"], '?') === false ? '?' : '&');
    ?>
    <html>
    <body>
    <div align="center" style="margin-top: 200px;">
        <?php foreach (["FR" => "Bienvenue", "JP" => "Yokoso", "EN" => "Welcome", "DE" => "Willkommen", 
                       "RU" => "Priviet", "CH" => "Huanying", "PT" => "Bem vinda", "ES" => "Bienvenido", 
                       "IT" => "Benvenuto", "HE" => "Bruchim habaim"] as $code => $welcome) {
            echo '<a href="' . htmlspecialchars($startUrl . "Language=$code") . '">' . $welcome . '</a><br /><br />';
        }
        ?>
    </div>
    </body>
    </html>
    <?php
}
?>[/code]

captcha.php
[code]<?php
session_start();

header('Content-type: image/png');

// Générer un code aléatoire
$code = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6);
$_SESSION['captcha'] = $code;

// Dimensions de l'image
$image_width = 150;
$image_height = 50;

// Créer une image
$image = imagecreatetruecolor($image_width, $image_height);
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);
$noise_color = imagecolorallocate($image, 100, 120, 180);

// Remplir l'arrière-plan
imagefill($image, 0, 0, $background_color);

// Ajouter du bruit aléatoire
for ($i = 0; $i < 50; $i++) {
    imageline($image, rand(0, $image_width), rand(0, $image_height), rand(0, $image_width), rand(0, $image_height), $noise_color);
}

// Chemin vers la police TTF (à ajuster selon votre serveur)
$font = 'fonts/Arial.ttf';  // Assurez-vous que ce chemin est correct et que vous avez cette police sur votre serveur

// Calculer la taille du texte pour le centrer
$fontsize = 20;  // Taille de la police
$bbox = imagettfbbox($fontsize, 0, $font, $code);
$text_width = $bbox[2] - $bbox[0];
$text_height = $bbox[1] - $bbox[7];  // Baseline correction

// Coordonnées pour centrer le texte
$x = ($image_width - $text_width) / 2;
$y = ($image_height - $text_height) / 2 - $bbox[7];

// Ajouter du texte déformé
imagettftext($image, $fontsize, rand(-10, 10), $x, $y, $text_color, $font, $code);

// Output l'image
imagepng($image);
imagedestroy($image);
?>
lang_main.php
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

header('Content-Type: text/html; charset=utf-8');
include('connect.php');

if (!isset($_SESSION['captcha']) && (basename($_SERVER['PHP_SELF']) == 'captcha.php')) {
    $_SESSION['captcha'] = substr(md5(rand()), 0, 6);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {
    if ($_POST['captcha'] == $_SESSION['captcha']) {
        // Traitement pour l'envoi de mail
        if (isset($_POST['email']) && isset($_POST['nom']) && isset($_POST['message'])) {
            $nom = $_POST['nom'];
            $email = $_POST['email'];
            $message = $_POST['message'];

            $contenu = "Nom: $nom\nEmail: $email\nMessage:\n$message";
            $headers = "From: $email\r\n";

            if (mail('[email protected]', 'Message depuis  www.last-chronicle.com',  $contenu, $headers)) {
                $_SESSION['message'] = "Le mail a été envoyé avec succès.";
            } else {
                $_SESSION['message'] = "Une erreur est survenue, le mail n'a pas été envoyé.";
            }
        }

        // Traitement pour l'ajout de commentaire
        if (isset($_POST['author']) && isset($_POST['comment'])) {
            $author = $_POST['author'];
            $comment = $_POST['comment'];
            $stmt = $conn->prepare("INSERT INTO yrneh_messages (auteur, commentaire) VALUES (?, ?)"); //$conn is called since connect.php
            if (false === $stmt) {
                error_log("Erreur de préparation : " . $conn->error);
                $_SESSION['message'] = "Erreur technique, veuillez réessayer plus tard.";
            } else {
                $stmt->bind_param("ss", $author, $comment);
                if ($stmt->execute()) {
                    $_SESSION['message'] = "Commentaire ajouté avec succès. Veuillez retourner à la rubrique commentaire pour le voir.";
                } else {
                    error_log("Erreur d'exécution : " . $stmt->error);
                    $_SESSION['message'] = "Erreur lors de l'ajout du commentaire.";
                }
                $stmt->close();
            }
        }
    } else {
        $_SESSION['message'] = "Captcha incorrect.";
    }
    header("Location:  https://www.last-chronicle.com/frame.php?Language=FR");
 
    exit;
}



$date=date('Y');
$droits="<h5>Tous les noms et les lieux sont déposés et protégés par un copyright</h5>";

/////////////////////////////////////////////////////////////////////////////////////////
// Accueil du site
$site_lang['accueil']="";

/////////////////////////////////////////////////////////////////////////////////////////
// Menu du site
$site_lang['menu']="
<div id='menu'>
<ul>
<li><a href='#'><img src='img/roman.jpg' class='menu-img' alt='Roman' /></a>
<ul>
<li><a href='frame.php?go=1'>Roman</a></li>
<li><a href='frame.php?go=2'>Interview</a></li>
<li><a href='frame.php?go=3'>Equipe</a></li>
<li><a href='frame.php?go=4'>Crédits</a></li>
</ul>
</li>

<li><a href='#'><img src='img/monde.jpg' class='menu-img' alt='Monde' /></a>
<ul>
<li><a href='frame.php?go=5'>Chronologie</a></li>
<li><a href='frame.php?go=6'>Géographie</a></li>
<li><a href='frame.php?go=7'>Langues</a></li>
<li><a href='frame.php?go=8'>Blasons &amp; Artefacts</a></li>
</ul>
</li>

<li><a href='#'><img src='img/vivant.jpg' class='menu-img' alt='Vivant' /></a>
<ul>
<li><a href='frame.php?go=9'>Peuples</a></li>
<li><a href='frame.php?go=10'>Créatures</a></li>
<li><a href='frame.php?go=11'>Protagonistes</a></li>
<li><a href='frame.php?go=12'>Généalogie</a></li>
</ul></li>
<li><a href='#'><img src='img/multimedias.jpg' class='menu-img' alt='Multimédias' /></a>
<ul>
<li><a href='frame.php?go=13'>Dessins</a></li>
<li><a href='frame.php?go=14'>Animations</a></li>
<li><a href='frame.php?go=15'>Videos</a></li>
<li><a href='frame.php?go=16'>Musiques</a></li>
</ul></li>
<li><a href='#'><img src='img/communaute.jpg' class='menu-img' alt='Communauté' /></a>
<ul>
<li><a href='frame.php?go=17'>Quiz</a></li>
<li><a href='frame.php?go=18'>Livre d'or</a></li>
<li><a href='frame.php?go=19'>Contacts</a></li>
<li><a href='frame.php?go=20'>Boutique</a></li>
</ul></li>
</ul>
</div>
";

/////////////////////////////////////////////////////////////////////////////////////////
//Roman
$site_lang['roman']="...";
// il y a 56 variables j'ai tronqué le code pour garder celle contenant les bouts de codes nous intéressant (formulaires)

/////////////////////////////////////////////////////////////////////////////////////////
// Formulaire de contact //
$site_lang['contact'] = '
<h1>Contact</h1>
<h2>Formulaire pour envoyer un mail à l\'auteur</h2>
<h4>Pour envoyer un message à l\'auteur merci de compléter le formulaire ci-dessous.</h4>
<div style="text-align: center;">
    <form id="mailForm" name="mailForm" method="post" action="' . $_SERVER['PHP_SELF'] . '?go=19" onsubmit="return openResultWindow(this);">
        <label for="nom">Nom:</label><br />
        <input type="text" id="nom" name="nom" required><br /><br />
        <label for="email">Email:</label><br />
        <input type="email" id="email" name="email" required><br /><br />
        <label for="message">Message:</label><br />
        <textarea id="message" name="message" cols="60" rows="5" style="resize: none;" required></textarea><br /><br />
        <label for="captcha">Captcha:</label><br />
			<div class="captcha-container">
                <img id="captchaImage" src="captcha.php" alt="Captcha Image" style="margin-bottom: 10px;">
                <img id="reloadCaptchaButton" src="img/reload.png" alt="Reload Captcha" onclick="reloadCaptcha()" title="Reload Captcha">
            </div><br />
        <input type="text" id="captcha" name="captcha" required><br /><br />
        <input type="submit" name="submit" value="Envoyer">
    </form>
</div>'
.$droits;


/////////////////////////////////////////////////////////////////////////////////////////
// Partie Livre d'or
// Traitement du formulaire commentaires
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit']) && isset($_POST['comment'])) {
    if ($_POST['captcha'] == $_SESSION['captcha']) {
        
		
		
		if (isset($_POST['author']) && isset($_POST['comment'])) {
            $author = $_POST['author'];
            $comment = $_POST['comment'];
			
            $stmt = $conn->prepare("INSERT INTO yrneh_messages (auteur, commentaire) VALUES (?, ?)");
            if (false === $stmt) {
                error_log("Erreur de préparation : " . $conn->error);
                $_SESSION['message'] = "Erreur technique, veuillez réessayer plus tard.";
            } else {
                $stmt->bind_param("ss", $author, $comment);
                if ($stmt->execute()) {
                    $_SESSION['message'] = "Commentaire ajouté avec succès. Veuillez retourner à la rubrique commentaire pour le voir.";
                } else {
                    error_log("Erreur d'exécution : " . $stmt->error);
                    $_SESSION['message'] = "Erreur lors de l'ajout du commentaire.";
                }
                $stmt->close();
            }
        }
    } else {
        $_SESSION['message'] = "Captcha incorrect.";
    }
    header("Location:  https://www.last-chronicle.com/frame.php?go=18");
 
    exit;
}

//Affichage Formulaire du livre d'or
$site_lang['livredor'] = '
<h1>Page des commentaires</h1>
<h2>Formulaire pour poster un commentaire</h2>
<h4>Pour ajouter un commentaire merci de compléter le formulaire ci-dessous.</h4>
<div style="text-align: center;">
    <form id="commentForm" name="commentForm" method="post" action="' . $_SERVER['PHP_SELF'] . '?go=18" onsubmit="return openResultWindow(this);">
        Nom:<br/><input type="text" name="author" required><br />
        Commentaire:<br/><textarea name="comment" cols="60" rows="10" style="resize: none;" required></textarea><br />
			<div class="captcha-container">
                <img id="captchaImage" src="captcha.php" alt="Captcha Image" style="margin-bottom: 10px;">
                <img id="reloadCaptchaButton" src="img/reload.png" alt="Reload Captcha" onclick="reloadCaptcha()" title="Reload Captcha">
            </div><br />
        <label for="captcha">Captcha:</label><br />
		<input type="text" name="captcha" required><br />
        <input type="submit" name="submit" value="Envoyer">
    </form>
</div>
<br /><h2>Tableau des commentaires</h2>';

// Affichage des commentaires
$sql = "SELECT auteur, commentaire FROM yrneh_messages";
$result = $conn->query($sql);
$site_lang['livredor'] .= '<table class="equipe" aria-describedby="tableDescription">
  <caption></caption>';
$site_lang['livredor'] .= '<tr><td class="perso"><h3>Auteur</h3></td><td class="perso"><h3>Commentaires</h3></td></tr>';
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $site_lang['livredor'] .= "<tr><td class='perso'><h4>" . htmlspecialchars($row["auteur"]) . "</h4></td><td class='perso'><h4>" . htmlspecialchars($row["commentaire"]) . "</h4></td></tr>";
    }
} else {
    $site_lang['livredor'] .= "<tr><td class='perso' colspan='2'>Aucun commentaire trouvé.</td></tr>";
}
$site_lang['livredor'] .= '</table>';
// Ajout de la variable $droits sous le tableau
$site_lang['livredor'] .= $droits;

/////////////////////////////////////////////////////////////////////////////////////////
//Boutique //
$site_lang['boutique']="
<h1>La boutique du site</h1>
<table class='equipe' aria-describedby='tableDescription'>
<caption>Equipe du roman</caption>
<tr><td class='perso' ><h3>ROMAN PAPIER</h3></td><td class='perso'><h3>ROMAN NUMÉRIQUE</h3></td><td class='perso'><h3>ROMAN ILLUSTRÉ</h3></td></tr>
<tr><td class='perso' ><h4>...</h4></td><td class='perso'><h4>...</h4></td><td class='perso'><h4>...</h4></td></tr>
<tr><td class='perso' ><h3>MUGS</h3></td><td class='perso'><h3>T-SHIRTS</h3></td><td class='perso'><h3>HOODIES</h3></td></tr>
<tr><td class='perso' ><h4>...</h4></td><td class='perso'><h4>...</h4></td><td class='perso'><h4>...</h4></td></tr>
<tr><td class='perso' ><h3>MARQUE-PAGE</h3></td><td class='perso'><h3>POSTERS</h3></td><td class='perso'><h3>COSPLAY</h3></td></tr>
<tr><td class='perso' ><h4>...</h4></td><td class='perso'><h4>...</h4></td><td class='perso'><h4>...</h4></td></tr>
</table>
$droits";

/////////////////////////////////////////////////////////////////////////////////////////
// Préparer et exécuter la requête pour récupérer les scores de la partie questionnaire
$query = "SELECT participant, difficulty_Name, score, commentaire, temps FROM yrneh_score ORDER BY score DESC";
$scores = [];
if ($conn && !$conn->connect_error) {
    $result = $conn->query($query);
    if ($result) {
        while ($row = $result->fetch_assoc()) {
            $scores[] = $row;
        }
    } else {
        echo "<p>Aucun résultat trouvé.</p>";
    }
} else {
    die("Erreur de connexion : " . ($conn->connect_error ?? "Connexion non initialisée"));
}
/////////////////////////////////////////////////////////////////////////////////////////
// Page d'annonce du questionnaire et du choix de la difficulté + affichage des scores précédents
$site_lang['questionnaire'] = '
<div style="text-align: center;">
    <h1>Questionnaire des connaissances sur le roman et le site Tableau des Scores</h1>
	    <h2>Entrez vos informations pour commencer le quiz</h2>
    <form id="quizForm" name="quizForm" action="https://www.last-chronicle.com/frame.php?go=21" method="POST">
        <label for="participant">Votre nom:</label><br />
        <input type="text" id="participant" name="participant" required><br />
        <label for="difficulty">Choisissez le niveau de difficulté:</label><br />
        <select id="difficulty" name="difficulty">
            <option value="1">Débutant (10 questions)</option>
            <option value="2">Apprenti (20 questions)</option>
            <option value="3">Initié (40 questions)</option>
            <option value="4">Chevronné (60 questions)</option>
            <option value="5">Maître (80 questions)</option>
            <option value="6">Haut-Maître (100 questions)</option>
        </select><br />        
		<label for="captcha">Captcha:</label><br />
			<div class="captcha-container">
                <img id="captchaImage" src="captcha.php" alt="Captcha Image" style="margin-bottom: 10px;">
                <img id="reloadCaptchaButton" src="img/reload.png" alt="Reload Captcha" onclick="reloadCaptcha()" title="Reload Captcha">
            </div><br />
        <input type="text" id="captcha" name="captcha" required><br /><br />
        <button type="submit" name="submit">Commencer le Quiz</button>
    </form>
</div>
	<br /><h1>Tableau des Scores</h1>
    <table class="equipe" aria-describedby="tableDescription">
  <caption></caption>
        <tr>
            <td class="perso"><h3>Nom</h3></td>
            <td class="perso"><h3>Difficulté</h3></td>
            <td class="perso"><h3>Score</h3></td>
            <td class="perso"><h3>Commentaire</h3></td>
            <td class="perso"><h3>Temps réalisé (en secondes)</h3></td>
        </tr>';

foreach ($scores as $score) {
    $site_lang['questionnaire'] .= '
        <tr>
            <td class="perso">' . htmlspecialchars($score['participant']) . '</td>
            <td class="perso">' . htmlspecialchars($score['difficulty_Name']) . '</td>
            <td class="perso">' . htmlspecialchars($score['score']) . '</td>
            <td class="perso">' . htmlspecialchars($score['commentaire']) . '</td>
            <td class="perso">' . htmlspecialchars($score['temps']) . '</td>
        </tr>';
}

$site_lang['questionnaire'] .= '
    </table>' . $droits . '';  //<!-- Inclusion de la variable $droits -->


/////////////////////////////////////////////////////////////////////////////////////////
// Partie quiz
// Traitement du formulaire quiz
// Démarrer le chronomètre au chargement du quiz
if (!isset($_SESSION['temps'])) {
    $_SESSION['temps'] = time();
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if ($_POST['captcha'] == $_SESSION['captcha']) {
        $difficulty = intval($_POST['difficulty']);
		$query2 = "SELECT COUNT(*) AS total_questions FROM yrneh_questions WHERE difficulty <= ?";
        $participant = isset($_POST['participant']) ? $_POST['participant'] : 'Anonyme';

        $difficulty_levels = [
            1 => 'Débutant',
            2 => 'Apprenti',
            3 => 'Initié',
            4 => 'Chevronné',
            5 => 'Maître',
            6 => 'Haut-Maître'
        ];
		
        $difficulty_Name2 = $difficulty_levels[$difficulty] ?? 'Non spécifié'; // Utilise la valeur nom de la difficulté

		
        $query = "SELECT id, difficulty_Name, nbquest, question, correct_answer, option_2, option_3
                  FROM yrneh_questions
                  WHERE difficulty <= ?
                  ORDER BY difficulty ASC, nbquest ASC";
        $stmt = $conn->prepare($query);
        if (!$stmt) {
            echo "Erreur de préparation : " . $conn->error;
            exit;
        }
        $stmt->bind_param("i", $difficulty);
        $stmt->execute();
        $result = $stmt->get_result();
		
		
		$stmt2 = $conn->prepare($query2);
		if (!$stmt2) {
			echo "Erreur de préparation : " . $conn->error;
			exit;
		}
		$stmt2->bind_param("i", $difficulty);
		if (!$stmt2->execute()) {
			echo "Erreur lors de l'exécution de la requête : " . $stmt2->error;
			exit;
		}
		
		$result2 = $stmt2->get_result();
		$row2 = $result2->fetch_assoc();
		$total_questions = $row2['total_questions']; // Récupère le nombre total de questions
		
		//echo "Nombre total de questions pour la difficulté <= $difficulty: $total_questions";

        if ($result->num_rows > 0) {
			$site_lang['quiz'] = '<form action="score.php" method="POST" target="MsgWindow" onsubmit="return openResultWindow();">
            <input type="hidden" name="participant" value="' . htmlspecialchars($participant) . '">
            <input type="hidden" name="temps" value="' . $_SESSION['temps'] . '">
			<h1>Quiz</h1>
			<h2>Le niveau choisi est: '. $difficulty_Name2 . '. Il y a '. $total_questions .' questions</h2>
            <table class="equipe">
            <tr><td class="races"><h3>Difficulté</h3></td><td class="races"><h3>Numéro</h3></td><td class="races"><h3>Question</h3></td><td class="races" colspan="3"><h3>Réponses</h3></td></tr>';
            $questionNumber = 0;
            while ($row = $result->fetch_assoc()) {
				$difficulty_Name = $row['difficulty_Name'];  // Utilisez directement la valeur de la base de données
                $questionNumber++;
				$site_lang['quiz'] .= '
               <tr>
               <td class="races"><h5>' . $difficulty_Name . '</h5></td>
                <td class="races"><h5>' . $questionNumber . '</h5></td>
                <td class="races"><h5>' . htmlspecialchars($row['question']) . '</h5></td>
                <td class="races"><h4>
                <label><input type="radio" name="answer[' . $row['id'] . ']" value="correct"> ' . htmlspecialchars($row['correct_answer']) . '</label></h4></td>
				<td class="races"><h4>
                <label><input type="radio" name="answer[' . $row['id'] . ']" value="incorrect"> ' . htmlspecialchars($row['option_2']) . '</label></h4></td>
				<td class="races"><h4>
                <label><input type="radio" name="answer[' . $row['id'] . ']" value="incorrect"> ' . htmlspecialchars($row['option_3']) . '</label></h4></td>
                </td>
                </tr>';
            }
			$site_lang['quiz'] .= '
            </table>
            <br /><div align=center><button type="submit">Soumettre le Quiz</button></div><br />
            </form>'
			. $droits;
        } else {
            echo "<div>Aucune question trouvée pour cette difficulté.</div> $droits";
        }
        $stmt->close();
    } else {
        echo '<script>alert("Captcha incorrect !");</script>';
    }
}
// Fermer la connexion à la base de données
$conn->close();  // Assurez-vous que cette ligne se termine par un point-virgule
?>