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

Langage PHP Discussion :

Créer un QCM sans BDD


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut Créer un QCM sans BDD
    Bonjour à vous tous

    Laissez moi me présenter avant que je ne vous enquiquine avec ma question de débutant
    Je suis étudiant à plein temps (journées de 7h-22h) et je suis occupé par mes cours la majeure partie de mon temps. Mais de temps à autres je me plonge dans mon ami Notepad++. J'ai des connaissances en html/css (autodidacte) mais j'avouerai que le php, je ne m'y connais que guère, c'est à peine si j'arrive à créer un formulaire de contact fonctionnel (ce qui est déjà pas mal pour moi ) Aussi je voulais m'initier dedans en créant un site (qui restera très certainement local si ça peut vous rassurer) avec comme base : des QCMs.

    Rassurez vous, mes questions ne portent en aucun cas sur des notions de membres/base de données (le langage sql et moi nous ne sommes pas très amis m'voyez )

    Pensez que je ne souhaite pas un code tout fait, sinon j'aurai demandé directement à un codeur de me le faire. J'aimerai que vous m'aiguillez, me donniez des pièces d'un puzzle que je construirait et dont je posterai l'avancée ici.

    Voilà mon projet (appelez ça brouillon des charges si vous le souhaitez ^^) :
    Je souhaite, sur une page qui servira de menu, pouvoir permettre à un utilisateur de s'entrainer via qcm sur des cours classés par matière.
    En gros : choix matière -> choix cours.
    A partir de là une fenetre (ou une lightbox javascript) s'ouvrirait avec une suite de 10 QCMs tirés au hasard parmi une liste préexistante. Ce que je souhaiterai, afin d'éviter l'usage d'une BDD (les futurs/nouveaux QCMs étant entrés par des personnes non compétentes en langage informatique), tirés parmi une liste de fichiers .txt ou .php qui contiendraient les informations des QCMs sous forme de variables. De plus, certains QCMs étant des QCS (choix simple) ou alors les propositions étant inverses (cochez les réponses fausses et non les vraies), j'aimerai que les fichiers le précisent.

    Visuellement parlant, la fenetre (ou ligntbox) afficherait ceci :
    Année : 2013, item 23 : variables $annee et $item
    Ennoncé : blablablabla $ennonce
    Indiquez la ou les reponses correctes : $qcs=false; $inverse=false
    OU Indiquez la réponse fausse : $qcs=true; $inverse=true
    OU Indiquez la ou les réponses fausses : $qcs=false; $inverse=true
    OU Indiquez la réponse vraie : $qcs=true; $inverse=false

    1 : proposition 1 $prop1
    etc

    [Valider] (bouton pour passer au qcm suivant)

    Et encore plus visuellement (j'ai codé un petit html css histoire de faire joli :
    Les choix étant fait toujours avec des boutons radio mais c'est du détail
    Je voudrais donc qu'il y ait 10 QCMs à la suite ainsi, une fois arrivé au dernier QCM je souhaiterai que l'on affiche les résultats dans un tableau (les réponses étant enregistrées dans une session je suppose) et qu'à partir de là on puisse faire une note de la personne qui a répondu (avec par exemple une notation du type :
    -si tout bon, alors : 1 point
    -si une erreur, genre correction : 134, mais la personne a coché 13 ou 14 ou 1234 ou 1235 par exemple, alors 0,5 points
    -si deux erreurs, correction : 134, reponses : 1, 3, 12345 par exemple alors 0,1 point par exemple
    -si plus de 2 erreurs alors 0 points
    -si plus de 1 case cochée alors que QCS (donc si plus de une propositions cochées alors que le fichier précise $qcs=true, donc 0 points dans tous les cas
    -si pas de case cochée, 0 points
    etc etc, une fois que j'aurai compris le truc je pourrais m'amuser avec des notations farfelues :p
    Après rassembler la note sous forme de variable pour que je puisse jouer avec (par exemple, dans le futur, la sauvegarder dans une BDD pour ensuite faire des stats, graphiques ou autres) ou simplement afficher la note :p
    De plus, un complément de correction serait affiché genre :
    Année : 2013, item 23 : variables $annee et $item
    Ennoncé : blablablabla $ennonce
    Indiquez la ou les reponses correctes : $qcs=false; $inverse=false

    1 : faux car bla bla bla, le texte étant conservé dans $rep1 par exemple.
    2 : etc etc etc
    ---------------------------------
    Année : 20XX, item XX : variables $annee et $item
    Ennoncé : blablablabla $ennonce
    Indiquez la ou les reponses fausses : $qcs=false; $inverse=true

    1 : faux car bla bla bla, le texte étant conservé dans $rep1 par exemple.
    2 : etc etc etc
    Evidemment, les 2 variables $annee correspondraient à celles de 2 fichiers distincts (genre qcm1.txt et qcm12.txt comme ils sont tirés au hasard)

    En parlant de ces fichiers, j'imaginais une suite de variables genre :
    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
    $annee=;
    $item='';
     
    $ennonce='';
    $image_url=''; <<<- ici je mettrai un lien direct vers une illustration optionnelle qui accompagnera l énnoncé, si elle est absente, ce sera un pixel transparent.
     
    $qcs=true;
    $inverse=false;
     
    $prop1='';
    $prop2='';
    $prop3='';
    $prop4='';
    $prop5='';
     
    $rep1='';
    $rep2='';
    $rep3='';
    $rep4='';
    $rep5='';
    Mais évidemment, un script php serait tout aussi possible.
    (Du coup la page de qcm ne chargerait que les scripts de qcms et conserverait les réponses pour la fin quelque part, ce qui pourrait être plus pratique).

    Bref, est ce que je vous ai perdu ? Si non, pensez vous que ce serait réalisable et si oui, seriez vous prêts à m'aider pour réussir ce projet (mon niveau en php étant novice et n'ayant pas trop de temps pour ça j'aimerai que vous me machiez en partie le travail, que je puisse apprendre sur des bases).
    Mon objectif, au terme de codage de 30 à 60 min par jour, est de pouvoir décortiquer le code final pour comprendre les mécaniques du php, et la difficulté qu'est de retirer l'usage de BDD pourrait être assez interessant

    Du coup, pour commencer je peux oubier la nouvelle fenêtre ou la lightbox et me contenter d'une page blanche sans mise en forme ^^
    Par quoi dois-je commencer ?

    Amicalement,
    Alem180

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Bref, est ce que je vous ai perdu ?
    oui

    Par quoi dois-je commencer ?
    Par définir sous que lformat seront stocker tes QCM. Il faut utiliser un format structuré de données , sinon il sera quasi impossible de le relire en PHP et/ou javascript.

    En gros et dans mon ordre de préférence tu as le choix entre des fichier au format :
    Par exemple avec un fichier qcm.json comme celui ci :

    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
    {
    	"titre":"monQCm",
    	"questions":[{
    		"question":"Ca va ?",
    		"reponses":[
    			"Oui","Non","Bof"
    		],
    		"solution":1
    	},
    	{
    		"question":"Q2",
    		"reponses":[
    			"R1","R2","R3"
    		],
    		"solution":0
    	}]
    }
    Tu peux très simplement te retrouver avec un tableau PHP à exploiter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $datasJSON = file_get_contents('qcm.json');
    $datasQCM = json_decode($datasJSON);
    var_dump($datasQCM);
    Quoi qu'il en soit tu devras travailler avec des fichiers pour remplacer la base de données que tu ne souhaite pas utiliser.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour (enfin, bonsoir si on se place de mon point de vue :p )

    Je me suis renseigné sur le langage json et je pense arriver à m'en servir, en tout cas pour ce que j'ai envie de faire
    Non sans galère (des virgules qui trainaient, des accents qui sont restés dans le code...), je me retrouvais systématiquement avec comme réponse : null, un peu comme mon niveau en somme :p
    Finalement, j'ai réussi à faire un .json fonctionnel (à peu près à la 30ieme tentative quoi) qui, une fois décodé par le php me montre un zouli :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    object(stdClass)[1]
      public 'QCM2' => 
        object(stdClass)[2]
          public 'annee' => int 2024
          public 'item' => int 25
          public 'enonce' => string 'Enonce de l'item 25 de 2024, attention c'est un QCM' (length=51)
          public 'qcs' => boolean false
          public 'propostions' => 
            array (size=5)
              0 => 
                object(stdClass)[3]
                  ...
              1 => 
                object(stdClass)[4]
                  ...
              2 => 
                object(stdClass)[5]
                  ...
              3 => 
                object(stdClass)[6]
                  ...
              4 => 
                object(stdClass)[7]
                  ...
          public 'complement' => 
            array (size=5)
              0 => 
                object(stdClass)[8]
                  ...
              1 => 
                object(stdClass)[9]
                  ...
              2 => 
                object(stdClass)[10]
                  ...
              3 => 
                object(stdClass)[11]
                  ...
              4 => 
                object(stdClass)[12]
                  ...
    Je suppose que je vais devoir me débarrasser des " ' " ? à ce propos, comment puis-je inclure ces caractères (tout comme les é à è ç...) sans tout casser dans le code ? (sans passer obligatoirement par les &eacute etc je veux dire, je n'ai pas tres bien compris le passage en utf8 comme j'ai lu par ci par là)

    Au début j'ai entré plusieurs exemples de qcms dans le même fichier, mais je me suis rendu compte que ça pèserait trop lourd pour un seul fichier (pour s'y retrouver une fois une liste de 100-150 qcms ca aurait été moyen quoi).
    Pour y remédier, j'ai fait un qcm par fichier (dans mon cas de test : 3 qcms pour tester) et j'ai adapté le code php que vous m'avez très gentillement offert afin de ne choisir qu'un fichier json au hasard parmi les 3 (ce qui marcge très bien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php 
    $qcms = Array('qcm1.json','qcm2.json','qcm3.json');
    $dataJSON = file_get_contents($qcms[array_rand($qcms)]);
    $dataQCM = json_decode($dataJSON);
    var_dump($dataQCM);
    ?>
    Et le contenu de mes json pour le moment (ils ont un contenu générique) :
    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
    24
    25
    26
    27
    {
    	"QCM1" : {
    		"annee" : 2024,
    		"item" : 24,
    		"enonce" : "Enonce de l'item 24 de 2024, attention c'est un QCS",
    		"qcs" : true,
    		"propostions" : [
    			{"A" : "Exemple de proposition fausse", 
    			"vraie" :false},
    			{"B" : "Exemple de proposition fausse", 
    			"vraie" :false},
    			{"C" : "Exemple de proposition vraie", 
    			"vraie" :true},
    			{"D" : "Exemple de proposition fausse", 
    			"vraie" :false},
    			{"E" : "Exemple de proposition fausse", 
    			"vraie" :false}
    		],
    		"complement" : [
    			{"A" : "Explication de la proposition A"},
    			{"B" : "Explication de la proposition B"},
    			{"C" : "Explication de la proposition C"},
    			{"D" : "Explication de la proposition D"},
    			{"E" : "Explication de la proposition E"}
    		]
    	}
    }
    Je ne suis cependant pas certain d'avoir opté pour l'architecture la plus adaptée mais je vous laisse en juger, c'est mon premier json tout de même .

    Maintenant j'ai une grosse question à ce niveau :
    J'ai ajouté une notion d'aléatoire au code afin de ne choisir que un fichier json parmi les trois. Mais dés que j'ai essayé d'en choisir plusieurs, j'ai échoué, j'ai tenté ceci en ligne 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dataJSON = file_get_contents($qcms[array_rand($qcms, 2)]);
    (pour en choisir 2)
    Mais j'ai l'erreur : Warning: Illegal offset type in C:\wamp\www\site_QCM\tests_php\QCM.php on line 8
    ainsi que : Warning: file_get_contents(): Filename cannot be empty in C:\wamp\www\site_QCM\tests_php\QCM.php on line 8
    Pourtant j'ai suivi ceci : http://php.net/manual/fr/function.array-rand.php (précisément le premier exemple) mais ca ne marche pas qu'est-ce que j'ai fait de mal ? De même, même si j'essaye ensuite de décoder chaque json l'un apres l'autre (apres avoir fait la modif précédente), ca ne marche pas :s

    Voilà pour aujourd'hui. Que me conseillez vous de faire ? Restructurer les json ou passer à une étape suivante (car j'avoue être dans le flou maintenant )

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dataJSON = file_get_contents($qcms[array_rand($qcms)]);
    Mais pour des raisons de lisibilité et de facilité de debugage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $randkey = array_rand($qcms);
    $file = $qcms[$randkey];
    $dataJSON = file_get_contents($file);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    C'est noté, merci pour l'info

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Bonjour,

    Je ne suis pas sur de la structure de tes json
    il faut un tableau pour chaque question, ici je ne vois pas cette structure

    Donc je vais te proposer a titre d'exemple ceci :

    Code json : 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
    {
        "reference": 2013,
        "titre": "titre",
        "present": "texte de présentation",
        "count": 24,
        "questions": [
            {
                "Enonce": "Enoncé 1 de l'item",
                "image": "",
                "time": 60,
                "points": 1,
                "propositions": {
                    "A": {
                        "label": "Exemple a",
                        "complement": "complement",
                        "resultat": false
                    },
                    "B": {
                        "label": "Exemple b",
                        "complement": "complement",
                        "resultat": true
                    }
                }
            },
            {
                "Enonce": "Enoncé 2 de l'item",
                "image": "",
                "propositions": {
                    "A": {
                        "label": "Exemple a",
                        "complement": "complement",
                        "resultat": false
                    },
                    "B": {
                        "label": "Exemple b",
                        "complement": "complement",
                        "resultat": true
                    }
                }
            }
        ]
    }
    Pour les accents, il est plus simple de ne faire que des fichiers en utf8. comme cela pas de &eacute;

    Pour valider le json j'utilise un site en ligne : http://jsonlint.com/ il me fait toutes les bonnes tabulation automatiquement
    $moi= ( !== ) ? : ;

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Maintenant que je vous ton exemple, cela me semble bien plus clair, en tout cas pour le json, vous êtes vraiment sympas de m'aider les gars

    Alors, si je me base sur ta structure, j'ai, en générique, ceci :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    {
    	"QCM_2024_42" : {
    		"annee" : 2024,
    		"item (ou "question_no" par exemple)" : 42,
    		"enonce" : "Enonce de l'item 42 de 2024",
    		"image_enonnce" : "images/QCM_2024_42.png (exemple)",
    		"qcs" : true,
    		"propostions" : {
    			"A": {
    				"label": "Exemple de proposition fausse",
    				"complement": "Explication de cette proposition",
    				"resultat": false
    			},
    			"B": {
    				"label": "Exemple de proposition fausse",
    				"complement": "Explication de cette proposition",
    				"resultat": false
    			},
    			"C": {
    				"label": "Exemple de proposition vraie",
    				"complement": "Explication de cette proposition",
    				"resultat": true
    			},
    			"D": {
    				"label": "Exemple de proposition fausse",
    				"complement": "Explication de cette proposition",
    				"resultat": false
    			},
    			"E": {
    				"label": "Exemple de proposition vraie",
    				"complement": "Explication de cette proposition",
    				"resultat": true
    			}
    		}
    	}
    }
    Alors, dans ce code, j'ai réutilisé "label" simplement car je n'avais pas d'autre idée, non pas que je veuille te voler ce terme ahah.
    Avec l'autre code j'étais passé par un raisonnement trop humain si je comprend bien, au lieu de tout regrouper par propositions j'avais fait les questions, puis les réponses, j'ai compris mon erreur

    Par contre, une chose m'intrigue, vous êtes deux à me proposer, à titre d'exemple, plusieurs items par fichier, mais est-ce que je peux faire un fichier par item (en gros, le code ci dessus = 1 fichier json, un autre qcm = un autre json) ?
    Parce que selon mon raisonnement (qui m'a fait défaut précédemment pour vous dire :p), le php pourrait piocher des fichiers de qcms de manière aléatoire (ce que j'ai tenté de reproduire à la va vite précédemment) au lieu de fouiller dans un gros fichier avec tous les qcms. Cela dans un but de faciliter l'ajout-retrait-mise a jour de qcms par une personne.

    Oh, et si vous ne suivez pas trop mon vocabulaire : item = qcm indépendant de tout autre qcm (la fac et son vocabulaire me direz vous :p ).

    Concernant jsonlint, je m'en servirai, mais j'aime mes tabulations avec le bouton tab et non la touche espace, histoire de goût sans doute

    Edit : Autre chose, je dois être abominable, mais dés qu'un caractère type é, à, è etc est présent dans le json, comme seul message, je recoit "null", pourtant si je tape quelque chose dans le php, ces caractères sont bien affichés :/

    Amicalement,

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Citation Envoyé par Alem180 Voir le message
    Par contre, une chose m'intrigue, vous êtes deux à me proposer, à titre d'exemple, plusieurs items par fichier, mais est-ce que je peux faire un fichier par item (en gros, le code ci dessus = 1 fichier json, un autre qcm = un autre json) ?
    Et oui, pour nous 1 qcm est sur php, autre sur francais, autre sur html ...
    Dans chaque fichier(qcm) ont met en vrac 50..100 questions.
    Php lui charge le fichier entier puis prend aléatoirement 20 questions, c'est pourquoi j'avais mis les questions en tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $question =$json->questions[5];
    ...
    $question =$json->questions[22];

    Citation Envoyé par Alem180 Voir le message
    au lieu de fouiller dans un gros fichier avec tous les qcms. Cela dans un but de faciliter l'ajout-retrait-mise a jour de qcms par une personne.
    En tant que programmeur, on fait une interface pour les mises à jour du qcm donc 1 question ou 100 dans un même fichier bof.


    Citation Envoyé par Alem180 Voir le message
    dés qu'un caractère type é, à, è etc est présent dans le json, comme seul message, je recoit "null"
    null ou ca ? comment tu affiches le json ?

    il faut faire par exemple(dépend de la structure du json!) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $qcm= json_decode( file_get_contents($file) );
    // echo '<pre>'.print_r($qcm,true).'</pre>';
    echo '<h3>'.$qcm['titre'].'</h3>';
     
    $question= $qcm->questions[44];
    echo '<p>'.$question['enonce'] .'</p>'.
        '<ul>';
       '<li><checkbox />A ' . $question['propositions']['A']['label'].'</li>'.
       '<li><checkbox />B ' . $question['propositions']['B']['label'].'</li>'.
        '</ul>';
    $moi= ( !== ) ? : ;

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Et oui, pour nous 1 qcm est sur php, autre sur francais, autre sur html ...
    Dans chaque fichier(qcm) ont met en vrac 50..100 questions.
    Php lui charge le fichier entier puis prend aléatoirement 20 questions, c'est pourquoi j'avais mis les questions en tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $question =$json->questions[5];
    ...
    $question =$json->questions[22];
    D'accord j'ai compris

    Citation Envoyé par papajoker Voir le message
    En tant que programmeur, on fait une interface pour les mises à jour du qcm donc 1 question ou 100 dans un même fichier bof.
    En effet, si on passe par une interface ça me semble bien plus simple comme ça, moi qui ne voyait que des difficultés (m'enfin bon, je ne me rejouis pas trop non plus :^)

    Citation Envoyé par papajoker Voir le message
    null ou ca ? comment tu affiches le json ?

    il faut faire par exemple(dépend de la structure du json!) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $qcm= json_decode( file_get_contents($file) );
    // echo '<pre>'.print_r($qcm,true).'</pre>';
    echo '<h3>'.$qcm['titre'].'</h3>';
     
    $question= $qcm->questions[44];
    echo '<p>'.$question['enonce'] .'</p>'.
        '<ul>';
       '<li><checkbox />A ' . $question['propositions']['A']['label'].'</li>'.
       '<li><checkbox />B ' . $question['propositions']['B']['label'].'</li>'.
        '</ul>';
    Je rectifie, le null ne se produit plus, il y avait un soucis dans l'encodage du json (ainsi pour je ne sais quelle saison). Maintenant c'est réglé, il n'y a plus de soucis là dessus
    Pour répondre à la question de comment j'affiche mon json, j'utilise, dans une page vierge le php ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    include("decodeJSON.php");
    //include("printJSON.php");
    include("entete.php");
    include("enonce.php");
    include("choix.php")
    ?>
    où decodeJSON contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
    //$qcms = Array('QCM.json',);
     
    //$randkey = array_rand($qcms);
    //$file = $qcms[$randkey];
    //$dataJSON = file_get_contents($file);			// Si aléa parmi plusieurs fichiers
    $dataJSON = file_get_contents('QCM.json');		// Seulement si on ne prend que 1 fichier
    $dataQCM = json_decode($dataJSON,true);
    ?>
    entete contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    echo (
    '<p>Item '.
    $dataQCM['QCM1']['item'].
    ' de l\'année '.
    $dataQCM['QCM1']['annee'].
    '.</p>'
    );
    ?>
    printJSON contient basiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo '<pre>'.print_r($dataQCM,true).'</pre>';
    ?>
    C'est ce dernier qui me sert le plus pour voir l'architecture générale
    enonce contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    echo (
    $dataQCM['QCM1']['enonce'].
    '<br><img src=\''.
    $dataQCM['QCM1']['image_enonce'].
    '\'>'
    );
    ?>
    choix contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    echo (
    '<form>'.
    '<input type="checkbox" name="A" id="A" />
    <label for="'.$dataQCM['QCM1']['propositions']['A']['label'].'">'.
    $dataQCM['QCM1']['propositions']['A']['label'].
    '</label><br />'.
    '<input type="checkbox" name="B" id="B" />
    <label for="'.$dataQCM['QCM1']['propositions']['B']['label'].'">'.
    $dataQCM['QCM1']['propositions']['B']['label'].
    '</label><br />'.
    '</form>'
    );
    ?>
    Ces fractions de codes ne sont que temporaires, juste que je n'aime pas me mélanger les pinceaux en affichant des variables à l'aide d'un echo, surtout si je débute ^^ (et je sais que choix est horriblement codé, que c'est le plus incorrect des codes mais je l'ai fait uniquement pour remplir la page ^^)

    Est-ce que j'en ai fini avec l'architecture du JSON ? Si oui, que devrais-je faire ensuite ? Si non, où est ce que j'ai fait une erreur ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour, voilà où j'en suis :
    J'utilise toujours le meme php pour lire le JSON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $dataJSON = file_get_contents('QCM.json');	// Si on ne prend que 1 fichier, sinon : $qcms = Array('QCM.json'); $randkey = array_rand($qcms); $file = $qcms[$randkey]; $dataJSON = file_get_contents($file);
    $dataQCM = json_decode($dataJSON,true);		// $dataQCM est simplement un tableau php brut traduisant le JSON
    ?>
    J'ai aussi ajouté une ligne pour mélanger les tables du json (afin d'avoir un peu d'aléatoire dans le choix des questions) et je choisis X tables dans la liste aléatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    shuffle($dataQCM);									//On mélange les QCMs du JSON
    $dataQCM_select = array_slice ($dataQCM,1,4)		// Dans ($dataQCM,X,Y), on séléctionne les [Y] colonnes qui se suivent à partir de la [X]ième.
    ?>
    Ensuite, avec ces valeurs, je génère un formulaire (jusque là tout va bien) :
    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
    24
    Item <?php echo $dataQCM_select[0]['item'] ?> de l'année <?php echo $dataQCM_select[0]['annee']?>.<br>
    <?php echo $dataQCM_select[0]['enonce'];
    	if ($dataQCM_select[0]['qcs'] == false)
    		{ echo '<br>Cochez la ou les propositions exactes.<br>'; }
    	else
    		{ echo '<br>Cochez <b>LA</b> proposition exacte.<br>'; }?>
    <?php if (empty($dataQCM_select[0]['image_enonce']))
    	{ echo ''; }
    else
    	{ echo '<img src=\''.$dataQCM_select[0]['image_enonce'].'\' alt=\'\'>'; }?>
    <hr>
    <form method="post" action="verif.php">
    	<input type="checkbox" name="Option1" value="<?php echo $dataQCM_select[0]['propositions']['option1']['resultat'] ?>" /> 
    		<?php echo $dataQCM_select[0]['propositions']['option1']['label'] ?><br>
    	<input type="checkbox" name="Option2" value="<?php echo $dataQCM_select[0]['propositions']['option2']['resultat'] ?>" /> 
    		<?php echo $dataQCM_select[0]['propositions']['option2']['label'] ?><br>
    	<input type="checkbox" name="Option3" value="<?php echo $dataQCM_select[0]['propositions']['option3']['resultat'] ?>" /> 
    		<?php echo $dataQCM_select[0]['propositions']['option3']['label'] ?><br>
    	<input type="checkbox" name="Option4" value="<?php echo $dataQCM_select[0]['propositions']['option4']['resultat'] ?>" /> 
    		<?php echo $dataQCM_select[0]['propositions']['option4']['label'] ?><br>
    	<input type="checkbox" name="Option5" value="<?php echo $dataQCM_select[0]['propositions']['option5']['resultat'] ?>" /> 
    		<?php echo $dataQCM_select[0]['propositions']['option5']['label'] ?><br>
    	<input type="submit" value="Question suivante">
    </form>
    J'avais un petit peu modifié mon JSON aussi mais ce ne sont que des noms qui changent bref

    Mon problème maintenant, c'est que j'arrive à afficher 1 QCM sur ma page : http://i.imgur.com/2HPUmt4.png
    Ce que je souhaiterai, c'est que lorsque l'on clique sur "question suivante", on enregistre les propositions de l'utilisateur (variables je présume ?) et que l'on affiche, sur la meme page, un autre QCM jusqu'à ce que l'on arrive au bout des X qcms choisis et que à la fin seulement, on affiche, toujours dans la même page, les résultats avec les compléments de réponse etc.

    Vous croyez que c'est possible ? Je souhaiterai éviter le plus possible d'afficher juste une liste de QCMs a répondre à la suite mais plutot quelque chose de dynamique vous voyez ?

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Bonjour,
    'on affiche, sur la meme page,
    Tu ne désires pas de l'ajax ? ici, ce n'est pas vraiment pertinent puisque tout le contenu de ta page change. Si tu désires du dynamique ? quoi ?

    Pistes (2..3 sur 50) pour continuer

    Il faut lorsque tu choisis une question que tu sauvegardes le numéro de la question.
    dans le form tu l'ajoutes en caché
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="hidden" name="numeroQuestion" value="44">
    <input type="hidden" name="qcm" value="QCM.json">
    pour les checkbox, tu dois passer un name du type :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="checkbox" name="Option['A']">
    <input type="checkbox" name="Option['B']">

    dans la page verif.php (aucun affichage sauf debug)
    1) tu charges encore le fichier json
    2) tu recupere la question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $no = $_POST['numeroQuestion'];
    tu recupere reponses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse= $qcm[ $no ] ['reponse'];
    tu vérifies avec $_POST['Option']['A'].. B ..
    tu enregistres le score (et no de question) en session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $_SESSION['score']= (int)$_SESSION['score']+1;
    tu retournes a la page précédente qcm.php

    dans page precedente
    tu recharges qcm et tu recharges autre question (pas la même!)
    et rebelote
    $moi= ( !== ) ? : ;

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour

    Je ne répond que tard car j'avais des concours blancs à ma faculté (le travail avant la passion).

    Voilà où j'en suis, j'ai un code fonctionnel et je n'aurai surement jamais réussi à y arriver sans l'aide des membres de ce forum
    Je ne m'occupe pour le moment pas du coté traitement des informations (j'entend par là calcul des points, affichage des complements de réponse en fin d'épreuve etc).
    Voici mon code actuel (je vous épargne le JSON qui n'a pas bougé)

    index.php (pour ouvrir une fenêtre indépendante via javascript)
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!doctype html>
    <html>
    <head>
    	<title>Page index</title>
    	<meta charset="utf-8" />
    </head>
    <body>
    <h1>hello werld, it's all about a test</h1><hr>
    <a href="javascript:void(0)"; onClick="window.open('initialisation.php','_blank','menubar=no,location=no,directories=no,status=no,copyhistory=no,height=500,width=400,toolbar=no,scrollbars=yes,resizable=yes');">
    Cliquez ici pour commencer.
    </a>
    </body>
    </html>

    initialisation.php (pour décoder le json et faire tous les préparatifs)
    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
    24
    25
    26
    27
    28
    29
    30
    31
    <!doctype html>
    <html>
    <head>
    	<title>initialisation du QCM</title>
    	<meta charset="utf-8" />
    </head>
    <body>
    <?php
    //On récupère les données du JSON.
    $dataJSON = file_get_contents('QCM.json');	// Si on ne prend que 1 fichier, sinon : $qcms = Array('QCM.json'); $randkey = array_rand($qcms); $file = $qcms[$randkey]; $dataJSON = file_get_contents($file);
    $dataQCM = json_decode($dataJSON,true);		// $dataQCM est simplement un tableau php brut traduisant le JSON
    //On les mélange.
    shuffle($dataQCM);										//On mélange les QCMs du JSON, $dataQCM_random est un tableau php mélangé
    $dataQCM_rand = $dataQCM;
    $dataQCM_select = array_slice ($dataQCM_rand,0,4);		// Dans ($dataQCM,X,Y), on séléctionne les [Y] colonnes qui se suivent à partir de la [X]ième.
    //On créé une nouvelle session.
    if ( isset( $_SESSION) == true) {session_destroy ();}
    session_start();
    //On enregistre dans cette session session les arrays des questions.
    $_SESSION['question_1'] = $dataQCM_select[0];
    $_SESSION['question_2'] = $dataQCM_select[1];
    $_SESSION['question_3'] = $dataQCM_select[2];
    $_SESSION['question_4'] = $dataQCM_select[3];
    //On définit l'avancement à 1 et on s'assure que la fin de l'epreuve ne soit pas en cours.
    $_SESSION['avancement'] = 1;
    $_SESSION['fin'] = false;
    //On redirige vers les questions.
    header("Location: QCM.php");
    ?>
    </body>
    </html>
    QCM.php (que j'ai condensé au maximum)
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php session_start(); ?>
    <!doctype html>
    <html>
    <head>
    	<title>Epreuve QCM</title>
    	<meta charset="utf-8" />
    </head>
    <body>
    <form method="post" action="verif.php">
    <?php
    //On rédige l'énoncé.
    echo 'Item '.$_SESSION['question_'.$_SESSION['avancement']]['item'].' de l\'année '.$_SESSION['question_'.$_SESSION['avancement']]['annee'].'.<br>';
    echo $_SESSION['question_'.$_SESSION['avancement']]['enonce'];
    	//On fait d'autres if, je ne sais pas si c'est bien.
    	if ($_SESSION['question_'.$_SESSION['avancement']]['qcs'] == false)
    		{ echo '<br>Cochez la ou les propositions exactes.<br>'; }
    		else
    		{ echo '<br>Cochez <b>LA</b> proposition exacte.<br>'; }
    	//On vérifie s'il y a une image dans l'énoncé.
    	if (empty($_SESSION['question_'.$_SESSION['avancement']]['image_enonce']))
    		{ echo ''; }
    		else
    		{ echo '<img src=\''.$_SESSION['question_'.$_SESSION['avancement']]['image_enonce'].'\' alt=\'\'><br>'; }
    //C'est parti pour les propositions.
    echo 'A<input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option1']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option1']['label'].'<br>';
    echo 'B<input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option2']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option2']['label'].'<br>';
    echo 'C<input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option3']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option3']['label'].'<br>';
    echo 'D<input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option4']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option4']['label'].'<br>';
    echo 'E<input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option5']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option5']['label'].'<br>';
    echo '<input type="hidden" name="qcs" value="'.$_SESSION['question_'.$_SESSION['avancement']]['qcs'].'">';
    if ($_SESSION['avancement'] == 4) {$_SESSION['fin'] = true;}
    ?>
    <input type="submit" value="<?php if ($_SESSION['avancement'] < 4) {echo 'Question suivante';} else {echo 'Fin de l\'examen';} ?>">
    </body>
    </html>
    verif.php (qui affiche des infos pour le debug le plus souvent)
    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
    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
    <?php session_start(); ?>
    <!doctype html>
    <html>
    <head>
    	<title>Verification</title>
    	<meta charset="utf-8" />
    </head>
    <body>
    Cette page n'est affichée que pour servir à débugger le code.<hr>
    <?php
    //Ici on assigne les valeurs 0 et 1 en fonction de si oui ou non la case est cochée.
    if (isset( $_POST[1]))		//Si la case est cochée, il existe une valeur 'on' dans $_POST.
    	{$_POST[1] = 1;}		//On change le 'on' en 1 pour simplifiet le code.
    	else {$_POST[1] = 0;}	//On assigne 0 si la variable n'existe pas.
     
    if (isset( $_POST[2]))
    	{$_POST[2] = 1;}
    	else {$_POST[2] = 0;}
     
    if (isset( $_POST[3]))
    	{$_POST[3] = 1;}
    	else {$_POST[3] = 0;}
     
    if (isset( $_POST[4]))
    	{$_POST[4] = 1;}
    	else {$_POST[4] = 0;}
     
    if (isset( $_POST[5]))
    	{$_POST[5] = 1;}
    	else {$_POST[5] = 0;}
     
    //On s'occupera ici du traitement des points etc.
    if ( $_POST[1] == $_SESSION['question_'.$_SESSION['avancement']]['propositions']['option1']['resultat'])
    	{ echo 'a coche correct<br>'; }
    if ( $_POST[2] == $_SESSION['question_'.$_SESSION['avancement']]['propositions']['option2']['resultat'])
    	{ echo 'b coche correct<br>'; }
    if ( $_POST[3] == $_SESSION['question_'.$_SESSION['avancement']]['propositions']['option3']['resultat'])
    	{ echo 'c coche correct<br>'; }
    if ( $_POST[4] == $_SESSION['question_'.$_SESSION['avancement']]['propositions']['option4']['resultat'])
    	{ echo 'd coche correct<br>'; }
    if ( $_POST[5] == $_SESSION['question_'.$_SESSION['avancement']]['propositions']['option5']['resultat'])
    	{ echo 'e coche correct<br>'; }
    //Tant que des questions sont en attentes, on redirige vers elles et on "avance" de 1.
    if ($_SESSION['fin'] == false)
    	{$_SESSION['avancement'] = $_SESSION['avancement'] + 1;
    	echo '<a href="QCM.php">question suivante</a>';
    	}
    //Sinon on termine.
    elseif ($_SESSION['fin'] == true)
    	{
    //On ne fait aucun traitement des données pour l'instant...
    echo 'fini <br>';
    echo '<a href="javascript:void(0)" OnClick="javascript:window.close()">fermer la fenêtre</a>';
    }
    ?>
    </body>
    </html>
    A ce niveau j'ai une question et une faveur à demander (rassurez vous, ce n'est pas quelque chose d'énorme)
    Question : est-ce que j'ai le "droit" de combiner des arrays (je sais pas trop si je dis correctement. En gros :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Si l'avancement est égal à 3 on a ceci :
    echo 'A <input type="checkbox" name="'.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option1']['numero'].'" /> '.$_SESSION['question_'.$_SESSION['avancement']]['propositions']['option1']['label'].'<br>';
    //Au lieu d'un if (avancement = 3) alors 
    echo 'A<input type="checkbox" name="'.$_SESSION['question_3']['propositions']['option1']['numero'].'" /> '.$_SESSION['question_3']['propositions']['option1']['label'].'<br>';
    Et ma faveur : est ce que quelqu'un pourrait me dire si mon code est correct ? (ça fait très question pour le coup 'avoue mais bon).

    Voilà , encore merci à vous

    PS : je précise que j'ai essayé en vain la technique ci dessus, alors j'en ai essaye une 3eme sur les possibles

  13. #13
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Août 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Pour valider le json j'utilise un site en ligne : JSON Parser

Discussions similaires

  1. Créer un mail sans composants
    Par [Silk] dans le forum Composants VCL
    Réponses: 7
    Dernier message: 12/09/2005, 17h07
  2. Créer un buffer sans connaitre la taille?
    Par barucca dans le forum C++
    Réponses: 11
    Dernier message: 28/04/2005, 20h56
  3. [VB-CR] Utilisation sans BDD ?
    Par myriam007 dans le forum SDK
    Réponses: 3
    Dernier message: 11/02/2004, 10h07
  4. [][Timer] Créer un Timer sans utiliser le composant
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2003, 11h04

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