[PHP] quiz antwoord per categorie optellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Ik ben bezig een quiz aan het ontwikkelen. Het bestaat uit 20 vragen, 4 categorieen elk 4 vragen. De vragen moeten willekeurig worden gepresenteerd en het antwoord zijn radio buttons van 5 keuzes.

Bij submit moeten de punten worden opgeteld per categorie. Dus b.v. categorie A was vraag 3, 5, 8 en 9. Die antwoorden moeten samen opgeteld worden.

Ik heb het formulier al werkend. code: http://pastebin.com/gJ3npVjn
pagina: http://storagenine.com/leerstijlen/

Alleen zit ik met de vraag van hoe kan ik door de antwoorden sorteren en per categorie optellen? In de database staan de vragen gekoppeld aan hun categorie

vraag
------------------------
q_id
question
cat_id

categorie
------------------------
cat_id
categorie_naam


Iemand een idee?

[ Voor 13% gewijzigd door Ms_Hyde op 22-05-2014 11:49 ]

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Relevante code posten we hier op GoT in de topics zelf, niet op pastebin. ;)

Je zou gewoon met arrays kunnen werken. $antwoorden[$categorienummer][$vraagnummer] = $antwoordcode ofzo. Daarna is het een gevalletje van een dubbele foreach bij het afdrukken. Lijkt me niet zo complex? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Bedankt. Mijn PHP is roestig, ik doe meestal front-end. Kan je een voorbeeld geven van de foreach? Daar loop ik vast.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • Iooryz
  • Registratie: November 2010
  • Laatst online: 09-06 11:29

Iooryz

iooryz

Ms_Hyde schreef op donderdag 22 mei 2014 @ 11:47:
Ik ben bezig een quiz aan het ontwikkelen. Het bestaat uit 20 vragen, 4 categorieen elk 4 vragen. De vragen moeten willekeurig worden gepresenteerd en het antwoord zijn radio buttons van 5 keuzes.
Niet dat het heel veel uitmaakt voor je code waarschijnlijk, maar 4 categoriëen met elk 4 vragen maakt 16 vragen en geen 20. ;)

Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 10-09 20:43
Iooryz schreef op donderdag 22 mei 2014 @ 15:08:
[...]


Niet dat het heel veel uitmaakt voor je code waarschijnlijk, maar 4 categoriëen met elk 4 vragen maakt 16 vragen en geen 20. ;)
Misschien waren de getallen hexadecimaal en was hij vergeten te melden dat alle vragen in 2 talen beschikbaar zijn. 0x04 * 0x04 = 0x10, 0x10 * 0x02 = 0x20.

Maar je hebt nu 1 tabel met alle data in, heb je ooit iets gedaan aan normaliseren? Je kan nu uiteraard eerst de data converten in een multidimensionale array en deze door middel van een foreach uitlezen en tonen.

[ Voor 13% gewijzigd door lauwsa op 22-05-2014 17:30 ]


Acties:
  • 0 Henk 'm!

  • PsychoMantis_NL
  • Registratie: Juli 2011
  • Laatst online: 05:28

PsychoMantis_NL

PSN: PsychoMantis_NL

Ms_Hyde schreef op donderdag 22 mei 2014 @ 12:41:
Bedankt. Mijn PHP is roestig, ik doe meestal front-end. Kan je een voorbeeld geven van de foreach? Daar loop ik vast.
PHP:
1
2
3
4
5
6
7
8
foreach ($categorie = $catId -> $CategorieAntwoorden)
{
     echo 'de categorie is '. $CatId. '<br/>';
     foreach ($CategorieAntwoorden = $vraag -> $antwoord)
     {
          echo 'je antwoord op vraag '. $vraag. ' was '. $antwoord. '<br/>';
     }
}


Zoiets?

In plaats van het "echo'en" kun je dan gewoon de antwoorden tellen en voila

[ Voor 7% gewijzigd door PsychoMantis_NL op 22-05-2014 18:52 ]

PsychoMantis_NL @ Battlefield || Red Dead Redemption || GTA V


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
gebruik je in een front-end geen php dan?

Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Sorry, foutje, het zijn 5 vragen per categorie.

Bij de huidige code dat het formulier genereerd geeft ie maar 1 malig de categorie. Ik moet bedenken hoe ik per vraag de categorie aangeef zodat ik het code van @PsychoMantis_NL kan proberen. Ik heb nu een foreach $key $value staan om de resultaten te zien bij submit. Dus ik kan zien dat de categorie maar 1 keer aangegeven word en niet per vraag.

En @P.O. Box bij het omzetten van een design in reponsive HTML/CSS/SASS gebruik ik geen ingewikkeld PHP, nee :-) Behalve wat kleine stukken hier en daar voor WordPress.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

P.O. Box schreef op donderdag 22 mei 2014 @ 19:38:
gebruik je in een front-end geen php dan?
Frontend-developers zijn over het algemeen bezig met HTML, styling en clienside scripting, dus nee. ;)
Ms_Hyde schreef op vrijdag 23 mei 2014 @ 10:58:
Bij de huidige code dat het formulier genereerd geeft ie maar 1 malig de categorie. Ik moet bedenken hoe ik per vraag de categorie aangeef zodat ik het code van @PsychoMantis_NL kan proberen. Ik heb nu een foreach $key $value staan om de resultaten te zien bij submit. Dus ik kan zien dat de categorie maar 1 keer aangegeven word en niet per vraag.
Ik heb je in mijn post hierboven al laten zien hoe je de toekenning kan doen, PsychoMantis_NL laat even later zien hoe je het moet gebruiken. Dan ben je er toch? :)

[ Voor 54% gewijzigd door NMe op 23-05-2014 11:14 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op vrijdag 23 mei 2014 @ 11:12:
Frontend-developers zijn over het algemeen bezig met HTML, styling en clienside scripting, dus nee. ;)
In clienside scripting heb je echter ook vaak genoeg te maken met (al dan niet nested) for-lussen etc. Het concept is eender, be it PHP of JS :)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • PsychoMantis_NL
  • Registratie: Juli 2011
  • Laatst online: 05:28

PsychoMantis_NL

PSN: PsychoMantis_NL

Ik zit nu even je formulier nog eens door te lezen, en het is logisch dat je categorie slechts eenmaal ge-output wordt, en wel de categorie van de laatste vraag die is beantwoord.

Doordat je alles in 1 while doet i.v.m. het willekeurig weergeven, geef je per rij een input type="hidden" mee met daarin de categorie, alleen noem je deze ook categorie, en die wordt dus overschreven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<form action="" method="post">
     <input type="hidden" name="categorie" value="1">
     <input type="hidden" name="categorie" value="2">
     <input type="hidden" name="categorie" value="3">
     <input type="hidden" name="categorie" value="4">
     <input type="submit" name="submit">
</form>

if(isset($_POST['submit']))
{
     print_r($_POST);

     // Geeft : 
     //     Array(
     //          categorie => 4
     //          submit => Query verzenden
     //     )
}


Ik kan er naast zitten, maar volgens mij ontkom je niet aan een tussenstap c.q. "vieze" oplossing als je achteraf weer wilt groeperen op categorie.

Je moet er namelijk voor zorgen dat ieder $_POST veld een unieke naam krijgt, en dat kan via de hidden fields alleen door het categorie ID mee te geven i.c.m. het ID van de vraag, of alleen het ID van de vraag, en dan op de pagina waarop je de data verwerkt de boel exploden/preg_matchen.

Of je laat de categorie (en dus ook je hidden fields) in je 1e stap varen, en op de pagina waarop je de boel verwerkt query je per vraag nog een keer in welke categorie die vraag valt, dan kun je de antwoorden op die manier aan een categorie toerekenen.

Ik zou zeggen dat de 2e oplossing - stuk voor stuk de vragen langslopen en query'en in welke categorie zij vallen - de meest logische is, aangezien je bij de hidden fields per veld ook nog een explode/preg_match o.i.d. uit moet voeren, puur en alleen om een cijfertje te vinden.

Correct me if I'm wrong, maar ik denk dat daar je probleem zit ;)

Edit:
Bovenstaande houdt in dat je dus niet met een dubbele loop hoeft te werken. Ik weet niet hoe de rest je vraag gelezen heeft, maar op mij kwam het in eerste instantie over dat alle data rechtstreeks uit de database kwam. Maar aangezien je de data post, en niet uitleest gaat die vlieger dus niet op.

[ Voor 36% gewijzigd door PsychoMantis_NL op 23-05-2014 19:14 . Reden: Rotzooi verwijderd :+ ]

PsychoMantis_NL @ Battlefield || Red Dead Redemption || GTA V


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
@PsychoMantis_NL Ik was al begonnen met de category samen voegen met de vraag antwoord in de radio value.

PHP:
1
2
3
4
5
6
7
8
<span class="radio">
        <label><input type="radio" name="<? echo "vraag-".$question['q_id']; ?>" value="<? echo $answer1."-".$question['cat_id']; ?>" /></label>
        <label><input type="radio" name="<? echo "vraag-".$question['q_id']; ?>" value="<? echo $answer2."-".$question['cat_id']; ?>" /></label>
        <label><input type="radio" name="<? echo "vraag-".$question['q_id']; ?>" value="<? echo $answer3."-".$question['cat_id']; ?>" /></label>
        <label><input type="radio" name="<? echo "vraag-".$question['q_id']; ?>" value="<? echo $answer4."-".$question['cat_id']; ?>" /></label>
        <label><input type="radio" name="<? echo "vraag-".$question['q_id']; ?>" value="<? echo $answer5."-".$question['cat_id']; ?>" /></label>
          </span>
         </div>


En dan met explode () uit elkaar halen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (isset($_POST['submit'])) {
        
        foreach ($_POST as $key => $value) {
        
        $value = $antwoord;

        $antwoord = explode("-",$antwoord);  //https://forums.adobe.com/thread/582094
        
        

        $score = $antwoord[0]; 

        $cat_id = $antwoord[1]; 
        
        echo "het antwoord van".$cat_id." is ". $score;
               
           }
           
                  
       }


Alleen krijg ik hierbij het volgende error:

Warning: explode() expects parameter 2 to be string, array given in /Applications/XAMPP/xamppfiles/htdocs/leerstijlen/gegevens.php on line 57


De vragen staan idd in de database samen met hun behorende categorie. De totaal van de antwoorden per categorie moeten daarna ook opgeslagen worden.

Gebruiker A wordt dan in tabel opgeslagen met naam en email en de antwoorden moet ik nog bedenken hoe ik dat indeel in tabellen. Aan het eind van het eind van de quiz moet de gebruiker dus kunnen zien, iets in de trand van "Je bent het meest een (hoogste score), gevolgd door (tweede score)... etc etc.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ten eerste zegt die foutmelding precies wat het probleem is: de tweede parameter moet een string zijn, maar jij stopt er een array in. Als je voor de grap een var_dump($antwoord) zou doen, dan zou je dat gezien hebben. ;) Ten tweede zijn er betere manieren om arraystructuren door te geven vanuit forms, namelijk: array. Zie bijvoorbeeld http://davidwalsh.name/checkbox-form-input-arrays.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Je zou ook de html input elementen een [] achter de naam kunnen geven. Dan wordt het al gepost als array.

voorbeeld:
HTML:
1
2
3
4
5
6
7
8
<input id="question1-1" type="radio" name="category1[]" value="1" /><label for="question1-1">Je tekst 1</label>
<input id="question1-2" type="radio" name="category1[]" value="2" /><label for="question1-2">Je tekst 2</label>
...
<input id="question2-1" type="radio" name="category2[]" value="1" /><label for="question2-1">Je tekst 1</label>
<input id="question2-2" type="radio" name="category2[]" value="2" /><label for="question2-2">Je tekst 2</label>
...
<input id="question3-1" type="radio" name="category1[]" value="1" /><label for="question3-1">Je tekst 1</label>
<input id="question3-2" type="radio" name="category1[]" value="2" /><label for="question3-2">Je tekst 2</label>


$_POST['category1'] zal dan de geselecteerde waarden van vraag 1 en 3 bevatten

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat zei ik al in mijn vorige post. En als je toch al met arrays werkt zou je een beetje raar bezig zijn als je category1[] gebruikt en niet category[1][]. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 01:01

Tribits

Onkruid vergaat niet

Heb er even mee zitten spelen en een versie met en zonder arrays in elkaar gepriegeld. Leek hier op zich wel aardig te werken maar commentaar/kritiek is natuurlijk altijd welkom.

Uitwerking met arrays:

PHP: vragen.php
1
2
3
4
5
6
7
8
9
10
<?php while ($question = $result->fetch_assoc()) {   ?>
<div class="question-line">
        <label for="question"><?php echo $question['question']; ?></label>
        <input type="hidden" name="category[<?php echo $question['q_id']; ?>]" value="<?php echo $question['cat_id']; ?>" />
        <span class="radio">
        <?php for ($i = 0; $i < 5 ; $i++) {?>
               <label><input type="radio" name="answer[<?php echo $question['q_id']; ?>]" value="<?php echo 4-$i; ?>" /></label>
        <?php } ?>
        </span>
</div>


PHP: gegevens.php
1
2
3
4
5
6
<?php foreach ($_POST["category"] as $key => $value) {
        echo "Question " . $key . "<br>";
        echo "Category " . $value . "<br>";
        echo (is_null($_POST["answer"][$key]) ? "Unanswered" : "Answer " . $_POST["answer"][$key]) . "<br><br>";
}
?>


Uitwerking zonder arrays:

PHP: vragen.php
1
2
3
4
5
6
7
8
9
10
<?php while ($question = $result->fetch_assoc()) {   ?>
<div class="question-line">
        <label for="question"><?php echo $question['question']; ?></label>
        <input type="hidden" name="category<?php echo $question['q_id']; ?>" value="<?php echo $question['cat_id']; ?>" />
        <span class="radio">
        <?php for ($i = 0; $i < 5 ; $i++) {?>
               <label><input type="radio" name="<?php echo $question['q_id']; ?>" value="<?php echo 4-$i; ?>" /></label>
        <?php } ?>
        </span>
</div>


PHP: gegevens.php
1
2
3
4
5
6
<?php for($i=1; $i<=20; $i++){
        echo "Question " . $i . "<br>";
        echo "Category " . $_POST["category" . $i] . "<br>";
        echo (is_null($_POST[$i]) ? "Unanswered" : "Answer " . $_POST[$i]) . "<br><br>";
}
?>

Master of questionable victories and sheer glorious defeats


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Bedankt @Tribits! De uitwerking met arrays heeft geholpen.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Begrijp je ook waarom 't werkt en wat het doet? Anders schiet je er natuurlijk nog niks mee op. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Ja, het is duidelijk. Ik heb tevens ook meer zitten lezen over foreach en arrays. Ik ben iemand die door goede real case voorbeelden leert, met standaard voorbeelden op php.net kom ik maar zover mee.

Ben nu aan het tweede gedeelte van het script. count answers per categorie. Categorie 1, totaal score is 10. etc, etc.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70

Pagina: 1