IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Requêtes SQL INSERT INTO et UPDATE en utilisant AJAX


Sujet :

AJAX

  1. #21
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    test_site_utilisateur est une table car je ne vois s'y rapportant.

    J'ai quelques questions sur ta modélisation car je pense que le problème vient de là.

    - Tes questions possèdent des ids uniques? tu dois donc récupérer cet id et le passer par l'AJAX lorsque tu veux mettre à jour une réponse
    - Pourquoi 0 ou 1 réponse par question? Ca ne correspond pas à tes tables qui sont de type 1, n réponse pour une question???
    - Je pense que dans ton cas tu devrais insérer la réponse à chaque fois ou modifier ton MLD afin de faire une table associative du genre:

    ** association: id_user-id_question-reponseText avec clé d'unicité sur id_user-id_question -> si elle existe alors je met à jour le reponseText si non j'insère (très simple en terme de requête)

    Voilà ce que tu veux faire est vraiment simple en terme d'action en BDD, il faut juste simplifier ta manière d'insérer

    N'hésites pas à poser des question sur la modélisation ou à me décrire un scénario qui pourrait justifier tes choix...

    ++

  2. #22
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par freddou17 Voir le message
    test_site_utilisateur est une table car je ne vois s'y rapportant.
    test_site_utilisateur est une table dans laquelle j'insère tous les utilisateurs.

    Citation Envoyé par freddou17 Voir le message
    - Tes questions possèdent des ids uniques? tu dois donc récupérer cet id et le passer par l'AJAX lorsque tu veux mettre à jour une réponse
    Dans la table questions, id_question est la clé primaire.
    Lors de l'insertion des réponses, il faut insérer l'id_question issu de la table questions. C'est pour cela que j'ai fait une requête SQL du type INSERT INTO table SELECT valeur FROM questions... mais elle ne veut pas s'exécuter, il n'affiche pas de message d'erreur SQL.
    Citation Envoyé par freddou17 Voir le message
    - Pourquoi 0 ou 1 réponse par question? Ca ne correspond pas à tes tables qui sont de type 1, n réponse pour une question???
    0 = aucune réponse
    1 = une réponse
    Citation Envoyé par freddou17 Voir le message
    - Je pense que dans ton cas tu devrais insérer la réponse à chaque fois ou modifier ton MLD afin de faire une table associative du genre:

    ** association: id_user-id_question-reponseText avec clé d'unicité sur id_user-id_question -> si elle existe alors je met à jour le reponseText si non j'insère (très simple en terme de requête)
    Je ne comprends pas pourquoi ça ne fonctionne pas comme ça : il faut juste aller chercher l'id_question de la table questions et l'insérer ou la modifier dans la table reponses !

    Peux-tu m'aider là ?! Je voudrais juste insérer ou modifier le bon identifiant de la question dans la table reponses à chaque insertion de réponses (évènement onChange des <textarea>), c'est tout !!!

    Le pire : dans le traitement PHP, j'ai mis une requête SQL classique en commentaire (INSERT INTO table VALUES valeurs) qui, elle, s'exécute ! Tu as vu ? L'autre (celle qui sélectionne l'identifiant de la question dans la table questions) ne s'exécute pas. Je n'ai pas d'erreur SQL qui s'affiche, quand je la teste sur PHPMyAdmin, elle s'exécute !

    Le plus important (ce que je n'arrive pas à faire !) : C'est que le champs id_question de la table reponse s'insère ou se modifie avec l'identifiant de la question issu de la table questions.

  3. #23
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Oui j'ai bien compris,

    Pour moi tu dois stocker en hidden l'id de la question sur ta page qui affiche ton cours. Tu dois le passer dans ton traitement AJAX
    Ensuite dans ton traitement AJAX tu testes si tu as déjà une réponse

    si oui tu update

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    $modification_reponses = "UPDATE reponses SET auteur_reponse=(SELECT pseudo_utilisateur FROM test_site_utilisateur WHERE pseudo_utilisateur=auteur_reponse),id_question='$id_cours_rep',texte_reponse='$contenu_reponse',date_maj_reponse=now()";

    devrait être (on travaille toujours avec les ids)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $selection_reponse=mysql_query("SELECT id_reponse FROM reponses WHERE id_question='".$id_cours_rep."'") or die('Erreur lors de la sélection des réponses d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
    $id_rep_trouvee = mysql_result($result, 0);
    $modification_reponses = "UPDATE reponses SET id_auteur=$_SESSION['id_utilisateur'],id_question='$id_question',texte_reponse='$contenu_reponse',date_maj_reponse=now() where reponses.id_reponses=$id_rep_trouvee" ;
    si non,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO reponses (id_question,texte_reponse,date_depot,auteur_reponse) VALUES ($id_question,$contenu_reponse,now(),$_SESSION['id_utilisateur']);
    Tout simplement pas besoin de select imbriqués

  4. #24
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Je reviens en te mettant en pièces jointes les fichiers avec les dernières modifications.

    Dans le fichier du traitement php, je t'ai mis en commentaires les modifications effectuées et ce que les essais donnent !!!

    Merci de m'indiquer ce qu'il faut changer !

    Sur Firebug, dans l'id_question, il y a [object NodeList].

    Si je fais un alert(message);, voici ce qu'il affiche :
    id_cours_tp=5&id_utilisateur=6&id_question=[object NodeList]&id_cours_rep=481&reponse=bb

  5. #25
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Alors

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if ($row['contenu_question']) {
    					$compteur_question++; // Je l'ai laissé pour l'affichage
    					// Ajout de l'identifiant de la question - DEBUT
    					//echo '<input type="hidden" name="id_question" value="'.$row['id_question'].'" />'; // Il faut transmettre ça par AJAX
    					// Ajout de l'identifiant de la question - FIN
    					echo '<div class="exercice"><ul><li>'.html_entity_decode(stripslashes($row['contenu_question'])).'</li></ul><a name="question'.$compteur_question.'"></a><div class="reponse_cours_tp">
    Votre réponse <b>n°'.$compteur_question.'</b> 
    <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.$compteur_question.'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.$compteur_question.'" onChange="go('.$row['id_question'].', this.value);">
    </textarea></div></div>';// pourquoi $row['id_question'] je croyais que c'etait $id_cours_tp
    					}
    				}

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var id_question = document.getElementsByName(id_question);// d'ou vient id_question
    peux tu répondes aux questions en vert stp???

    Sinon voilà je pense un début de déblocage (récuperation du bon id question)

    dans ton js
    Code : 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
    function go(id_cours_rep, reponse, id_question_tmp //modif) {
    
        var xhr = init_xhr();
    
        xhr.onreadystatechange = function () {
    
            if (xhr.readyState == 4 && xhr.status == 200) {
                reponse = xhr.responseText;
    
    
    			alert(reponse);
            }
        }
        xhr.open("POST", "sauvegarde_reponses_cours_tp.php", true);
    
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        /* Utilisation des variables PHP (identifiants du cours et de l'utilisateur) - Il détecte les bons identifiants (cours, l'utilisateur connecté) */
        var id_cours_tp = '<?php echo $id_cours_tp; ?>'; /* A mon avis, ce n'est pas la peine de transférer l'identifiant du cours puisqu'une question ne peut pas être dans plusieurs cours ! */
    	var id_utilisateur = '<?php echo $query_recuperation_identifiant_connecte; ?>';
    	var id_question = document.getElementById(id_question_tmp);
    
    ...
    dans ton php
    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
    $cpt=0;//modif
    			while ($row = mysql_fetch_assoc($selection_cours)) {
    				// Affichage du titre et du contenu du chapitre
    				if ($row['id_chapitre'] != $id_chapitre) {
    					echo '<h1>'.html_entity_decode(stripslashes($row['titre_chapitre'])).'</h1>';
    					echo html_entity_decode(stripslashes($row['contenu_chapitre']));
    					$id_chapitre = $row['id_chapitre'];
    				}
    				// Affichage des questions (avec le compteur, le 24/04/14 j'ai supprimé $compteur_question pour le remplacer par $row['id_question']) du chapitre, s'il y en a
    				if ($row['contenu_question']) {
    					$compteur_question++; // Je l'ai laissé pour l'affichage
    					// Ajout de l'identifiant de la question - DEBUT
    					$idTmp = $row['id_question']."_".$cpt; //modif 
    					echo '<input type="hidden" name="id_question" id="'.$idTmp.'" value="'.$row['id_question'].'" />'; // Cette ligne permet de stocker l'id_question avec un id unique
    echo '<div class="exercice"><ul><li>'.html_entity_decode(stripslashes($row['contenu_question'])).'</li></ul><a name="question'.$compteur_question.'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.$compteur_question.'</b> <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.$compteur_question.'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.$compteur_question.'" onChange="go('.$row['id_question'].', this.value,$idTmp //modif);"></textarea></div></div>';
    					}

    prend le temps de bien comprendre ce que je te propose et dis moi si jamais tu as d'autres problèmes.. ++

  6. #26
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Non, ça ne marche pas .

    On va essayer chacun de notre côté, ça te dit ?

    Le premier qui trouve poste les deux fichiers pour aider l'autre, ok ?!

    Le problème, c'est pour récupérer l'identifiant de la question à laquelle l'utilisateur poste sa réponse dans chaque <textarea> de la page. Je ne sais pas comment le gérer , je cherche...

    Essayes si tu as la possibilité de le faire réellement si ce n'est pas déjà fait et si oui envoie-moi les deux fichiers STP...

    Le problème de cette ligne var id_question = document.getElementById(id_question).value, c'est que l'identifiant est composé de l'identifiant de la question trouvé par PHP donc la réponse est "null". Dans le code PHP, j'ai mis echo '<input type="hidden" id="id_question_'.$row['id_question'].'" name="id_question" value="'.$row['id_question'].'" />';. Il faut transmettre l'identifiant de la question à laquelle l'utilisateur répond par AJAX. Quand j'essaye, ça ne m'affiche rien mais c'est normal car il faut prendre en compte $row['id_question'] du <textarea> qui a le focus.
    Mais comment, telle est la question ?!
    C'est dingue quand même, on a réglé le problème de l'AJAX et on bloque sur des requêtes SQL (pour insérer le bon identifiant de la question dans la table questions)...

    La question à résoudre : Comment récupérer l'identifiant de la question dans la table questions pour la question l'utilisateur a posté sa réponse (sachant qu'il y a plusieurs questions dans un cours) ? Une fois qu'on aura fait ça, on aura gagné !

  7. #27
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Je t'ai donné la solution dans le poste d'avant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var id_question = document.getElementsByName(id_question);// d'ou vient id_question???
    ça c'est toi qui l'a écrit mais pourquoi ça n'a pas de sens

    moi je te re-post ma solution

    tu modifie ta fonction js go (rajout d'un paramètre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function go(id_cours_rep, reponse, id_question_tmp //modif) {
    ...
    var id_question = document.getElementById(id_question_tmp);
    }
    ton php

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $cpt=0
     
    while{
    ...
    $idTmp = $row['id_question']."_".$cpt; //modif 
    echo '<input type="hidden" name="id_question" id="'.$idTmp.'" value="'.$row['id_question'].'" />'; // Cette ligne permet de stocker l'id_question avec un id unique
    echo '<div class="exercice"><ul><li>'.html_entity_decode(stripslashes($row['contenu_question'])).'</li></ul><a name="question'.$compteur_question.'"></a><div class="reponse_cours_tp">Votre réponse <b>n°'.$compteur_question.'</b> 
    <div style="position:relative; top:1.5em;left:0em;float:left;" id="image'.$compteur_question.'"></div>:<br /><textarea onkeyup="dynamicHeight(this);" rows="1" style="height: 40px;" cols="80" name="reponse'.$compteur_question.'" onChange="go('.$row['id_question'].', this.value,$idTmp //modif);"></textarea></div></div>';
    ...
    $cpt++;
    }

    étudie ce code:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $idTmp = $row['id_question']."_".$cpt; //modif 
    echo '<input type="hidden" name="id_question" id="'.$idTmp.'" value="'.$row['id_question'].'" />'; // Cette ligne permet de stocker l'id_question avec un id unique

    Rassure moi, $row['id_question'] correspond bien à l'id de la question en base

    Tout est là, c'est pas compliqué tout de même...

  8. #28
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Je te mets en pièces jointes les 2 fichiers. Dans le fichier qui permet d'envoyer les réponses, j'ai mis à jour le code par rapport au tien.

    Désormais, on a avancé puisque maintenant, si je fais un alert(id_question); voici ce que ça affiche : [object HTMLInputElement].
    Si j'envoie la variable "message", voici le résultat obtenu :
    "Identifiant du Cours : 2<br />Identifiant de la réponse : 451<br/>Réponse : c<br />Identifiant de la question : [object HTMLInputElement]INSERT INTO reponses (id_question,texte_reponse,date_depot,auteur_reponse) VALUES ('[object HTMLInputElement]','',now(),''Erreur sur la requête SQL qui insère les réponses de l'utilisateur aux questions.You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"

    Avec ce message, on voit bien l'erreur, pourquoi la requête SQL ne s'exécute pas : c'est dû à [object HTMLInputElement].

    Dans le fichier du traitement PHP, je t'ai écris le problème : c'est la récupération de l'id_question dans lequel il y a [object HTMLInputElement] à la place de l'identifiant de la question.

    Comment régler ce problème de [object HTMLInputElement] ?

    $row['id_question'] correspond à l'identifiant de la question dans la base de données.

    Comme je l'ai écrit dans le fichier d'affichage, en ajoutant $idTmp en paramètre dans la fonction GO, Firebug affiche une erreur "SyntaxError: identifier starts immediately after numeric literal" comme quoi le troisième paramètre n'est pas une valeur numérique, j'ai donc remplacé $idTmp = $row['id_question']."_".$cpt; par $idTmp = $row['id_question'].$cpt;.

    Une dernière question (pour ce soir !) : Quel est le lien, le moyen de récupération des données entre le name de echo '<input type="hidden" name="id_question" id="'.$idTmp.'" value="'.$row['id_question'].'" />'; et var id_question = document.getElementById(id_question_tmp); ? D'un côté, c'est l'identifiant et de l'autre, c'est le name.

  9. #29
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Comment régler ce problème de [object HTMLInputElement]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var id_question = document.getElementById(id_question_tmp)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var id_question = document.getElementById(id_question_tmp).value
    tua s cherché?

    Une dernière question (pour ce soir !) : Quel est le lien, le moyen de récupération des données entre le name de echo '<input type="hidden" name="id_question" id="'.$idTmp.'" value="'.$row['id_question'].'" />'; et var id_question = document.getElementById(id_question_tmp); ? D'un côté, c'est l'identifiant et de l'autre, c'est le name.
    Je pensais que tu connaissais meiux JS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     var id_question = document.getElementById(id_question_tmp)
    recupère l'élement DOM identifiable par son id, c'est à dire l'ensemble de l'élemen: input type="hidden"... (c'est pourquoi il nous manquait le .value). 'id_question_tmp correspond à ton parametre de ta fonction js go et par conséquent à $idTmp. L'attribut name de l'input hidden ne sert à rien dans notre cas...

  10. #30
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Merci ça commence à fonctionner, maintenant il faut afficher les réponses (par rapport aux bonnes réponses) issues de la base de données dans les <textarea>.
    Pour ça, j'ai modifié la requête SQL en mettant une clause INNER JOIN.
    La voici :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT reponses.id_reponse,chapitres.id_chapitre, questions.id_question,titre_chapitre, contenu_question, contenu_chapitre, reponses.texte_reponse
    FROM reponses, chapitres
    LEFT JOIN questions
    ON chapitres.id_chapitre = questions.id_chapitre
    AND chapitres.id_cours='$id_cours_tp'
    WHERE chapitres.id_cours='$id_cours_tp'
    AND reponses.id_question=questions.id_question
    ORDER BY id_chapitre ASC
    .

    Cette requête SQL ne fait pas ce que je veux faire mais je sais pourquoi : c'est parce qu'il peut y avoir aucune réponse et du coup il s'arrête parce qu'il n'y a pas de correspondance entre les tables questions et reponses.

    Il faut tester pour chaque question affichée s'il y a ou non la réponse de l'utilisateur dans la base de données. Si oui, la réponse s'affiche dans le <textarea> correspondant. Sinon, le <textarea> s'affiche vide.
    De plus à mon avis il faut modifier la requête SQL pour sélectionner les réponses en continuant s'il y en n'a pas afin d'afficher l'intégralité du cours, non ?

    En pièce jointe, je te mets le fichier modifié.

    NB : J'ai essayé avec cette requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT(contenu_question),chapitres.id_chapitre, titre_chapitre, contenu_chapitre, questions.id_question, reponses.texte_reponse
    FROM reponses, chapitres
    LEFT JOIN questions
    ON chapitres.id_chapitre = questions.id_chapitre
    AND chapitres.id_cours='$id_cours_tp'
    WHERE chapitres.id_cours='$id_cours_tp'
    ORDER BY id_chapitre ASC
    Cette fois, le cours s'affiche dans son intégralité s'affiche mais il ne tient pas compte de l'identifiant de la question. Il rempli tous les <textarea> avec les mêmes réponses sans prendre en compte l'identifiant de la question.

    NB (2) : Les requêtes SQL d'insertion et de modification s'exécutent. Il ne manque plus qu'à régler le problème d'affichage des réponses par rapport à leurs questions respectives...

    NB (3) : J'ai modifié la requête SQL en mettant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT(contenu_question),reponses.texte_reponse,chapitres.id_chapitre,chapitres.titre_chapitre,chapitres.contenu_chapitre, questions.id_question
    FROM chapitres
    LEFT JOIN questions
    ON chapitres.id_chapitre = questions.id_chapitre
    LEFT JOIN reponses
    ON questions.id_question = reponses.id_question
    AND chapitres.id_cours='".$id_cours_tp."'
    WHERE chapitres.id_cours='".$id_cours_tp."'
    ORDER BY id_chapitre ASC

    Avec cette requête SQL, les réponses postées se mettent dans les <textarea>, ça c'est bon !

    Juste un truc : Comment faire pour que la balise <br /> ne s'affiche pas ? Le retour chariot s'effectue mais la balise s'affiche. J'ai essayé strip_tags et nl2br.
    Voici la partie : nl2br(utf8_decode(strip_tags(stripslashes(htmlspecialchars(html_entity_decode($row['texte_reponse'])))))).
    Le mieux serait de ne pas supprimer toutes les balises HTML mais de remplacer la balise <br /> par un retour à la ligne. Pour cela il faut utiliser preg_replace, non ?
    J'ai essayé avec nl2br(utf8_decode(stripslashes(htmlspecialchars(html_entity_decode(preg_replace('<br />','\n',$row['texte_reponse'])))))) mais il n'y a pas de changement (utilisation de preg_replace).
    J'ai supprimé strip_tags car je ne veux pas masquer toutes les balises HTML mais que la balise <br /> et la remplacer par un retour chariot tout en la masquant.

    Désormais j'aimerais qu'à la place de alert(reponse);, une image s'affiche à côté de chaque réponse (<textarea>) selon le cas.

    Voici le code d'avant :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (reponse=="0") document.getElementById("image" + id_cours_rep).innerHTML = "<img src=tp_en_attente.png align=left title='En attente de validation' />";
     
    if (reponse=="1") document.getElementById("image" + id_cours_rep).innerHTML = "<img src=en_travaux.png align=left title='Réponse incomplète' />";
     
    if (reponse=="4") document.getElementById("image" + id_cours_rep).innerHTML = "<img src=tp_validee.png align=left title='Réponse OK' />";
    Le mieux serait de faire ce test :
    - Si la réponse s'insère : afficher l'image "En attente de validation"
    - Si la réponse ne s'insère pas (pour une cause indéterminée !) : afficher l'image "En attente du serveur"
    Néanmoins j'aimerais qu'après la validation, une image s'affiche à côté de chaque <textarea> selon la réponse (si elle est considérée comme juste ou non).

    A noter : dans la table "reponses", j'ai ajouté un champs texte_reponse_attendue où j'insère la bonne réponse, la réponse attendue. Si l'utilisateur poste la même chose que la réponse attendue, la réponse n'aurait pas besoin d'être validée et l'icône "Réponse OK" s'afficherait sinon elle aurait besoin d'être validée et l'icône "En attente de validation" s'afficherait.
    Est-ce que c'est possible de faire ça ? Si oui, comment ? Ce serait le mieux.

    J'ai ajouté une requête SQL qui permet de comparer le champs "texte_reponse_attendue" à la réponse de l'utilisateur et j'ai fait un test pour savoir s'il y avait un enregistrement dans lequel il faut trouver un moyen pour afficher sur l'autre page l'icône "tp_validee.png" à côté de la réponse postée grâce à l'AJAX. Tu le verras, je l'ai mis en commentaire.

    Je te rappelle qu'après avoir terminé cette page, je ferai une autre qui permettra de soit valider soit invalider la réponse. C'est pour cela que sur le code ci-dessus, il y a trois cas.

    En ce qui concerne l'affichage de l'icône (à côté du bon <textarea> : En mettant
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (xhr.readyState == 4 && xhr.status == 200) {
     
                reponse = xhr.responseText;
    			document.getElementById("reponse").innerHTML = "<img src=tp_en_attente.png align=left title='En attente de validation'>";
     
    			//alert(reponse);
            }
    		else if (xhr.readyState == 0) {
    			document.getElementById("reponse").innerHTML = "<img src=progressbar.gif align=left title='En attente du serveur' width=24 />";
    		}
    dans la fonction javascript et en ajoutant <div id="reponse"></div>, l'icône s'affiche mais ne tient pas compte de l'identifiant de la question. Comment intégrer l'identifiant de la question ?

    En attendant mieux, j'ai réussi à faire afficher l'icône "En attente de validation" en mettant :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (xhr.readyState == 4 && xhr.status == 200) {
     
                reponse = xhr.responseText;
    			document.getElementById("image" + id_question).innerHTML = "<img src=tp_en_attente.png align=left title='En attente de validation'>";
     
    			//alert(reponse);
            }
    		else if (xhr.readyState == 0) {
    			document.getElementById("image" + id_question).innerHTML = "<img src=progressbar.gif align=left title='En attente du serveur' width=24 />";
    		}
    dans la fonction javascript et id="image'.$row['id_question'].'. En faisant ça, l'icône s'affiche lors de la validation par contre après fermeture et réouverture de la fenêtre, l'icône ne s'affiche plus. Il faudrait qu'elle reste affichée.

    En pièce jointe, tu trouveras les fichiers actualisés.

    Je mets le sujet en RESOLU parce que le principal et le plus important est réglé.

  11. #31
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Pas de PJ dans le post??

    dans la fonction javascript et en ajoutant <div id="reponse"></div>, l'icône s'affiche mais ne tient pas compte de l'identifiant de la question. Comment intégrer l'identifiant de la question ?
    j'ai pas compris le scénario exacte??

    En tout cas cool que ta page soit fonctionnelle, bon courage pour la suite

    ++

  12. #32
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Points : 74
    Points
    74
    Par défaut
    Je pense pouvoir régler ce problème après avoir développer la page de correction. En tout cas, merci pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/07/2016, 13h52
  2. Requête SQL Insert Into
    Par Requiem11 dans le forum JDBC
    Réponses: 3
    Dernier message: 15/01/2010, 11h32
  3. Problème de requête sql INSERT INTO
    Par momoh dans le forum VB.NET
    Réponses: 2
    Dernier message: 18/02/2009, 17h58
  4. Problème requête sql : INSERT INTO
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/08/2008, 11h43
  5. Requête SQL Insert Into
    Par jjg65 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 07/11/2007, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo