Bonjour,

Voici le code PHP qui traite un formulaire :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
 <?php 
// RECUPERATION / TRAITEMENT
$matiere_choisie=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['matieres'])));
$classe_choisie=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['classes'])));
$titre_cours_tp=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['titre_cours_tp'])));
$auteur_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['auteur_cours'])));
$introduction_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['introduction_cours'])));
$conclusion_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['conclusion_cours'])));
 
// On récupère des array
$titre_chapitre_array = (!empty($_POST['titre_chapitre']))? $_POST['titre_chapitre'] : NULL;
$contenu_chapitre_array = (!empty($_POST['contenu_chapitre']))? $_POST['contenu_chapitre'] : NULL;
$question_chapitre_array = (!empty($_POST['question_chapitre']))? $_POST['question_chapitre'] : NULL;
$reponse_chapitre_array = (!empty($_POST['reponse_chapitre']))? $_POST['reponse_chapitre'] : NULL;
 
if (is_array($titre_chapitre_array)) {
	if(isset($_POST['poster_cours_tp'])){
	// => on enregistre en BDD si les zones de texte sont remplies - informations générales du Cours/TP
		if ($_POST['titre_cours_tp']==''||$_POST['auteur_cours']==''||$_POST['date_publication_tp']==''||$_POST['introduction_cours']=='') {
			echo "Veuillez saisir les informations générales du Cours/TP.";
			exit();
		}
		else
			$query_insertion_cours_tp=mysql_query("
INSERT INTO test_site_cours_v2 (titre_cours,auteur_cours,introduction_cours,conclusion_cours,date_publication_cours,date_cloture_validation_cours,matiere_cours,classe_cours)
VALUES ('$titre_cours_tp','$auteur_cours','$introduction_cours','$conclusion_cours',now(),'$date_cloture_validation_cours_tp','$matiere_choisie','$classe_choisie')")
or die('Erreur lors de l\'insertion d\'un Cours/TP (titre du cours, auteur du cours, introduction du cours, conclusion du cours, date de publication du cours, date de cloture de validation du cours)'.mysql_error()); // Envoie une requête à un serveur MySQL
			// On récupère l'identifiant du cours pour le mettre dans les requêtes SQL d'insertion
			$query_selection_cours=mysql_query("SELECT id_cours
FROM test_site_cours_v2
WHERE titre_cours='$titre_cours_tp'")
or die('Erreur lors de la sélection de l\'identifiant du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
			// On récupère l'identifiant du chapitre pour le mettre dans les requêtes SQL d'insertion
			$query_selection_chapitre=mysql_query("
SELECT id_chapitre
FROM test_site_chapitres_v2
WHERE auteur_chapitre='$auteur_cours'")
or die('Erreur lors de la sélection d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
			// Boucles pour récupérer les identifiants du Cours/TP - DEBUT
			while($recuperation_identifiant_cours = mysql_fetch_assoc($query_selection_cours)) {
				$recuperation_identifiant_cours['id_cours'];
				$_SESSION['id_cours']=$recuperation_identifiant_cours['id_cours'];
			}
			while($recuperation_identifiant_chapitre = mysql_fetch_assoc($query_selection_chapitre)) {
				$recuperation_identifiant_chapitre['id_chapitre'];
				$_SESSION['id_chapitre']=$recuperation_identifiant_chapitre['id_chapitre'];
			}
			// Boucles pour récupérer les identifiants du Cours/TP - FIN
			// => on enregistre en BDD si les zones de texte sont remplies
			if(empty($titre_chapitre_array)&&empty($contenu_chapitre_array)&&empty($question_chapitre_array)&&empty($reponse_chapitre_array)) {
				echo "Veuillez saisir au moins un chapitre et au moins une question sans oublier sa réponse.";
				exit();
			}
			else
				// A voir comment insérer les chapitres et questions seulement si l'utilisateur en a écrit
				foreach($titre_chapitre_array as $num_chapitre => $titre_chapitre) {
					//$num_chapitre
					$titre_chapitre = (!empty($titre_chapitre_array[$num_chapitre]))? $titre_chapitre_array[$num_chapitre] : '';
					$contenu_chapitre = (!empty($contenu_chapitre_array[$num_chapitre]))? $contenu_chapitre_array[$num_chapitre] : '';
 
					$query_insertion_chapitre=mysql_query("
INSERT INTO test_site_chapitres_v2 (id_cours,titre_chapitre,contenu_chapitre,date_depot,auteur_chapitre)
VALUES (".$_SESSION['id_cours'].",'$titre_chapitre','$contenu_chapitre',now(),'$auteur_cours')")
or die('Erreur lors de l\'insertion d\'un chapitre d\'un Cours/TP (identifiant du cours, titre du chapitre, contenu du chapitre, date de dépot du chapitre)'.mysql_error()); // Envoie une requête à un serveur MySQL - il faut récupérer l'identifiant du cours pour l'enregistrer dans la base de données
 
 
				// Questions / Réponses
					if(!empty($question_chapitre_array[$num_chapitre])){
						foreach($question_chapitre_array[$num_chapitre] as $num_question => $question_chapitre) {
							// $num_question
							$question_chapitre = (!empty($question_chapitre_array[$num_chapitre][$num_question]))? $question_chapitre_array[$num_chapitre][$num_question] : '';
							$reponse_chapitre = (!empty($reponse_chapitre_array[$num_chapitre][$num_question]))? $reponse_chapitre_array[$num_chapitre][$num_question] : '';
 
}
							// => on enregistre en BDD si les zones de texte sont remplies				
							$query_insertion_questions=mysql_query("
INSERT INTO test_site_questions_v2 (id_chapitre,contenu_question,date_depot,auteur_question)
VALUES (".$_SESSION['id_chapitre'].",'$question_chapitre',now(),'$auteur_cours')")
or die('Erreur lors de l\'insertion d\'une question d\'un chapitre d\'un Cours/TP (identifiant du chapitre, contenu de la question, date de dépot de la question)'.mysql_error()); // Envoie une requête à un serveur MySQL - il faut récupérer l'identifiant du chapitre pour l'enregistrer dans la base de données (ce que j'ai fait, à voir si c'est bon) et voir si il faut ajouter un champs id_cours
 
							// => on enregistre en BDD si les zones de texte sont remplies	- A mon avis, problème pour question_reference		
							$query_insertion_reponses=mysql_query("
INSERT INTO test_site_reponses_v2 (question_reference,date_depot)
VALUES ('$question_chapitre',now())")
or die('Erreur lors de l\'insertion d\'une réponse à une question d\'un Cours/TP (question référence, contenu de la réponse, date de dépot de la réponse'.mysql_error()); // Envoie une requête à un serveur MySQL - il faut récupérer l'identifiant de la question pour l'enregistrer dans la base de données					
}
}
}
// Insertion de la relation Cours-TP/Utilisateurs/Chapitres/Questions/Réponses dans la base de données
$query_insertion_relation_cours_tp_utilisateur=mysql_query("
INSERT INTO test_site_relation_cours_tp_utilisateur_v2 (id_cours_tp,id_utilisateur,id_chapitre,id_question,id_reponse)
SELECT t1.id_cours,t2.id_utilisateur,t3.id_chapitre,t4.id_question,t5.id_reponse
FROM test_site_cours_v2 t1,test_site_utilisateur t2,test_site_chapitres_v2 t3,test_site_questions_v2 t4,test_site_reponses_v2 t5
WHERE pseudo_utilisateur='$auteur_cours'
AND titre_cours='$titre_cours_tp'")
or die('Erreur lors de l\'insertion de la relation Cours-TP/Utilisateur avec Chapitres+Questions+Réponses (pour assurer l\'affichage)'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Votre Cours/TP a été posté.";
}

Ce code fonctionne : il insère tout ce qui à à insérer (informations générales du Cours/TP, chapitres du Cours/TP, questions du Cours/TP, réponses attendues aux questions du Cours/TP) dans des tables SQL différentes.

Néanmoins sur le formulaire, j'ai fait cette boucle qui permet d'afficher deux zones de texte (question et réponse) 5 fois :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<?php 
	// on boucle (par exemple) pour 5 QUESTIONS 
	for($num_question=1; $num_question<6; $num_question++) 
	{ 
?>
  <p>Question <?php echo $num_chapitre.'-'.$num_question; ?> :
    <input name="question_chapitre[<?php echo $num_chapitre; ?>][<?php echo $num_question; ?>]" type="text" />
  </p>
  <p>Réponse <?php echo $num_chapitre.'-'.$num_question; ?> :
    <input name="reponse_chapitre[<?php echo $num_chapitre; ?>][<?php echo $num_question; ?>]" type="text" />
  </p>
<?php 
	} // fin boucle question 
	// FIN MODULE
} // fin boucle chapitre 
?>

J'aimerais que le traitement PHP du formulaire insère dans la base de données uniquement les zones de texte où il y a quelque chose, non vides (où l'utilisateur a écrit ses questions et ses réponses).
Actuellement, le traitement PHP du formulaire insère dans la base de données les cinq zones de texte. Il fait ça pour les trois tables : test_site_chapitres_v2, test_site_questions_v2, test_site_reponses_v2.

Comment faire ?

En ce qui concerne la table relationnelle test_site_relation_cours_tp_utilisateur_v2 dont voici le CREATE TABLE :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
CREATE TABLE IF NOT EXISTS `test_site_relation_cours_tp_utilisateur_v2` (
  `id_rel_cours_user` int(11) NOT NULL AUTO_INCREMENT,
  `id_cours_tp` int(11) NOT NULL,
  `id_utilisateur` int(11) NOT NULL,
  `id_chapitre` int(11) NOT NULL,
  `id_question` int(11) NOT NULL,
  `id_reponse` int(11) NOT NULL,
  PRIMARY KEY (`id_rel_cours_user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
, j'aimerais qu'il aille chercher les différents identifiants dans les différentes tables et qu'il les enregistre dans le but d'assurer les différentes relations (bon Cours/TP = bons chapitres + bonnes questions + bonnes réponses).

Quand je fais un essai le plus simple possible (informations générales, un chapitre, une question et une réponses), voici ce que ça fait :
- dans la table test_site_chapitres_v2, insertion de 4 lignes d'enregistrements (dont 3 où titre_chapitre et contenu_chapitre ne contient une chaine vide)
- dans la table test_site_cours_v2, insertion des informations générales du Cours/TP
- dans la table test_site_questions_v2, insertion de 4 lignes d'enregistrements (où les 3 champs titre_question, contenu_question et reponse_question s'enregistrent avec des chaines vides, les champs id_cours et id_chapitre s'enregistrent avec les valeurs respectives 0 et 204)
- dans la table relationnelle test_site_relation_cours_tp_utilisateur_v2, insertion de plusieurs enregistrements (les champs id_utilisateur et id_cours_tp s'enregistrent avec les bonnes valeurs, les champs id_chapitre et id_question s'enregistrent avec les valeurs issues des tables appropriées.

En une phrase : Comment enregistrer seulement les chapitres, questions et réponses saisis par l'utilisateur (et pas les chaines de caractères vides) ?