5549 sujets

Sémantique web et HTML

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.
upload/1716304476-5000-about-blank.png upload/1716304528-5000-success-mail.png upload/1716304546-5000-answer.png

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.
Modifié par Baldric (21 May 2024 - 17:17)
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
}
?>
captcha.php


<?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('roussel.arnaud@free.fr', '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
?>
Salut,

perso :
- j'ai pas compris le problème Smiley sweatdrop ,
- beaucoup de code ça ne motive pas tellement à fouiner
- c'est du code serveur donc c'est nettement plus chiant pour faire des petits tests (comparé à juste un peu de html / css / javascript par exemple)

Tu as un lien vers ton site et une série de clique à faire pour qu'on puisse essayer de le reproduire ? Cela sera peut être plus compréhensible.
@Mathieuu effectivement ça fait beaucoup de code PHP voici le lien vers le site et les problèmes rencontrés sur
https://www.last-chronicle.com/frame.php?go=17
https://www.last-chronicle.com/frame.php?go=18
https://www.last-chronicle.com/frame.php?go=19
-----------------------------------------
https://www.last-chronicle.com/ (page d'accueil)
-----------------------------------------
https://www.last-chronicle.com/frame.php?Language=FR (page d'introduction)

https://www.last-chronicle.com/frame.php?go=17 (formulaire de choix de quiz avec captcha: une fois le choix de la difficulté, le nom de l'utilisateur et le captcha complété la validation n'amène nulle part

https://www.last-chronicle.com/frame.php?go=18 (formulaire pour poster un commentaire avec captcha: ouvre un popup "Please answer question number 1" jusqu'à number 6 alors que ce popup n'est censé apparaître que dans le quiz si la personne ne répond pas aux questions et une fois appuyé sur OK les 6 fois, il ne se passe rien

https://www.last-chronicle.com/frame.php?go=19 (formulaire d'envoi d'un mail avec captcha) ouvre une fenêtre "blank" avec rien de dedans et si on ferme la fenêtre on a alors un popup "message envoyé". ==> la page blank ne devrait pas exister)
Quand je vais sur ton site, une fois sur Language=FR , déjà il semble y avoir des fichiers manquants en css et javascript Smiley sweatdrop :
https://www.last-chronicle.com/css/jquery.ui.css
https://www.last-chronicle.com/css/default.css
https://www.last-chronicle.com/extras/all.js

Et ils m'ont l'air d'etre utilisé dans d'autres fichiers js (qui sont présent), donc je dirais premier truc à corriger ..

Ensuite pour la page go=17, si je rempli et que je valide, je suis redirigé vers go=21 qui en cascade me redirige vers Language=FR (peu importe que je remplisse correctement le captcha ou pas d'ailleurs)
Bonjour,

https://www.last-chronicle.com/css/jquery.ui.css
https://www.last-chronicle.com/css/default.css
https://www.last-chronicle.com/extras/all.js

étaient des reliquats d'une autre époque - ils n'ont au final aucune utilité. ce point là est corrigé.

la page go=17 c'est bien ça, le captcha n'est pas pris en compte quand il est bon, mais est pris en compte quand il est erroné. si le captcha est bon ==> go=21 si captcha erroné ==> Language=FR

la page go=18: on donne son identité, on poste le commentaire on valide avec le captcha et on reboucle sur go=18 où on peut normalement voir son commentaire. si le captcha est erroné alors on va sur Language=FR et idéalement on ne devrait boucler sur go=18 mais au moment de valider le captcha est bon mais le site ouvre un popup où il me demande de répondre aux questions de 1 à 6, une fois les 6 itérations accepter avec OK on a pas de message posté.

la page go=19, permet d'envoyer un simple mail avec son identité à l'auteur du site/roman. on a une page en popup qui s'ouvre et qui est vide et si on la ferme le popup attendu dit que le mail a bien été envoyé. là c'est le popup nommé "blank" qui ne devrait pas exister
Pour jquery cela ne m'a toujours pas l'air bon, si je vais sur go=17 j'obtiens ce message d'erreur :
turn.min.js:68 Uncaught ReferenceError: jQuery is not defined
at turn.min.js:68:451

Pour go=17 dans les 2 cas cela me dirige vers 21 puis vers language=FR , cela m'indique juste que le captcha est faux si je le rempli mal.

Pour go=18 je confirme que j'ai bien plein de popup qui m'indique "Please answer question number" 1 2 3 4 5 6 .
En cherchant c'est dans le fichier frame.php (ligne 15 à 30 de la page généré) :

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;
}

Je suppose que ce code ne devrais pas être présent dans ce cas la.
Si on le laisse à chaque fois, une solution serait sans doute de faire un sélecteur moins générique que juste 'tr' pour ciblé un élément présent juste sur la page voulue.
Pour go=19 le code html de ton formulaire c'est :
<form id="mailForm" name="mailForm" method="post" action="/frame.php?go=19" onsubmit="return openResultWindow(this);">


"onsubmit" => tu appelles la fonction openResultWindow
Si on regarde le code de cette fonction on trouve :

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;

Et window.open bah ça ouvre une nouvelle fenêtre d'où la pop up
Bonjour @Mathieuu

La fonction function openResultWindow() {} n'était pas le souci. ce qui posait problème s'était l'indentation dans mon code et les fermetures d'accolades un peu farfelues.
J'ai réussi à solution mon problème mais un autre se pose. En effet tout fonctionne sauf quand le captcha est mauvais.
Pour le message et le commentaire pas de souci si le captcha est pas bon j'ai l'ouverture d'un popup qui me dit que le captcha n'est pas bon et je reviens vers la page initiale.
Pour le quiz qui fonctionne maintenant si le captcha n'est pas bon, au lieu d'ouvrir le popup et de reboucler vers la page initiale, il va vers la page destinataire me mets un message d'erreur si je quitte cette nouvelle page, alors le popup pour dire que le captcha est erroné s'ouvre après. Je ferai des captures d'écrans et j'isolerai la partie du code incriminé. Pour le moment je vais au cinéma.
J'ai quasiment résolu mes soucis de fonctionnement, mais il me reste un point de détail
Sur les 3 pages que j'ai cité mail, commentaires et quiz, seule la page choix du quiz ne fonctionne pas comme prévu lorsque le captcha est erroné

(mail)https://www.last-chronicle.com/frame.php?go=18 =>captcha faux=>popup "le captcha est erroné"=>boucle vers https://www.last-chronicle.com/frame.php?go=18
(commentaire)https://www.last-chronicle.com/frame.php?go=19 =>captcha faux=>popup "le captcha est erroné"=>boucle vers https://www.last-chronicle.com/frame.php?go=19
(choix du quiz)https://www.last-chronicle.com/frame.php?go=17 => captcha => pas de popup => boucle vers https://www.last-chronicle.com/frame.php?go=17

je suppute une sortie de la boucle trop "tôt"

//Test du captcha
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('roussel.arnaud@free.fr', '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.";
                }
				else {
                    error_log("Erreur d'exécution : " . $stmt->error);
                    $_SESSION['message'] = "Erreur lors de l'ajout du commentaire.";
                }
                $stmt->close();
            }
        }
		
		//Traitement pour le questions du quiz
		if (isset($_POST['difficulty']) && isset($_POST['participant'])) {
			$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
			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'] . '">
				<input type="hidden" name="difficulty_Name2" value="' . htmlspecialchars($difficulty_Name2) . '">
				<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 {
				$_SESSION['message'] = "Aucune question trouvée pour cette difficulté.";
				$stmt->close();
			}
		}
	} 
	else {
		$_SESSION['message'] = "Captcha incorrect.";
	}


mais https://www.last-chronicle.com/frame.php?go=17 ne va pas jusqu'à
else {
		$_SESSION['message'] = "Captcha incorrect.";
	}

il se rend dans la page squelette du site: 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',
    '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])) {
	//header('Location:  http://www.last-chronicle.com');  // Redirection vers l'URL spécifiée
    //exit(); // S'assurer que le script s'arrête après la redirection
    //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" />
    <script src="lib/hash.js"></script>
    <script src="lib/turn.min.js"></script>
    <script src="lib/zoom.min.js"></script>
	<script src="lib/location.js"></script>
	<script src="lib/validateForm.js"></script>
	<script src="lib/openResultWindow.js"></script>
	<script src="lib/closeWindow.js"></script>
	<script src="lib/reloadCaptcha.js"></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 {
				header("Location: " . $_SERVER['HTTP_REFERER']);
            }
            ?>
		</div>
		
        <div class="footer"></div>
    </div>
</body>
</html>

l'exécution du code va directement à
<?php 
            // Afficher le contenu si la clé existe dans $site_lang
            if (isset($site_lang[$contentKey])) {
                echo $site_lang[$contentKey]; 
            } else {
				header("Location: " . $_SERVER['HTTP_REFERER']);
            }
            ?>
		</div>

où j'ai mis
header("Location: " . $_SERVER['HTTP_REFERER']);
pour le faire reboucle sur lui même sinon il m'envoyait vers https://www.last-chronicle.com/frame.php?go=21 (qui correspond à la page du quiz) avec un message d'erreur me disant que $contentKey avant que je remplace
// Débogage : Vérification de l'existence de la clé $contentKey
if (!isset($site_lang[$contentKey])) {
	header('Location:  http://www.last-chronicle.com');  // Redirection vers l'URL spécifiée
    exit(); // S'assurer que le script s'arrête après la redirection
    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.');
//}
par
            <?php 
            // Afficher le contenu si la clé existe dans $site_lang
            if (isset($site_lang[$contentKey])) {
                echo $site_lang[$contentKey]; 
            } else {
				header("Location: " . $_SERVER['HTTP_REFERER']);
            }
            ?>

ça beaucoup de code mais je sais pas comment représenter sinon... Je viens de faire 2 vidéos pour expliquer
Modifié par Baldric (03 Jun 2024 - 16:29)
Mathieuu a écrit :
Pour jquery cela ne m'a toujours pas l'air bon, si je vais sur go=17 j'obtiens ce message d'erreur :
turn.min.js:68 Uncaught ReferenceError: jQuery is not defined
at turn.min.js:68:451

Pour go=17 dans les 2 cas cela me dirige vers 21 puis vers language=FR , cela m'indique juste que le captcha est faux si je le rempli mal.

Pour go=18 je confirme que j'ai bien plein de popup qui m'indique "Please answer question number" 1 2 3 4 5 6 .
En cherchant c'est dans le fichier frame.php (ligne 15 à 30 de la page généré) :

function validateForm() {
    var allAnswered = true;
    document.querySelectorAll('tr').forEach((row, index) =&gt; {
        if (index &gt; 0) { // Skip header row
            var inputs = row.querySelectorAll('input[type="radio"]');
            var answered = Array.from(inputs).some(input =&gt; input.checked);
            if (!answered) {
                alert('Please answer question number ' + index);
                allAnswered = false;
                return false;
            }
        }
    });
    return allAnswered;
}

Je suppose que ce code ne devrais pas être présent dans ce cas la.
Si on le laisse à chaque fois, une solution serait sans doute de faire un sélecteur moins générique que juste 'tr' pour ciblé un élément présent juste sur la page voulue.


Merci Mathieuu d'avoir testé, monsieur c'est compliqué votre truc, svp moins de code et plus ciblé !!!