Insertion de données dans la BDD (depuis des questionnaires)

Petit nouveau ! | 9 Messages

08 févr. 2012, 15:43

Bonjour,

je développe actuellement un projet de questionnaire permettant à des élèves d'une école d'apporter leurs avis sur les différents cours qu'ils suivent.

Pour le moment, j'ai mis en place un système de questions et, quand la question est de type "QCM", des boutons radios s'affichent.
Si la question est de type "Libre", un textarea s'affiche.

Voici mon code (qui fonctionne) :
<form method="post" action="ajout_reponse.php">
<div id="question">
<?php 
  echo '<b>- ' . $resAff["libelle"]  . '</b><br/><br/>';
  if ($resAff["type"] == "QCM")
    {

	$retour = mysql_query('SELECT texte FROM reponse_qcm');
	while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news.
	{
	  echo '<input type="radio" name="radio" value=""/>';						
	  echo ' '; echo($donnees['texte']); echo '<br/>'; 
	}
	  echo '<br/><br/>';

	}

	else
	{
	  echo '<textarea name="reponse_libre" cols="1000" rows="4" id="reponse_libre"></textarea>' . '<br/><br/><br/>';
	}
	?>

</div> <br/><div style="clear: both;">&nbsp;</div>
	
	<?php	
	}
	?>

<br/><br/><br/><br/>
<center> - - - - - - - - - - - - - - - - - - - - </center><br/><br/>

<center>
    <input type="button"  class="btn" id="button2" value="Annuler" />  &nbsp; &nbsp; &nbsp; 
    <input type="submit" class="btn" id="button2" name="submit" value="Envoyer les résultats" href="index.php"/> <br/>
</center>

</form>
?>
Mon problème actuel est que j'aimerais rendre ce système de questionnaire actif en insérant les données des formulaires dans la table "resultat" de ma BDD, mais je n'y arrive pas trop.

Table resultat à updater à la saisie de réponse : (pièce jointe)

Il faut donc que je travaille sur ma page ajout_reponse.php appelée par le <form action "..">.
J'ai toujours procédé avec des if (isset ...) mais là c'est plus compliqué car il y a, comme on peut le voir sur la table "resultat", quelques clés étrangères que je ne sais comment récupérer ..

Voici pour le moment ce que j'ai fait sur ma page ajout_reponse.php (dans le cas d'une question Libre uniquement) :
<?php
include('connexionBDD.php');

//--------------------------------------------------------
// Insertion de réponse LIBRE ?
//--------------------------------------------------------
if(isset($_POST['reponse_libre'])) 
{
    $reponse = addslashes($_POST['reponse_libre']);	
	
	// Ce n'est pas une modification, on crée une nouvelle entrée dans la table.
	mysql_query("INSERT INTO resultat VALUES('', '', '', '', '', '" . $reponse . "')");
}
print ("<script language = \"JavaScript\">");
print ("location.href = 'index.php';");
print ("</script>"); 
?>

Quelqu'un a une idée de comment procéder pour insérer les réponses de type "Libre" remplies par l'utilisateur dans la BDD ?

Merci à vous.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphanteau du PHP | 46 Messages

08 févr. 2012, 23:16

Je ne suis que débutant en php mais n'y as t'il pas une erreur dans ton code, tu écris :
        mysql_query("INSERT INTO resultat VALUES('', '', '', '', '', '" . $reponse . "')");

Ce ne serait pas :
        mysql_query("INSERT INTO resultat VALUES('', '', '', '', '', '" . $reponse . "');
De plus, il manque une colonne dans ton insert, j'en compte 7 dans ta table et 6 dans ta requête.

En espérant t'avoir aidé. Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 févr. 2012, 00:48

salut,

@atome13 : non il faut fermer la parenthèse du value ;) (insert into table values (,,,,,,); )

Je pense qu'il y a un problème de conception à la base.
Tu ne devrais pas avoir autant de champs "identique" sur une table.

par exemple (un truc rapide)
Image

celui ci ne règle pas le problème du vote "libre"

tu peux ajouter une table pour les votes "libre". (id, id vote, le texte)

après tu fait une requête sur chaque pour savoir s'il y a ou non des vote libre sur le vote en question.


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

09 févr. 2012, 14:42

Bonjour et merci de m'avoir répondu !

@ moogli : j'ai passé pas mal de temps sur mon mcd avec mon maître de stage et je pense que ce système tourne bien au niveau de phpmyadmin car la table "resultat" récupère les infos de plusieurs tables pour former les résultats, il est donc normal, je pense, d'avoir autant de clés étrangères !

Mais quand on voit le mcd, c'est tout de suite moins barbare que ce que peut laisser paraître la table SQL ^^

Pas de solutions au niveau du code sinon ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 févr. 2012, 15:10

je rste dubitatif quand à avoir deux champ de réponse dans l table, sans parler des infos multiple qui ne devrait pas y être.

quand je vois libre et QCM à volo dans la table, je me dit que l'unicité des données n'est pas forcément respectées.

enfin bref.

soit tu stock les ref dans un tableau en session, soit dans des champs cachées, soit tu les récupères dans la base avant insertion parce que bon ces infos s'y trouve, il te suffit de véhiculer la clef primaire de la question.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

09 févr. 2012, 15:26

Oui mais c'est une table regroupant les résultats globaux des évaluations, donc les résultats des questions de types QCM et Libre.
Chaque réponse à une question libre donne lieu à une entrée dans la table "resultat".
Dans le cas de la réponse QCM, si on y répond pour la première fois, une ligne est ajoutée.
Si on répond à la même question et par la même réponse, un compteur incrémente le nombre de résultats sur cette réponse.

Merci de tes conseils en tout cas

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 févr. 2012, 15:37

pour le compteur sql propose la focntion count :)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

09 févr. 2012, 15:45

En effet oui, mais même pour chaque entrée en dynamique ?

j'avais commencé à faire un truc du genre :

UPDATE RESULTAT, QUESTION
SET compteur_reponseqcm = compteur_reponseqcm + 1
WHERE ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 févr. 2012, 12:40

ben c 'est toi qui vois mais c'est de la donnée qui n'est pas forcément nécessaire :)


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

14 févr. 2012, 15:06

UP :)

J'ai réussi à récupérer l'id de l'évaluation en cours grâce aux sessions et à l'insérer dans ma BDD au moment de l'insertion de données.

Cependant, j'éprouve quelques difficultés à récupérer l'id de mes questions auxquelles je réponds... En effet, j'aimerais que 1 insertion se fasse dans la BDD pour CHAQUE question à laquelle je répond, hors là ça ne prend qu'une réponse en compte.

Voici mon code d'insertion actuel :
session_start();
include("connexionBDD.php");
$sqlEval = mysql_query("SELECT eval_id
					    FROM EVAL
					    WHERE EVAL.eval_fk_matiere='".$_SESSION['matiere_id']."' ");
$resEval = mysql_fetch_assoc($sqlEval);

echo $resEval['eval_id'];

//--------------------------------------------------------
// Insertion de réponse LIBRE ?
//--------------------------------------------------------
if(isset($_POST['reponse_libre']))
{
    $reponse = addslashes($_POST['reponse_libre']);	
	
	// Ce n'est pas une modification, on crée une nouvelle entrée dans la table.
	mysql_query("INSERT INTO resultat VALUES('', '".$resEval['eval_id']."', '1', 'Libre', 'NULL', '1', '" . $reponse . "')") or die(mysql_error());
}
Avec ce code, j'arrive à insérer dans ma BDD le contenu du textarea et à récupérer l'id de l'évaluation à laquelle je répond, pour une seule question uniquement.

Mes questions sont :
- Premièrement, comment récupérer l'id (ou les id) de la question à laquelle j'ai répondu pour pouvoir renseigner dans ma table "resultat" au moment de l'insertion, l'id de la question à laquelle est rattachée la réponse ?
- Comment faire en sorte qu'il y ai une entrée dans la BDD pour CHAQUE réponse donnée ?

Pour schématiser, on doit avoir, au moment de l'insertion :

Cas d'une réponse de type "Libre" : (pour une seule réponse)
resultat_id resultat_fk_eval resultat_fk_question resultat_fk_question_type resultat_fk_reponseqcm compteur_reponseqcm libre
37 4 1 Libre NULL 1 ma_réponse

ou bien (pour plusieurs réponses) :
resultat_id resultat_fk_eval resultat_fk_question resultat_fk_question_type resultat_fk_reponseqcm compteur_reponseqcm libre
37 4 1 Libre NULL 1 ma_réponse 1
resultat_id resultat_fk_eval resultat_fk_question resultat_fk_question_type resultat_fk_reponseqcm compteur_reponseqcm libre
37 4 2 Libre NULL 1 ma_réponse 2
resultat_id resultat_fk_eval resultat_fk_question resultat_fk_question_type resultat_fk_reponseqcm compteur_reponseqcm libre
37 4 3 Libre NULL 1 ma_réponse 3

Help :cry:

Merci à vous.

Petit nouveau ! | 9 Messages

15 févr. 2012, 10:19

UP !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 févr. 2012, 11:40

ben soit tu valide directement chaque question et insère ensuite dans la base, soit tu stock le tout en session et après tu boucle sur le tableau de stockage des questions réponses.

dans tous les cas tu doit gérer l'id de la question courante (par le formulaire ou en session). et en fin de question un foreach avec la requete dedans.

pour infos ton jeux de donnée ne peux être bon, une clef primaire est, par définition, unique et la y trois fois 37 ^^

perso je pense que tu doit prévoir ton appli sur le papier avant et ça ira mieux ;)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

15 févr. 2012, 12:39

Merci moogli, normal pour la clé primaire j'ai fait des copiés-collés de cette ligne ! J'ai oublié de modifier les clés primaires lors de mon post :D