Bouton Valider.

Résolu/Fermé
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024 - Modifié le 18 mars 2018 à 15:50
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 23 mars 2018 à 15:40
Bonjour,

Quelqu'un pourrait il me donner des explications sur cette ligne écrite pour javascrypt?
document.getElementById('bout_1').innerHTML = '<a href="javascript:suiv();">Valider</a>';

Plus exactement le bouton ayant pour valeur Valider agit comment et sur quoi?
Merci d'avance.

11 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
19 mars 2018 à 10:49
Bonjour,

Ce code indique au « bouton » qu'il est un lien vers une fonction JavaScript nommée suiv().
Cette fonction doit être définie quelque part dans ta page, soit directement soit au sein d'un fichier JavaScript inclus. C'est elle qui dira ce que fait exactement le bouton.

Xavier
1
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
Modifié le 19 mars 2018 à 13:40
Merci pour votre réponse.
J'ai trouvé la fonction sui() que voici:
function suiv()
{
 q ++;
 document.getElementById('bout_1').innerHTML = 'Valider'; // On masque le bouton jusqu'à reception des données.
 envoie_req('rep='+rep);
}

C'est ainsi que je voudrai savoir si il serait possible d'insérer dans une base de donnéeS MySQL des résultats lorsqu'on clique sur le bouton valider à partir de cette fonction?
Sinon quel pourrait être la solution sans utiliser cette fonction? (En php par exemple).
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
19 mars 2018 à 13:33
Tout dépend de ce que fait la fonction envoie_req :)
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
19 mars 2018 à 13:57
Voici ce que fait cette fonction:
function envoie_req(req)
{
// création du XMLHttpRequest et envoie d'une requête.
if (window.XMLHttpRequest)
{
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) http_request.overrideMimeType('text/xml');
}
else if (window.ActiveXObject)
{
try { http_request = new ActiveXObject("Msxml2.XMLHTTP") }
catch (e)
{
try { http_request = new ActiveXObject("Microsoft.XMLHTTP") }
catch (e) {}
}
}
if (!http_request) alert('Erreur : Impossible d'initialiser XMLHttpRequest.');

http_request.onreadystatechange = reception;
http_request.open('POST', 'edit_ajax.php', true);
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

http_request.send(req);
}
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
19 mars 2018 à 15:56
Vu ce code, dès que le bouton Valider est cliqué, une requête est envoyée à edit_ajax.php.
C'est dans ce fichier PHP que tu pourras inscrire tes données dans la base.

Xavier
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
19 mars 2018 à 15:36
En fait il me faudrait une condition, par exemple en Javascrypt, qui puisse me permettre d' inscrire en base de données des résultats dès lors que le bouton Validé est cliqué.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
19 mars 2018 à 16:36
Voici le fichier edit_ajax.php:
<?php
session_start ();
/* Cette page gère les requêtes envoyées avec Ajax depuis la page d'édition de QCM. */
session_start ();
require_once 'admin_verif.php';
require_once 'fonctions.php';

// cette page n'est accessible que si une session admin est ouverte.
if ($admin == 0) exit(0);


/* Données reçues, à enregistrer dans le fichier qcm.xml.
Les données sont envoyées en POST et qe ou qs est le numéro de la question.
Si qe et envoyé, on modifie ou on ajoute une question au qcm, alors que si qs est envoyé, on supprime cette question. */
if (isset($_POST['qe']))
{

	// on récupère les données envoyées.
	$nbq = (int)$_POST['qe'];
	$question = $_POST['question'];
	$image = $_POST['image'];
	$explic = $_POST['explic'];
	$nb_rep = $_POST['nbrep'];
	$bonne_rep = $_POST['bonne_rep'];

	// Si il n'y a pas d'image, elle a pu être enlevée, il faut donc dédruire l'éventuel fichier envoyé avant que l'utilisateur décoche la case image.
	if ($image == '') det_img($_SESSION['qcm'], $nbq);

	$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

	if (!isset($fichier_xml->question[$nbq]))
	{
		// La question n'existe pas encore, on l'ajoute au qcm.
		$fichier_xml->addChild('question');
		$fichier_xml->question[$nbq]->addChild('q');
		$fichier_xml->question[$nbq]->addChild('image');
		$fichier_xml->question[$nbq]->addChild('explic');
		$fichier_xml->question[$nbq]->addChild('reponses');
	}

	// On remplie la question avec les données envoyées. La fonction encode permet de supprimer les caractères spéciaux des chaînes
	// de caractères (< > " & ...), afin qu'elles puissent être enregistrées dans le fichier xml.
	$qxml = $fichier_xml->question[$nbq];
	$qxml->q = encode($question);
	$qxml->image = $image;
	$qxml->explic = encode($explic);

	// Le nombre des réponses pouvant varier, on supprime toutes les réponses puis on les re-enregistre toutes de nouveau.
	unset($qxml->reponses);
	$qxml->addChild('reponses');
	for ($i = 0; $i < $nb_rep; $i ++)
	{
		$qxml->reponses->addChild('rep');
		$qxml->reponses->rep[$i] = encode($_POST['rep'.$i]);
		if ($i == $bonne_rep) $qxml->reponses->rep[$i]->addAttribute('bonne', '1');
		else $qxml->reponses->rep[$i]->addAttribute('bonne', '0');
	}

	// Enregistrement du qcm modifié dans le fichier qcm.xml.
	$f = fopen('qcm/'.$_SESSION['qcm'].'/qcm.xml', 'w');
	fwrite($f, $fichier_xml->asXML());
	fclose($f);
}
elseif (isset($_POST['qs']))
{
	// On supprime simplement la qs ème question du qcm.
	$nbq = (int)$_POST['qs'];
	$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

	unset($fichier_xml->question[$nbq]);

	$f = fopen('qcm/'.$_SESSION['qcm'].'/qcm.xml', 'w');
	fwrite($f, $fichier_xml->asXML());
	fclose($f);

	// Si une image était attachée à la question, on la supprime également.
	det_img($_SESSION['qcm'], (int)$_POST['qs']);
}

/* Données envoyées.
Après avoir reçu et sauvegarder les données d'une question, cette page peut envoyer les données d'une question au script côté client.
Ainsi, en un appel à cette page, le script côté client peut sauvegarder une question, et afficher les données de la question suivante.
Le numéro de la question dont il faut envoyer les données est contenu dans la variable q.
Les données seront envoyer sous la forme d'un fichier xml. Si le client ne demande pas de données ($_POST['q'] n'existe pas),
on renvoie un fichier xml vide. */
if (isset($_POST['q']))
{
	$nbq = '0';
	$q = '';
	$image = '';
	$explic = '';
	$reponses = '';

	// on recherche les données correspondant à la question voulue.
	$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

	// On envoie également à chaque fois le nombre de questions dans le QCM.
	// Cela permet au client d'afficher "Question XX/XX".
	$nbq = count($fichier_xml->question);
	if (isset($fichier_xml->question[(int)$_POST['q']]))
	{
		$qxml = $fichier_xml->question[(int)$_POST['q']];
		if (isset($qxml->q)) $q = encode((string)$qxml->q);
		if (isset($qxml->image)) $image = (string)$qxml->image;
		if (isset($qxml->explic)) $explic = encode((string)$qxml->explic);
		foreach ($qxml->reponses->rep as $rep) $reponses .= '<rep bonne="'.(string)$rep['bonne'].'">'.encode((string)$rep).'</rep>';
	}

	// Envoie du fichier XML.
	header("Content-Type: text/xml");
	$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
	$xml .= '<reponse nbq="'.$nbq.'"><q>'.$q.'</q><image>'.$image.'</image><explic>'.$explic.'</explic><reponses>'.$reponses.'</reponses></reponse>';
	echo $xml;
}
else
{
	header("Content-Type: text/xml");
	echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".'<reponse></reponse>';
}

?>

Ainsi donc à ton avis, sur quelle ligne puis je inscrire le script me permettant d'insérer en base de données les résultats attendus?
Merci.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
19 mars 2018 à 17:06
Là, tout est enregistré sous forme XML.
On lit un XML, on remplit un objet XML, on le modifie, on le sauve.
Ce que tu veux faire, c'est remplacer le XML par du tout SQL ?
Dans ce cas, ce sont toutes ces opérations qu'il faut remplacer.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
19 mars 2018 à 17:14
Non, je ne tiens pas du tout à remplacer les fichiers car ça fonctionne bien comme ça.
Simplement ajouter dans une base des points obtenus par un joueur X quand il répond à une question au moment où il clique sur le bouton "valider".
Il me faudra du temps pour trouver sur quelle ligne inscrire le scrypt que je sais maîtriser pour l'insertion en base.
Si tu m'indiques la ligne, je mettrai ma programmation à partir de cette ligne, puis je ferai les essais afin de te confirmer ou infirmer le bon fonctionnement.
Merci.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
20 mars 2018 à 13:41
Je n'ai pas l'impression qu'on soit au bon endroit pour ça, il me semble qu'il n'y a pas là de réponse envoyée par le joueur. Seulement la lecture/écriture du questionnaire.
Tu es sûr que tu es parti du bon bouton « valider » ?
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
20 mars 2018 à 15:15
Voici deux autres fichiers dont l'un s'appelle voir_ajax.php ci dessous:
<?php
session_start();
/* Cette page gère les requêtes envoyées avec Ajax depuis la page de visualisation de QCM.
Variables :
$_SESSION['qcm'] => Identifiant du QCM.
$_SESSION['rep'] => Réponses de l'utilisateur.
$_SESSION['q'] => Numéro de la question actuelle.
$_SESSION['nb_q'] => Nombre de questions dans le QCM (pour ne pas avoir à la lire tout le temps dans le fichier XML).
$_SESSION['fini'] => Indique si le QCM est fini. On montre alors la correction.
*/
require_once 'fonctions.php';


$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

if ($_SESSION['fini'] != 1)
{
	// Le QCM n'est pas encore terminé et se poursuit normalement.

	// Si $_SESSION['q'] == -1, l'utilisateur n'a pas encore répondu a une question
	// Si $_SESSION['q'] >= 0, l'utilisateur a répondu à la question $_SESSION['q'] et on doit sauvegarder sa réponse.
	if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];

	// On peut alors passer à la question suivante, si le QCM n'est pas terminé.
	if ($_SESSION['q'] < $_SESSION['nb_q'] - 1)
	{
		$_SESSION['q'] ++;
		// On envoie la nouvelle question.
		$qxml = $fichier_xml->question[$_SESSION['q']];
		$qxml->explic = multi_lignes((string)$qxml->explic);
		foreach ($qxml->reponses->rep as $rep) unset($rep['bonne']); // L'utilisateur ne doit pas pouvoir connître la bonne réponse.
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
	}
	else
	{
		// Le QCM est terminé, il faut envoyer les résultats.
		$bonnes_reponses = 0;
		$i = 0;
		foreach ($fichier_xml->question as $qxml)
		{
			if (isset($qxml->reponses->rep[$_SESSION['rep'][$i]]) && (int)$qxml->reponses->rep[$_SESSION['rep'][$i]]['bonne'] == 1)
				$bonnes_reponses ++;
			$i ++;			
		}
		//$_SESSION['nb_rep']=$i;
		$_SESSION['test'] = $bonnes_reponses;//conduit sur le fichier test.php pour connaître les bonnes réponses.
		$_SESSION['fini'] = 1;
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".'<bonnesreponses>'.$bonnes_reponses.'</bonnesreponses>';
		$_SESSION['rep_bon']=$bonnes_reponses;
		$_SESSION['nb_q']=$i;
		
	}
}
else
{
	// Le QCM est fini, on affiche le corrigé. Le numéro de la question à afficher est envoyé dans la variable $_POST['q'].
	// La numérotation commence à 1 pour le client, et à 0 côté serveur.
	$q = 0;
	if (isset($_POST['q'])) $q = (int)$_POST['q'] - 1;
	if (!isset($fichier_xml->question[$q])) exit(0); // Erreur : la question n'existe pas.
	$qxml = $fichier_xml->question[$q];
	$qxml->explic = multi_lignes((string)$qxml->explic);
	$i = 0;
	foreach ($qxml->reponses->rep as $rep)
	{
		if ((int)$rep['bonne'] == 1) $rep->addAttribute('coul', 'vert');
		elseif ($_SESSION['rep'][$q] == $i) $rep->addAttribute('coul', 'rouge');
		else $rep->addAttribute('coul', 'blanc');
		unset($rep['bonne']);
		$i ++;
	}
	header("Content-Type: text/xml");
	echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
}

?>


Et le deuxième voir_qcm_script.js
/* Script utilisant Ajax */

// Variables globales.
var qcm = ''; // Dossier du QCM.
var nb_q = 0; // nombre de questions dans le QCM.
var q = 1; // numéro de la question actuelle.
var rep = 0; // numéro de la réponse actuelle.
var fini = 0; // indique si le QCM est terminé (affichage du corrigé.

function reception()
{
	if (http_request.readyState == 4 && http_request.status == 200)
	{
		var fichierxml = http_request.responseXML;

		if (fini == 1) // Affichage du corrigé.
		{
			var question, image, explic, reponses;
			var xml = fichierxml.getElementsByTagName('question').item(0);
			if (xml.childNodes[0].firstChild) question = xml.childNodes[0].firstChild.data;
			else question = '';
			if (xml.childNodes[1].firstChild) image = xml.childNodes[1].firstChild.data;
			else image = '';
			if (xml.childNodes[2].firstChild) explic = xml.childNodes[2].firstChild.data;
			else explic = '';
			reponses = new Array;
			for (i = 0; i < xml.childNodes[3].childNodes.length; i++)
			{
				reponses[i] = new Array;
				if (xml.childNodes[3].childNodes[i].firstChild)
					reponses[i][0] = xml.childNodes[3].childNodes[i].firstChild.data;
				else
					reponses[i][0] = '';
				reponses[i][1] = xml.childNodes[3].childNodes[i].getAttribute('coul');
			}

			// remplissage de la page avec les données lues.
			document.getElementById('c_titre').innerHTML = ':. Correction : Question '+q+'/'+nb_q+' .:';
			var html = '<div id="voir_question">'+question+'</div>';
			if (image != '') html += '<div id="voir_image"><img alt="" src="qcm/'+qcm+'/'+image+'" /></div>';
			if (explic != '') html += '<div id="voir_explic">'+explic+'</div>';
			html += '<div id="voir_reponses">';
			rep = 0;
			for (i = 0; i < reponses.length; i++)
			{
				html += '> <a class="'+reponses[i][1]+'">'+reponses[i][0]+'</a><br />';
			}
			html += '</div>';
			document.getElementById('c_cadre').innerHTML = html;
			if (q > 1) document.getElementById('bout_0').innerHTML = '<a href="javascript:c_prec();">Question précédante</a>';
			else  document.getElementById('bout_0').innerHTML = 'Question précédante';
			if (q < nb_q) document.getElementById('bout_1').innerHTML = '<a href="javascript:c_suiv();">Question suivante</a>';
			else  document.getElementById('bout_1').innerHTML = 'Question suivante';
			return 0;
		}


		if (fichierxml.getElementsByTagName('bonnesreponses').item(0) != null)
		{
			// Le QCM est fini, on affiche le nombre de bonnes réponses.
			var bonnes_rep = fichierxml.getElementsByTagName('bonnesreponses').item(0).firstChild.data;
			document.getElementById('c_cadre').innerHTML = '<div id="voir_result"><img src="interface/vert.gif" alt="" height="15" width="'+Math.floor(bonnes_rep*200/nb_q)+'" class="no_border_droite" /><img src="interface/rouge.gif" alt="" height="15" width="'+Math.floor((nb_q-bonnes_rep)*200/nb_q)+'" class="no_border_gauche" /><br /><br />Bonnes réponses : '+bonnes_rep+'/'+nb_q+'</div>';
			document.getElementById('c_titre').innerHTML = ':. Résultats .:';
			document.getElementById('bout_1').innerHTML = '<a href="javascript:corrige();">Voir le corrigé</a>';
			setTimeout(function() {
			window.location.href = '/jeu_printemps/ph_qcm/insertion_points.php';
			}, 2000);	
			// redirection au bout de 2 secondes.
			document.getElementById('voir_resultats').innerHTML = '<h2 style="color: Green;">La bonne réponse est montrée en verte dans le corrigé.</h2><br><h3 style="color: red;">Vous verrez automatiquement les résutats dans 2 secondes.<br>Ou cliquez ci dessous pour les consulter de suite.</h3><a href="/jeu_printemps/ph_qcm/insertion_points.php"><img src="/jeu_printemps/ph_qcm/img/retour_d.gif" alt="Aller"/></a>';
			return 0;
		}

		// On récupère les données de la question.
		var question, image, explic, reponses;
		var xml = fichierxml.getElementsByTagName('question').item(0);
		if (xml.childNodes[0].firstChild) question = xml.childNodes[0].firstChild.data;
		else question = '';
		if (xml.childNodes[1].firstChild) image = xml.childNodes[1].firstChild.data;
		else image = '';
		if (xml.childNodes[2].firstChild) explic = xml.childNodes[2].firstChild.data;
		else explic = '';
		reponses = new Array;
		for (i = 0; i < xml.childNodes[3].childNodes.length; i++)
		{
			if (xml.childNodes[3].childNodes[i].firstChild) reponses[i] = xml.childNodes[3].childNodes[i].firstChild.data;
			else reponses[i] = '';
		}

		// remplissage de la page avec les données lues.
		document.getElementById('c_titre').innerHTML = ':. Question '+q+'/'+nb_q+' .:';
		var html = '<div id="voir_question">'+question+'</div>';
		if (image != '') html += '<div id="voir_image"><img alt="" src="qcm/'+qcm+'/'+image+'" /></div>';
		if (explic != '') html += '<div id="voir_explic">'+explic+'</div>';
		html += '<div id="voir_reponses">';
		rep = 0;
		for (i = 0; i < reponses.length; i++)
		{
			html += '<input type="radio" name="rep"'+((i == rep) ? ' checked="checked"' : '')+' onclick="javascript:rep='+i+';" /> '+reponses[i]+'<br />';
		}
		html += '</div>';
		document.getElementById('c_cadre').innerHTML = html;
		document.getElementById('bout_1').innerHTML = '<a href="javascript:suiv();">Valider</a>';
	}
}

function envoie_req(req)
{
	// création du XMLHttpRequest et envoie d'une requête.
	if (window.XMLHttpRequest)
	{
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) http_request.overrideMimeType('text/xml');
	}
	else if (window.ActiveXObject)
	{
		try { http_request = new ActiveXObject("Msxml2.XMLHTTP") }
		catch (e)
		{
			try { http_request = new ActiveXObject("Microsoft.XMLHTTP") }
			catch (e) {}
		}
	}
	if (!http_request) alert('Erreur : Impossible d'initialiser XMLHttpRequest.');

	http_request.onreadystatechange = reception;
	http_request.open('POST', 'voir_ajax.php', true);
	http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

	http_request.send(req);
}

function init(nb_questions, dossier_qcm)
{
	nb_q = nb_questions;
	qcm = dossier_qcm;
	document.getElementById('bout_1').innerHTML = 'Valider'; // On masque le bouton jusqu'à reception des données.
	envoie_req(null);
}

function suiv()
{
	q ++;
	document.getElementById('bout_1').innerHTML = 'Valider'; // On masque le bouton jusqu'à reception des données.
	envoie_req('rep='+rep);
}

function corrige()
{
	q = 1;
	fini = 1;
	document.getElementById('bout_1').innerHTML = ''; // On masque le bouton jusqu'à reception des données.
	envoie_req('q='+q);
}

function c_suiv()
{
	q ++;
	document.getElementById('bout_0').innerHTML = 'Question précédante'; // On masque le bouton jusqu'à reception des données.
	document.getElementById('bout_1').innerHTML = 'Question suivante'; // On masque le bouton jusqu'à reception des données.
	envoie_req('q='+q);
}

function c_prec()
{
	q --;
	document.getElementById('bout_0').innerHTML = 'Question précédante'; // On masque le bouton jusqu'à reception des données.
	document.getElementById('bout_1').innerHTML = 'Question suivante'; // On masque le bouton jusqu'à reception des données.
	envoie_req('q='+q);
}



Peut être qu'avec ces deux autres fichiers il te sera possible de m'indiquer où est ce que je pourrai inclure mon scrypt d'insertion en base des résultats?
Merci.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
20 mars 2018 à 16:07
Ok.
Dans voir_ajax.php, il y a cette ligne :
if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];

Ce if te place dans le cas qui t'intéresse : tu as le numéro de la question ainsi que la réponse donnée. Pour le moment, tout ce que ça fait, c'est mettre cette réponse en session. C'est ici que tu peux rajouter du code pour, également, l'enregistrer en base :
if ($_SESSION['q'] >= 0 && isset($_POST['rep']))
{
    $_SESSION['rep'][] = (int)$_POST['rep'];

    // Ici, insère en base de données
}


Xavier
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
20 mars 2018 à 17:55
Ok merci.
Je vais donc pouvoir insérer les données en question en base.
Dès que cela sera fait je t'indiquerai si tout c'est bien passé.
A demain.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
21 mars 2018 à 09:39
Bonjour,
Je ne suis pas parvenu à insérer en base de données.
J'ai donc tenter d'établir une redirection à la place des scripts d'insertions en base vers un fichier nommé test.php.
Comme indiqué ci dessous en lignes 11 et 12:
if ($_SESSION['fini'] != 1)
{
	// Le QCM n'est pas encore terminé et se poursuit normalement.

	// Si $_SESSION['q'] == -1, l'utilisateur n'a pas encore répondu a une question
	// Si $_SESSION['q'] >= 0, l'utilisateur a répondu à la question $_SESSION['q'] et on doit sauvegarder sa réponse.
	//if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];	
	if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) 
	{
	$_SESSION['rep'][] = (int)$_POST['rep'];	
	header('Location: test.php'); 
	exit(0);
	}
	
	// On peut alors passer à la question suivante, si le QCM n'est pas terminé.
	if ($_SESSION['q'] < $_SESSION['nb_q'] - 1)
	{
		$_SESSION['q'] ++;
		// On envoie la nouvelle question.
		$qxml = $fichier_xml->question[$_SESSION['q']];
		$qxml->explic = multi_lignes((string)$qxml->explic);
		foreach ($qxml->reponses->rep as $rep) unset($rep['bonne']); // L'utilisateur ne doit pas pouvoir connître la bonne réponse.
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
	}
	else
	{
		// Le QCM est terminé, il faut envoyer les résultats.


Mais sans aucun résultats là aussi.
Voici ce qui apparaît:

Cette image ci dessus représente la question posée qui n'est pas accompagnée d'une image.
Jusque là c'est normal puisqu' une question peut ne pas comporter d'images.
Le bouton "Valider" est actif de par sa couleur bleue.(C'est normal.)
Ainsi en cliquant sur ce bouton "Valider" il devient gris et le reste toujours (même en cliquant plusieurs fois dessus).Au lieu de passer à la page suivante.(Pour des raisons trop longues à expliquer ici sur le déroulement du jeu.)
Et celle ci reste figée comme représentée par l'image ci dessous:

A savoir que ce jeu fonctionne mais que je souhaiterai simplement inscrire en base de données le résultat de la question dès l'appui sur le bouton valider.
Et non pas à la lecture de la page suivante.
Merci encore de bien vouloir te pencher sur ce petit problème.
Je reste bien sûr à ta disposition pour tous renseignements complémentaires afin de faire avancer le shilblick.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 mars 2018 à 09:55
Peux-tu me montrer le code que tu as utilisé pour l'enregistrement en base de données ?
La première version, sans redirection.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
22 mars 2018 à 14:03
Voici l'insertion en table en ligne 25 à 30.
Et quelque soit le script à cet endroit (insertion en base comme ici, un exit(), une redirection, ou un echo) le résultat reste le même.
C'est à dire page de la question figée après avoir cliqué su le bouton "Valider".
C'est pour moi très déconcertant car je ne peux rien modifier dans ce fichier voir_ajax.php sans que le résultat soit la page figée.
Que faire pour débuguer un tel dysfonctionnement?
C'est bien la première fois que je suis confronté à une telle situation!
Une idée?
Merci.

<?php
session_start();
/* Cette page gère les requêtes envoyées avec Ajax depuis la page de visualisation de QCM.
Variables :
$_SESSION['qcm'] => Identifiant du QCM.
$_SESSION['rep'] => Réponses de l'utilisateur.
$_SESSION['q'] => Numéro de la question actuelle.
$_SESSION['nb_q'] => Nombre de questions dans le QCM (pour ne pas avoir à la lire tout le temps dans le fichier XML).
$_SESSION['fini'] => Indique si le QCM est fini. On montre alors la correction.
*/
require_once 'fonctions.php';


$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

if ($_SESSION['fini'] != 1)
{
	// Le QCM n'est pas encore terminé et se poursuit normalement.
	// Si $_SESSION['q'] == -1, l'utilisateur n'a pas encore répondu a une question
	// Si $_SESSION['q'] >= 0, l'utilisateur a répondu à la question $_SESSION['q'] et on doit sauvegarder sa réponse.
	//if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];
	if ($_SESSION['q'] >= 0 && isset($_POST['rep']))
	{
    $_SESSION['rep'][] = (int)$_POST['rep'];
	$stmt = $connection->prepare("INSERT INTO reponses (inscription_id, dossier, rep_bon, nbr_questions, password, titre, point_total) VALUES (:inscription_id, :qcm, 0, :nb_q, 'jeu', :titre, 0)");
    $stmt->bindParam(':inscription_id', $_SESSION['id_inscription'], PDO::PARAM_STR);
    $stmt->bindParam(':qcm', $_SESSION['qcm'], PDO::PARAM_STR);
    $stmt->bindParam(':nb_q', $_SESSION['nb_q'], PDO::PARAM_INT);
    $stmt->bindParam(':titre', $_SESSION['titre'], PDO::PARAM_STR);
    $stmt->execute();
	}
	
	// On peut alors passer à la question suivante, si le QCM n'est pas terminé.
	if ($_SESSION['q'] < $_SESSION['nb_q'] - 1)
	{
		$_SESSION['q'] ++;
		// On envoie la nouvelle question.
		$qxml = $fichier_xml->question[$_SESSION['q']];
		$qxml->explic = multi_lignes((string)$qxml->explic);
		foreach ($qxml->reponses->rep as $rep) unset($rep['bonne']); // L'utilisateur ne doit pas pouvoir connître la bonne réponse.
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
	}
	else
	{
		// Le QCM est terminé, il faut envoyer les résultats.
			
		$bonnes_reponses = 0;
		$i = 0;
		foreach ($fichier_xml->question as $qxml)
		{
			if (isset($qxml->reponses->rep[$_SESSION['rep'][$i]]) && (int)$qxml->reponses->rep[$_SESSION['rep'][$i]]['bonne'] == 1)
				$bonnes_reponses ++;
			$i ++;		
		}
		//$_SESSION['nb_rep']=$i;
		$_SESSION['test'] = $bonnes_reponses;//conduit sur le fichier test.php pour connaître les bonnes réponses.
		$_SESSION['fini'] = 1;
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".'<bonnesreponses>'.$bonnes_reponses.'</bonnesreponses>';
		$_SESSION['rep_bon']=$bonnes_reponses;
		$_SESSION['nb_q']=$i;
		
	}
}
else
{
	// Le QCM est fini, on affiche le corrigé. Le numéro de la question à afficher est envoyé dans la variable $_POST['q'].
	// La numérotation commence à 1 pour le client, et à 0 côté serveur.
	$q = 0;
	if (isset($_POST['q'])) $q = (int)$_POST['q'] - 1;
	if (!isset($fichier_xml->question[$q])) exit(0); // Erreur : la question n'existe pas.
	$qxml = $fichier_xml->question[$q];
	$qxml->explic = multi_lignes((string)$qxml->explic);
	$i = 0;
	foreach ($qxml->reponses->rep as $rep)
	{
		if ((int)$rep['bonne'] == 1) $rep->addAttribute('coul', 'vert');
		elseif ($_SESSION['rep'][$q] == $i) $rep->addAttribute('coul', 'rouge');
		else $rep->addAttribute('coul', 'blanc');
		unset($rep['bonne']);
		$i ++;
	}
	header("Content-Type: text/xml");
	echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
}
?>
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 23 mars 2018 à 10:13
« Et quelque soit le script à cet endroit (insertion en base comme ici, un exit(), une redirection, ou un echo) le résultat reste le même.
C'est à dire page de la question figée après avoir cliqué su le bouton "Valider". »

En fait la partie qui gère la suite du questionnaire est dans le « if » suivant. Donc si le script génère une erreur, ou empêche l'exécution de la suite, ton questionnaire sera bloqué.
Tes quatre tentatives peuvent rentrer dans ce cas :
-> Insertion en base : je suppose qu'il y a une erreur dans ta requête ou ta connexion.
-> echo : cela déclenche le début de la réponse au client, ce qui empêche la redirection subséquente (car les en-têtes auront déjà été envoyées)
-> exit() : cela sort du script... Donc la suite n'est pas exécutée.
-> redirection : pareil qu'exit, ça empêche l'exécution de la suite.

Ton problème vient donc d'une erreur dans l'insertion, et il faut essayer de voir quelle est cette erreur.
Il y a deux étapes :
1 - Activer la récupération des erreurs. Regarde ça : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
2 - Trouver le moyen de l'afficher. Comme cette page est appelée par une requête Ajax, ce n'est pas immédiat.
Une solution serait de faire ça dans ta fonction JavaScript nommée « reception », c'est elle qui gère la récupération des données Ajax. Tu peux me la montrer ?

Xavier
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
23 mars 2018 à 12:58
Les erreurs sont bien activées le cas échéant par le fichier php.ini.
Néanmoins j'ai inscrit en lignes 13 à 15 les scripts pour les afficher aussi.
Tu trouveras en ligne 27 à 43 une insertion en base établie différemment par rapport mon précédent message pour indiquer les erreurs de requêtes éventuelles.

Cependant rien n'y fait.
C'est toujours le résultat de la page figée comme dans mon message du 21 mars dernier.

Je ne comprends pas pour quelle raison une redirection comme ceci:
{
	// Le QCM n'est pas encore terminé et se poursuit normalement.
	// Si $_SESSION['q'] == -1, l'utilisateur n'a pas encore répondu a une question
	// Si $_SESSION['q'] >= 0, l'utilisateur a répondu à la question $_SESSION['q'] et on doit sauvegarder sa réponse.
	//if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];
	if ($_SESSION['q'] >= 0 && isset($_POST['rep']))
	{
		$_SESSION['rep'][] = (int)$_POST['rep'];
		header('Location: test.php'); //Appel de la page test.php
        exit(0);
	}
	// On peut alors passer à la question suivante, si le QCM n'est pas terminé.

Suivie de surcroit par exit(); ne permets pas de sortir de cette page.
Même si ce n'est pas le but de cette programmation, cela est un indice difficilement compréhensible pour moi.
Le header serait il en cause ou mal placé?
J'avoue ne pas avoir bien saisi ton explication que voici:
"-> redirection : pareil qu'exit, ça empêche l'exécution de la suite. "
Puisque pour le débugage uniquement il n'est pas important d'exécuter la suite.Mais simplement voir ce qu'il se passe à ce moment précis sur une page test.php

<?php
session_start();
/* Cette page gère les requêtes envoyées avec Ajax depuis la page de visualisation de QCM.
Variables :
$_SESSION['qcm'] => Identifiant du QCM.
$_SESSION['rep'] => Réponses de l'utilisateur.
$_SESSION['q'] => Numéro de la question actuelle.
$_SESSION['nb_q'] => Nombre de questions dans le QCM (pour ne pas avoir à la lire tout le temps dans le fichier XML).
$_SESSION['fini'] => Indique si le QCM est fini. On montre alors la correction.
*/
require_once 'fonctions.php';

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

$fichier_xml = simplexml_load_file('qcm/'.$_SESSION['qcm'].'/qcm.xml');

if ($_SESSION['fini'] != 1)
{
	// Le QCM n'est pas encore terminé et se poursuit normalement.
	// Si $_SESSION['q'] == -1, l'utilisateur n'a pas encore répondu a une question
	// Si $_SESSION['q'] >= 0, l'utilisateur a répondu à la question $_SESSION['q'] et on doit sauvegarder sa réponse.
	//if ($_SESSION['q'] >= 0 && isset($_POST['rep'])) $_SESSION['rep'][] = (int)$_POST['rep'];
	if ($_SESSION['q'] >= 0 && isset($_POST['rep']))
	{
	$_SESSION['rep'][] = (int)$_POST['rep'];
	//préparation de la requête et des variables
		$sql = "INSERT INTO reponses (inscription_id, dossier, rep_bon, nbr_questions, password, titre, point_total)   VALUES (:inscription_id, :qcm, 0, :nb_q, 'jeu', :titre, 0)";
		$datas = array (':inscription_id'=>$_SESSION['id_inscription'],
						':qcm'=>$_SESSION['qcm'],
						':nb_q'=>$_SESSION['nb_q'],
						':titre'=>$_SESSION['titre']);
	//Execution de la requete
		try{
		  $requete = $connection -> prepare($sql) ;
		  $requete->execute($datas) ;
		}catch(Exception $e){
		  // en cas d'erreur :
		   echo " Erreur ! ".$e->getMessage();
		   echo " Les datas : " ;
		  print_r($datas);
		}
	}
	// On peut alors passer à la question suivante, si le QCM n'est pas terminé.
	if ($_SESSION['q'] < $_SESSION['nb_q'] - 1)
	{
		$_SESSION['q'] ++;
		// On envoie la nouvelle question.
		$qxml = $fichier_xml->question[$_SESSION['q']];
		$qxml->explic = multi_lignes((string)$qxml->explic);
		foreach ($qxml->reponses->rep as $rep) unset($rep['bonne']); // L'utilisateur ne doit pas pouvoir connître la bonne réponse.
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
	}
	else
	{
		// Le QCM est terminé, il faut envoyer les résultats.
			
		$bonnes_reponses = 0;
		$i = 0;
		foreach ($fichier_xml->question as $qxml)
		{
			if (isset($qxml->reponses->rep[$_SESSION['rep'][$i]]) && (int)$qxml->reponses->rep[$_SESSION['rep'][$i]]['bonne'] == 1)
				$bonnes_reponses ++;
			$i ++;		
		}
		//$_SESSION['nb_rep']=$i;
		$_SESSION['test'] = $bonnes_reponses;//conduit sur le fichier test.php pour connaître les bonnes réponses.
		$_SESSION['fini'] = 1;
		header("Content-Type: text/xml");
		echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".'<bonnesreponses>'.$bonnes_reponses.'</bonnesreponses>';
		$_SESSION['rep_bon']=$bonnes_reponses;
		$_SESSION['nb_q']=$i;
		
	}
}
else
{
	// Le QCM est fini, on affiche le corrigé. Le numéro de la question à afficher est envoyé dans la variable $_POST['q'].
	// La numérotation commence à 1 pour le client, et à 0 côté serveur.
	$q = 0;
	if (isset($_POST['q'])) $q = (int)$_POST['q'] - 1;
	if (!isset($fichier_xml->question[$q])) exit(0); // Erreur : la question n'existe pas.
	$qxml = $fichier_xml->question[$q];
	$qxml->explic = multi_lignes((string)$qxml->explic);
	$i = 0;
	foreach ($qxml->reponses->rep as $rep)
	{
		if ((int)$rep['bonne'] == 1) $rep->addAttribute('coul', 'vert');
		elseif ($_SESSION['rep'][$q] == $i) $rep->addAttribute('coul', 'rouge');
		else $rep->addAttribute('coul', 'blanc');
		unset($rep['bonne']);
		$i ++;
	}
	header("Content-Type: text/xml");
	echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n".XMLpropre($qxml->asXML());
}
?>


Merci pour les informations que tu m'as transmis précédemment.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
23 mars 2018 à 15:40
Il ne faut pas oublier qu'on est dans le contexte d'une requête Ajax.
C'est à dire que ce n'est pas la page du navigateur qui est rechargée, c'est un script de la page qui demande au serveur une information spécifique.
La page web dans laquelle tu te situes n'est pas affectée dans son intégralité par la redirection, c'est seulement la fonction « reception » qui recevra autre chose comme résultat. Ce qu'elle en fait, je ne sais pas. Elle attend probablement la question suivante pour l'afficher. Puisqu'elle reçoit quelque chose qu'elle ne comprend pas (une erreur SQL, par exemple, ou le contenu de ta redirection), elle ne réagit pas comme attendu.
0