Non, quand tu veux mettre à jour un chapitre, c'est evidemment l'id du chapitre qui sert à identifier la ligne à mettre à jour et pas l'id du cours.
Version imprimable
Non, quand tu veux mettre à jour un chapitre, c'est evidemment l'id du chapitre qui sert à identifier la ligne à mettre à jour et pas l'id du cours.
La voici modifiée :
Code:
1
2
3
4
5
6
7
8
9 $query_modification_chapitre=mysql_query(" UPDATE test_site_chapitres_v2 SET id_cours='$id_cours_tp', titre_chapitre='$titre_chapitre',contenu_chapitre='$contenu_chapitre',date_maj_chapitre=now() WHERE id_chapitre='$id_chapitre' AND auteur_chapitre IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4'))") or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL
En ce qui concerne les requêtes SQL, est-ce que c'est bon ?
Tu n'as pas répondu pour les sous-requêtes "auteur"
J'ai rajouté AND pseudo_utilisateur='$pseudo_utilisateur' (permet de vérifier le pseudo) dans toutes les requêtes SQL ce qui fait :
Code:
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 $query_modifier_cours_tp=mysql_query(" UPDATE test_site_cours_v2 SET introduction_cours='$introduction_cours', conclusion_cours='$conclusion_cours',date_maj_cours=now() WHERE id_cours='$id_cours_tp' AND auteur_cours IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les informations générales du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $query_modification_chapitre=mysql_query(" UPDATE test_site_chapitres_v2 SET id_cours='$id_cours_tp', titre_chapitre='$titre_chapitre',contenu_chapitre='$contenu_chapitre',date_maj_chapitre=now() WHERE id_chapitre='$id_chapitre' AND auteur_chapitre IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL $query_modification_questions=mysql_query(" UPDATE test_site_questions_v2 SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',contenu_question='$question_chapitre',reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les questions du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $query_modification_reponses=mysql_query(" UPDATE test_site_reponses_v2 SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',question_reference IN (SELECT id_question FROM test_site_questions_v2 WHERE contenu_question='$question_chapitre'),reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les réponses du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
Est-ce que pour les requêtes SQL, c'est bon ?
On n'a toujours pas l'explication de la sous-requête sur l'auteur.
C'est pour vérifier si l'auteur est dans la table des utilisateurs ayant soit 1 soit 3 soit 4 comme accès tout simplement.
On est d'accord qu'il n'y a pas forcément besoin de faire ça mais ce n'est pas à cause de ça que la boucle ne fonctionne pas.
J'ai supprimé les deux boucles dans le traitement PHP, voici les codes actualisés :
La requête SQL "générale" :
Code:
1
2
3
4
5
6
7
8
9 $selection_cours=mysql_query(" SELECT test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question,titre_chapitre, contenu_question, contenu_chapitre FROM test_site_chapitres_v2 LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre AND test_site_chapitres_v2.id_cours='$id_cours_tp' WHERE test_site_chapitres_v2.id_cours='$id_cours_tp' ORDER BY id_chapitre ASC") or die('Erreur lors de la sélection de l\'identifiant du chapitre du titre, du contenu des chapitres et des questions d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
L'affichage :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <?php while ($row = mysql_fetch_assoc($selection_cours)) { if ($row['id_chapitre'] != $id_chapitre) { echo 'Identifiant du chapitre : '.$id_chapitre; echo '<br />Titre du chapitre n° <input type="text" name="titre_chapitre[' . $row['id_chapitre'] . ']" value="'.$row['titre_chapitre'].'" /> <br />'; echo 'Contenu du chapitre n° <textarea name="contenu_chapitre[' . $row['id_chapitre'] . ']" rows=10 cols=40>'.$row['contenu_chapitre'].'</textarea><br />'; $id_chapitre = $row['id_chapitre']; } if ($row['contenu_question']) { echo '<br />Question : <input type="text" name="contenu_question[' . $row['id_question'] . ']" value="'.$row['contenu_question'].'"<br />'; $id_question = $row['id_question']; } } echo '<input type="submit" value="Modifier mon Cours/TP" name="modifier_cours_tp" />'; ?>
Le traitement PHP :
Code:
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 <?php $introduction_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['introduction_cours']))); $conclusion_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['conclusion_cours']))); $titre_chapitre_array = (!empty($_POST['titre_chapitre'.$id_chapitre]))? $_POST['titre_chapitre['.$id_chapitre.']'] : NULL; $contenu_chapitre_array = (!empty($_POST['contenu_chapitre'.$id_chapitre]))? $_POST['contenu_chapitre['.$id_chapitre.']'] : NULL; $contenu_question_array = (!empty($_POST['contenu_question'.$id_chapitre]))? $_POST['contenu_question['.$id_chapitre.']'] : NULL; $contenu_reponse_array = (!empty($_POST['contenu_reponse'.$id_chapitre.']']))? $_POST['contenu_reponse['.$id_chapitre.']'] : NULL; if (is_array($titre_chapitre_array)) { if(isset($_POST['modifier_cours_tp'])) { $query_modifier_cours_tp=mysql_query(" UPDATE test_site_cours_v2 SET introduction_cours='$introduction_cours', conclusion_cours='$conclusion_cours',date_maj_cours=now() WHERE id_cours='$id_cours_tp' AND auteur_cours IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les informations générales du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $_SESSION['id_cours']=mysql_insert_id(); if(empty($titre_chapitre_array)&&empty($contenu_chapitre_array)&&empty($contenu_question_array)&&empty($contenu_reponse_array)) { echo "Veuillez saisir au moins un chapitre et au moins une question sans oublier sa réponse."; exit(); } else foreach($titre_chapitre_array as $id_chapitre => $titre_chapitre) { $titre_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($titre_chapitre_array[$id_chapitre]))? $titre_chapitre_array[$id_chapitre] : '')); $contenu_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_chapitre_array[$id_chapitre]))? $contenu_chapitre_array[$id_chapitre] : '')); $query_modification_chapitre=mysql_query(" UPDATE test_site_chapitres_v2 SET id_cours='$id_cours_tp', titre_chapitre='$titre_chapitre',contenu_chapitre='$contenu_chapitre',date_maj_chapitre=now() WHERE id_chapitre='$id_chapitre' AND auteur_chapitre IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL foreach($question_chapitre_array[$id_chapitre] as $num_question => $question_chapitre) { $question_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_question_array[$id_chapitre][$num_question]))? $contenu_question_array[$id_chapitre][$num_question] : '')); $reponse_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_reponse_array[$id_chapitre][$num_question]))? $contenu_reponse_array[$id_chapitre][$num_question] : '')); $query_modification_questions=mysql_query(" UPDATE test_site_questions_v2 SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',contenu_question='$question_chapitre',reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les questions du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $query_modification_reponses=mysql_query(" UPDATE test_site_reponses_v2 SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',question_reference IN (SELECT id_question FROM test_site_questions_v2 WHERE contenu_question='$question_chapitre'),reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question IN (SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE (acces_utilisateur='1' OR acces_utilisateur='3' OR acces_utilisateur='4') AND pseudo_utilisateur='$pseudo_utilisateur')") or die('Erreur sur la requête SQL qui met à jour les réponses du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL } } } echo '</form>'; echo 'Vous avez modifié.'; } ?>
J'ai supprimé les deux boucles while.
Qu'est-ce qu'il ne va pas dans le traitement PHP (sachant que les requêtes SQL sont désormais bonnes) ?
C'est l'utilisateur qui fait la mise à jour alors qu'il faut contrôler, pas celui qui est actuellement dans la base.Citation:
C'est pour vérifier si l'auteur est dans la table des utilisateurs ayant soit 1 soit 3 soit 4 comme accès tout simplement.
Dans tous les cas, cela ne sert à rien de refaire la vérification pour chaque cours, chaque chapitre, chaque question mise à jour : fais le contrôle en entrée de traitement et c'est reglé.
$id_chapitre n'est pas défini dans ce code.Code:$titre_chapitre_array = (!empty($_POST['titre_chapitre'.$id_chapitre]))? $_POST['titre_chapitre['.$id_chapitre.']'] : NULL;
Tu devrais développer en affichant toutes les erreurs PHP, cela te signalerait ce genre de problème.
bof.Citation:
sachant que les requêtes SQL sont désormais bonnes
tu as encore id_cours qui se ballade dans la table des questions alors que je t'ai déjà dit qu'il n'avait rien à y faire.
Également tu fais une mise à jour de id_chapitre et de reponse_question dans la table questions alors qu'ils ne sont pas présents dans ton formulaire.
Tu devrais regarder le contenu de ton $_POST pour mieux comprendre ce que tu fais
Code:print_r($_POST);
J'ai enlevé la modification de l'identifiant du cours dans la table des question, j'ai ajouté sur l'affichage des réponses.
Par contre, il faut modifier cette requête SQL pour sélectionner uniquement les questions et les réponses du bon cours :
Code:
1
2
3
4
5
6
7
8
9
10 $selection_cours=mysql_query(" SELECT test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question,titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse FROM test_site_reponses_v2, test_site_chapitres_v2 LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre AND test_site_chapitres_v2.id_cours='$id_cours_tp' WHERE test_site_chapitres_v2.id_cours='$id_cours_tp' ORDER BY id_chapitre ASC") or die('Erreur lors de la sélection de l\'identifiant du chapitre du titre, du contenu des chapitres et des questions d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
Voici la boucle d'affichage (dans laquelle j'ai rajouté les réponses) :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 while ($row = mysql_fetch_assoc($selection_cours)) { // Affichage du titre du chapitre if ($row['id_chapitre'] != $id_chapitre) { echo 'Identifiant du chapitre : '.$id_chapitre; echo '<br />Titre du chapitre n° <input type="text" name="titre_chapitre[' . $row['id_chapitre'] . ']" value="'.html_entity_decode(stripslashes($row['titre_chapitre'])).'" /> <br />'; echo 'Contenu du chapitre n° <textarea name="contenu_chapitre[' . $row['id_chapitre'] . ']" rows=10 cols=40>'.html_entity_decode(stripslashes($row['contenu_chapitre'])).'</textarea><br />'; $id_chapitre = $row['id_chapitre']; } // Affichage des questions du chapitre, s'il y en a if ($row['contenu_question']) { echo '<br />Question : <input type="text" name="contenu_question[' . $row['id_question'] . ']" value="'.$row['contenu_question'].'"<br />'; echo '<br />Réponse : <input type="text" name="contenu_question[' . $row['id_reponse'] . ']" value="'.$row['texte_reponse'].'"<br />'; $id_question = $row['id_question']; $id_reponse = $row['id_reponse']; } }
Voici le traitement PHP :
Code:
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 if (is_array($titre_chapitre_array)) { if(isset($_POST['modifier_cours_tp'])) { $query_modifier_cours_tp=mysql_query("UPDATE test_site_cours_v2 SET introduction_cours='$introduction_cours', conclusion_cours='$conclusion_cours',date_maj_cours=now() WHERE id_cours='$id_cours_tp' AND auteur_cours='$pseudo_utilisateur'") or die('Erreur sur la requête SQL qui met à jour les informations générales du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $_SESSION['id_cours']=mysql_insert_id(); // On met sous session l'identifiant généré par la dernière requête (identifiant du Cours/TP) // => on enregistre en BDD si les zones de texte sont remplies if(empty($titre_chapitre_array)&&empty($contenu_chapitre_array)&&empty($contenu_question_array)&&empty($contenu_reponse_array)) { echo "Veuillez saisir au moins un chapitre et au moins une question sans oublier sa réponse."; exit(); } else // Boucle permettant de modifier dans la base de données les chapitres - DEBUT - Cette boucle ne fonctionne pas foreach($titre_chapitre_array as $id_chapitre => $titre_chapitre) { $titre_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($titre_chapitre_array[$id_chapitre]))? $titre_chapitre_array[$id_chapitre] : '')); $contenu_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_chapitre_array[$id_chapitre]))? $contenu_chapitre_array[$id_chapitre] : '')); // Modification des chapitres dans la base de données $query_modification_chapitre=mysql_query("UPDATE test_site_chapitres_v2 SET id_cours='$id_cours_tp', titre_chapitre='$titre_chapitre',contenu_chapitre='$contenu_chapitre',date_maj_chapitre=now() WHERE id_chapitre='$id_chapitre' AND auteur_chapitre='$pseudo_utilisateur'") or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL // Boucle permettant de modifier les questions/réponses dans la base de données - DEBUT foreach($question_chapitre_array[$id_chapitre] as $num_question => $question_chapitre) { $question_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_question_array[$id_chapitre][$num_question]))? $contenu_question_array[$id_chapitre][$num_question] : '')); $reponse_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_reponse_array[$id_chapitre][$num_question]))? $contenu_reponse_array[$id_chapitre][$num_question] : '')); // Modification des questions/réponses dans la base de données $query_modification_questions=mysql_query("UPDATE test_site_questions_v2 SET id_chapitre='$id_chapitre',contenu_question='$question_chapitre',reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question='$pseudo_utilisateur'") or die('Erreur sur la requête SQL qui met à jour les questions du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL $query_modification_reponses=mysql_query("UPDATE test_site_reponses_v2 SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',question_reference IN (SELECT id_question FROM test_site_questions_v2 WHERE contenu_question='$question_chapitre'),reponse_question ='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now() WHERE id_cours='$id_cours_tp' AND auteur_question='$pseudo_utilisateur'") or die('Erreur sur la requête SQL qui met à jour les réponses du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL // Boucle permettant de modifier les questions/réponses dans la base de données - FIN } } } echo '</form>'; echo 'Vous avez modifié.'; }
La première chose à faire maintenant, c'est d'ajouter une jointure pour qu'il ne sélectionne que les réponses des bonnes questions du bon cours. Peux-tu m'aider STP ? J'apprécie ta patience, je suis conscient que je vais lentement mais j'espère qu'on va finir par y arriver !!!
Cette requête SQL me semble bonne (bon cours/bonnes questions/bonnes réponses) :
Code:
1
2
3
4
5
6
7
8
9 $selection_cours=mysql_query(" SELECT test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question,titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse FROM test_site_reponses_v2, test_site_chapitres_v2 LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre AND test_site_chapitres_v2.id_cours='$id_cours_tp' WHERE test_site_chapitres_v2.id_cours='$id_cours_tp' AND test_site_reponses_v2.id_question=test_site_questions_v2.id_question ORDER BY id_chapitre ASC");
Qu'est-ce que tu en penses ?
La requête SQL est bonne.
Juste pour info, la requête SQL est bonne. Désormais, uniquement les chapitres, les questions et leurs réponses respectives s'affichent dans le bon cours.
Lors de la soumission du formulaire, il y a toujours une page blanche qui s'affiche ce qui veut dire qu'il ne rentre pas dans les tests.
Il y aurait t'il pas un problème dans ce bloc :
?Code:
1
2
3
4 $titre_chapitre_array = (empty($_POST['titre_chapitre']))? $_POST['titre_chapitre'] : NULL; $contenu_chapitre_array = (empty($_POST['contenu_chapitre']))? $_POST['contenu_chapitre'] : NULL; $contenu_question_array = (empty($_POST['contenu_question']))? $_POST['contenu_question'] : NULL; $contenu_reponse_array = (empty($_POST['contenu_reponse']))? $_POST['contenu_reponse'] : NULL;
A noter que j'ai supprimé les identifiants. Toute façon en les mettant, ça fait la même chose (aucune modification dans la base de données et affichage d'une page blanche).
Je t'ai déjà dit que si un peu plus haut.Citation:
Il y aurait t'il pas un problème dans ce bloc :
J'ai mis print_r($_POST); avant if (is_array($titre_chapitre_array)) {, il m'affiche :
Array ( [id_cours_tp] => 230 [cours_tpok] => Titre )
cours_tpok n'est nulle part dans le traitement PHP.
Il ne faut pas le récupérer en $_GET ?
On n'a jamais parlé de "cours_tpok" il sort d'ou celui la ?
Dans la page qui permet de lister les cours, il y a <input type="hidden" name="id_cours_tp" value="'.$row['id_cours'].'" /> et <input type="submit" name="cours_tpok" value="'.$row['titre_cours'].'" />.
Je ne sais pas de quelle requête devait venir $row['titre_cours'] mais il n'est pas bon.
De toute façon je ne vois pas pourquoi ton bouton submit contiendrait le titre du cours.
Tu mettrais quoi à la place du bloc ? :?
la "value" du bouton submit c'est le texte écrit dedans.
"Valider" par exemple
Pour info, j'ai remplacé ce bloc par :
Code:
1
2
3
4 $titre_chapitre_array=$_POST['titre_chapitre[' . $id_chapitre. ']']; $contenu_chapitre_array=$_POST['contenu_chapitre[' . $id_chapitre. ']']; $contenu_question_array=$_POST['contenu_question[' . $id_question. ']']; $contenu_reponse_array=$_POST['contenu_reponse[' . $id_reponse. ']'];
Mais, ça fait toujours pareil.
Ou est défini $id_chapitre ? $id_question ?
Dans la boucle while.
Ce bloc est en dessous de la boucle while.
A mon avis, il ne trouve pas $id_chapitre, $id_question et $id_reponse car ces variables proviennent de la boucle while et que ce bloc est en dessous de la boucle while.
J'ai essayé de mettre le bloc dans la boucle while mais il n'y a pas eu de changement.
Comment utiliser une ligne ou des variables qui proviennent d'une boucle while?
Montre nous le code, ça sera plus facile que de nous l'expliquer.